具体详细信息参见 http://webmagic.io/
PageProcessor的实现:
实现PageProcessor接口即可。
在里面可以定制自己的爬虫规则
Webmagic的页面抓取过程也就是PageProcessor分为三个部分:
1.设置抓取器的参数:如重复次数,重复事件等等
2.设置抓取规则:也就是给你一个Html页面你要抓取其中的哪些信息
3.从当前的页面找没有访问过的连接,加入到抓取队列,等待抓取
public class GithubRepoPageProcessor implements PageProcessor { // 部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等 private Site site = Site.me().setRetryTimes(3).setSleepTime(1000); @Override // process是定制爬虫逻辑的核心接口,在这里编写抽取逻辑 public void process(Page page) { // 部分二:定义如何抽取页面信息,并保存下来 page.putField("author", page.getUrl().regex("https://github\\.com/(\\w+)/.*").toString()); page.putField("name", page.getHtml().xpath("//h1[@class=‘entry-title public‘]/strong/a/text()").toString()); if (page.getResultItems().get("name") == null) { //skip this page page.setSkip(true); } page.putField("readme", page.getHtml().xpath("//div[@id=‘readme‘]/tidyText()")); // 部分三:从页面发现后续的url地址来抓取 page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all()); } @Override public Site getSite() { return site; } public static void main(String[] args) { Spider.create(new GithubRepoPageProcessor()) //从"https://github.com/code4craft"开始抓 .addUrl("https://github.com/code4craft") //开启5个线程抓取 .thread(5) //启动爬虫 .run(); } }
Selectable接口是什么:
实现Selectable接口就可以完成页面元素的链式抽取
page.getHtml()返回的是Html对象,这个Html类实现了Selectable接口,就可以继续抽取
也就是可以直接在page.getHtml().xxx().xxx() 这样链式的抽取元素
获取结果:
如果抽取完毕得到自己想要的东西的话,就可以用get方法或者toString方法来获取结果
get()返回字符串
toString()返回字符串
all()返回所有抽取结果
match()返回boolean值,代表是否有匹配结果
保存结果:
上面的过程已经可以得到想要的结果了,现在就需要对这些结果做处理
选择,是输出出来呢,还是保存到数据库,还是保存到文件中。
就用到了Pipeline这个组件
这个组件就是负责指定结果的去向
比如从控制台输出结果,就是用ConsolePipeline来保存的
如果想要把他存放在某个目录,按照以下的代码做就行,非常方便
public static void main(String[] args) { Spider.create(new GithubRepoPageProcessor()) //从"https://github.com/code4craft"开始抓 .addUrl("https://github.com/code4craft") .addPipeline(new JsonFilePipeline("D:\\webmagic\\")) //开启5个线程抓取 .thread(5) //启动爬虫 .run(); }
爬虫的配置:
Spider是一个类,这个类是爬虫启动的入口
需要给他的create方法传入一个策略 也就是PageProcessor的实现
然后配置
然后.run()运行
网站的配置:
对于站点本身有一些配置信息
比如有的站点需要登录,就要设定cookie
所以用Site对象类配置一个站点所需的各种属性。
爬虫的监控:
查看爬虫的执行状况
看有多少页面,已经得到了多少页面
通过JMX实现
可以使用Jconsole等工具来查看
可以很方便的添加一个监控
SpiderMonitor.instance().register(oschinaSpider);
SpiderMonitor.instance().register(githubSpider);
WebMagic的组件:
四个,PageProcessor,Schedule,Downloader,Pipline
分别都可以定制
定制Pipline:
实现Pipline接口即可
已经提供了几个默认的Pipline
ConsolePipeline | 输出结果到控制台 | 抽取结果需要实现toString方法 |
FilePipeline | 保存结果到文件 | 抽取结果需要实现toString方法 |
JsonFilePipeline | JSON格式保存结果到文件 | |
ConsolePageModelPipeline | (注解模式)输出结果到控制台 | |
FilePageModelPipeline | (注解模式)保存结果到文件 | |
JsonFilePageModelPipeline | (注解模式)JSON格式保存结果到文件 | 想要持久化的字段需要有getter方法 |
定制Scheduler
Scheduler是对于URL进行管理的组件
可以对URL队列去重
现有的Scheduler
DuplicateRemovedScheduler | 抽象基类,提供一些模板方法 | 继承它可以实现自己的功能 |
QueueScheduler | 使用内存队列保存待抓取URL | |
PriorityScheduler | 使用带有优先级的内存队列保存待抓取URL | 耗费内存较QueueScheduler更大,但是当设置了request.priority之后,只能使用PriorityScheduler才可使优先级生效 |
FileCacheQueueScheduler | 使用文件保存抓取URL,可以在关闭程序并下次启动时,从之前抓取到的URL继续抓取 | 需指定路径,会建立.urls.txt和.cursor.txt两个文件 |
RedisScheduler | 使用Redis保存抓取队列,可进行多台机器同时合作抓取 | 需要安装并启动redis |
可以单独定义去重的策略
HashSetDuplicateRemover | 使用HashSet来进行去重,占用内存较大 |
BloomFilterDuplicateRemover | 使用BloomFilter来进行去重,占用内存较小,但是可能漏抓页面 |