简单的例子
程序员文章站
2022-07-14 08:29:57
...
package com.rose.msg.page; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.processor.PageProcessor; /** * 建造师 * * @author liyixing * */ public class BuilderPageProcessor implements PageProcessor { /** * 部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等 */ private Site site = Site.me().setRetryTimes(3).setSleepTime(100); /** * process是定制爬虫逻辑的核心接口,在这里编写抽取逻辑 */ @Override public void process(Page page) { // 部分二:定义如何抽取页面信息,并保存下来 page.putField( "name", page.getHtml().xpath( "//div[@class='addProject']//table//td/a/tidyText()")); System.out.println(page.getResultItems().get("name")); // 部分三:从页面发现后续的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 BuilderPageProcessor()) // 从"某个地址再试抓取"开始抓 .addUrl("http://location/outQualificationQuery") // 开启5个线程抓取 .thread(5) // 启动爬虫 .run(); } }
爬虫的配置
第一部分关于爬虫的配置,包括编码、抓取间隔、超时时间、重试次数等,也包括一些模拟的参数,例如User Agent、cookie,以及代理的设置
页面元素的抽取
第二部分是爬虫的核心部分:对于下载到的Html页面,你如何从中抽取到你想要的信息?WebMagic里主要使用了三种抽取技术:XPath、正则表达式和CSS选择器。另外,对于JSON格式的内容,可使用JsonPath进行解析。
XPath
XPath本来是用于XML中获取元素的一种查询语言,但是用于Html也是比较方便的。例如:
page.getHtml().xpath( "//div[@class='addProject']//table//td/a/tidyText()"));
CSS选择器
CSS选择器是与XPath类似的语言。如果大家做过前端开发,肯定知道$('h1.entry-title')这种写法的含义。客观的说,它比XPath写起来要简单一些,但是如果写复杂一点的抽取规则,就相对要麻烦一点。个人觉得更想jQuery的选择器。
正则表达式
正则表达式则是一种通用的文本抽取语言
page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());
JsonPath
JsonPath是于XPath很类似的一个语言,它用于从Json中快速定位一条内容。WebMagic中使用的JsonPath格式可以参考这里:https://code.google.com/p/json-path/
page.getHtml().jsonPath("");
链接的发现
有了处理页面的逻辑,我们的爬虫就接近完工了!
但是现在还有一个问题:一个站点的页面是很多的,一开始我们不可能全部列举出来,于是如何发现后续的链接,是一个爬虫不可缺少的一部分。
page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());
这段代码的分为两部分,page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all()用于获取所有满足"(https:/ /github\.com/\w+/\w+)"这个正则表达式的链接,page.addTargetRequests()则将这些链接加入到待抓取的队列中去。