MagicWeb笔记二
来源:互联网 发布:手机酷狗4g连不上网络 编辑:程序博客网 时间:2024/05/01 05:16
集搜客操作过程:http://www.gooseeker.com/doc/article-143-1.html
第一步:(整理箱)建立一个存储数据文件夹
Webmagic爬虫:
官网: http://webmagic.io/
使用文档http://webmagic.io/docs/zh/posts/ch1-overview/README.html
设计文档http://www.oschina.net/p/webmagic
WebMagic所需Jar包:http://webmagic.io/download.html
一、设计思想
参考Scrapy,实现由HttpClient,Jsoup等Java工一句话用Java实现
组件:Downloader、pageProcessor、Scheduler、Pipeline组件合并完成多线程的任务。以实现对爬虫的功能进行定制。
核心:webmagic-core包中。其他包则是该包的扩展
实用:虽然核心功能简单,但也有自己的扩展方式,如基于注解模式的爬虫开发
二、核心组件
Downloader:加载页面。负责从互联网上下载页面,以便后面处理。WebMagic默认使用了Apache HttpClient作为下载工具;
PageProcessor:抽取数据。负责解析页面,抽取有用信息,以发现新的链接。WebMagic使用作为HTML解析工具,并基于其开发了解析XPath的工具Xsoup。
在这四个组件中,PageProcessor对于每个站点每个页面都不一样,是需要使用者定制的部分
Scheduler:数据管理以及数据。负责管理待抓取的URL,以及一些去重的工作。WebMagic默认提供了JDK的内存队列来管理URL,并用集合来进行去重。也支持使用Redis进行分布式管理。
除非项目有一些特殊的分布式需求,否则无需自己定制scheduler。
Pipeline:数据保存。负责抽取结果的处理,包括计算、持久化的文件、数据库等。WebMagic默认提供了“输出到控制台”和“保存大文件”两种处理法案。
Pipeline定义了结果保存的方式,如果要保存到指定的数据库,则需要编写对应的pipeline。对于一般需求值编写一个pipeline。
三、数据流转的对象
1. request
对URL地址的一层封装,一个Request对应一个URL地址。
他是PageProcessor与Downloader交互的载体,也是PageProcessor控制Downloader唯一方式。
除了URL本身外,它还包含一个Key-Value结构的字段extra。你可以在extra中保存一些特殊的属性,然后在其他地方读取。为完成不同的功能。例如附加上一个页面的一些信息等。
2. Page
Page 代表了从Downloader下载到一个页面----可能是HTML,也可能是JSON 或者其他文本格式的内容。
Page是WebMagic抽取过程中的核心对象,它提供了一些方法可供抽取、结果保存等。
3. ResultIterns
它相当于一个Map,保存PageProcesser处理的结果、提供Pipeline使用。它的API与Map类似,值得注意的是它有一个字段skip
,若设置为true,则不应被Pipeline处理。
四、爬虫运转引擎---Spider
Spider是WebMagic内部流程的核心。D(Downloader)-P(PageProcessor)-S(Scheduler)-P(Pipeline)都是Spider的一个属性,这些属性都可以自由设置,以实现不同的功能。Spider也是WebMagic操作的入口,它封装了爬虫的创建、启动、停止、多线程等功能。
五.使用注释编写爬虫
引入webmagic-extension包即可使用此功能
开发方式:
1. 定义需要抽取的数据,并编写类
2. 在类中写明@TargetUrl注释,定义对那些URL进行下载和抽取
3. 在类的字段上加上@ExtactBy注释,定义这个字段使用什么方式进行抽取
4. 定义结果的存储方式
核心代码:
@TargetUrl("https://github.com/\\w+/\\w+")
@HelpUrl("https://github.com/\\w+")
publicclassGithubRepo {
@ExtractBy(value="//h1[@class='entry-titlepublic']/strong/a/text()", notNull =true)
privateStringname;
@ExtractByUrl("https://github\\.com/(\\w+)/.*")
privateStringauthor;
@ExtractBy("//div[@id='readme']/tidyText()")
privateStringreadme;
publicstaticvoid main(String[]args) {
OOSpider.create(Site.me().setSleepTime(1000)
, new ConsolePageModelPipeline(), GithubRepo.class)
.addUrl("https://github.com/code4craft").thread(5).run();
}
}
1.定义URL
HelpUrl/TargetUrl是非常有效的爬虫开发模式,TargetUrl最终的要爬去的URL即是目标URL
HelpURL则是为了发现目标URL,而需要访问的URL。过度URL
对于博客页,HelpURL是列表页,TargetURL是文章页。
对于论坛,HelpURL是帖子列表,TargetURL是帖子详情
2.抽取数据
@ExtractBy是一个抽取元素的注释,他描述了一种抽取规则
注释主要作用于字段,他表示“使用这个抽取规则,将抽取到的结果保存到这个字段中‘。
@ExtractBy("//div[@id='readme']/tidyText()");private String readme;
这里"//div[@id='readme']/text()"是一个XPath表示的抽取规则,而抽取到的结果则会保存到readme字段中。
4. 多结果抽取
如在美食网站中抽取用户名和优惠信息怎么办呢?
在类上使用@ExtractBy注释可以解决在此问题。
使用方式:受用这个结果抽取一个区域,让这块区域对应一个结果。
@ExtractBy(value ="//ul[@id=\"promos_list2\"]/li",multi = true)
public classQQMeishi {
……
}
六.完整流程
1.创建和启动
采用注入模式:入口OOSpider(OO:面向对象编程)继承了Spider并提供了创建和启动方法以及定义了处理结果的方式
核心代码:
publicstatic OOSpider create(Site site, PageModelPipeline pageModelPipeline, Class...pageModels);
2. PageModelPipeline
PageModelPipeline是注释模式下处理结果的类,通过实现它,可以自定义结果处理方式
核心代码:
public interface PageModelPipeline<T> {
public void process(T t, Task task);
}
PageModelPipeline与Model类是对应的,多个Model可以对应一个PageModelPipeline
3、AfterExtractor
注入模式无法满足所有需求,可通过写代码完成,需要用到AfterExtractor接口。
核心代码:
publicinterface AfterExtractor {
public void afterProcess(Page page);
}
七.成功跑起来的Demo
https://github.com/code4craft/webmagic/tree/master/webmagic-samples/src/main/java/us/codecraft/webmagic/samples
jar:D:\Java\Spider_JAR\0.5.2
Xpath(XML路径语言XML Path Language)学习文档1:http://www.cnblogs.com/gaojun/archive/2012/08/11/2633908.html
文档2:http://webmagic.io/docs/zh/posts/ch4-basic-page-processor/xsoup.html
xpath的用法:例如如果链接在:
<divclass='a'>
<span class='b'><ahref='xxx'></a></span>
</div>
xpath写法:page.getHtml().xpath("//div[@class='a']/span[@class='b']/a/@href").get();
八.数据抓取案例
java爬虫webmagic 案例爬取动态(ajax+js)网站京东售价格链接:
http://www.thinksaas.cn/topics/0/491/491725.html
九.遇到困难
在分页抓取京东手机正则表达式匹配手机URL时遇到难点:
如http://list.jd.com/list.html?cat=9987,653,655&page=2&JL=6_0_0&ms=5#J_main
正则匹配:
注意点:URL中“?”-->正则匹配\\?
不小于一位数的匹配:字符之间要转义“page=1&JL”--->正则匹配 page=\\d+\\&JL
http://list.jd.com/list.html\\?cat=9987,653,655&page=\\d+\\&JL=6_0_0&ms=5#J_main
对讲机: http://list.jd.com/list.html?cat=9987,653,659&page=1&JL=6_0_0&ms=5#J_main
笔记本:
http://list.jd.com/list.html?cat=670,671,672&page=1&go=0&JL=6_0_0&ms=6#J_main
平板电视:
http://list.jd.com/list.html?cat=737,794,798&page=1&JL=6_0_0#J_main
空调:
http://list.jd.com/list.html?cat=737,794,870&page=1&JL=6_0_0#J_main
冰箱:
http://list.jd.com/list.html?cat=737,794,878&page=1&JL=6_0_0#J_main
- MagicWeb笔记二
- 笔记二
- 笔记二
- 笔记二
- 笔记二
- wap 开发笔记 (二)
- JDBC学习笔记(二)
- JDBC学习笔记(二)
- CSS学习笔记二
- ArcXML学习笔记(二)
- C#学习笔记(二)
- AIX学习笔记(二)
- VC++ 学习笔记(二)
- symbian学习笔记二
- AspectJ学习笔记(二)
- oracle笔记二
- 工作流开发笔记二
- XSL学习笔记(二)
- (OK) Creating manually one VMs from an existing VDI file in CLI (VBoxManage) in Fedora 23
- Android Context完全解析,你所不知道的Context的各种细节
- Spring MVC之@RequestBody, @ResponseBody 详解
- BigDecimal工具类
- 关于java的static的疑问
- MagicWeb笔记二
- 初学CentOS——进程管理基本命令
- Tomcat集群
- Linux环境变量配置文件以及启动顺序
- ubuntu下的截屏工具
- Android 之 IPC 进程通信全解析
- Android 拍照、压缩、水平滚动、删除
- 【Unity教程】Unity中的C#内存管理
- Android Context 上下文 你必须知道的一切