简单的例子
程序员文章站
2022-05-02 22:13:23
...
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();
}
}
[b]爬虫的配置[/b]
第一部分关于爬虫的配置,包括编码、抓取间隔、超时时间、重试次数等,也包括一些模拟的参数,例如User Agent、cookie,以及代理的设置
[b]页面元素的抽取[/b]
第二部分是爬虫的核心部分:对于下载到的Html页面,你如何从中抽取到你想要的信息?WebMagic里主要使用了三种抽取技术:XPath、正则表达式和CSS选择器。另外,对于JSON格式的内容,可使用JsonPath进行解析。
[i][b]XPath[/b][/i]
XPath本来是用于XML中获取元素的一种查询语言,但是用于Html也是比较方便的。例如:
page.getHtml().xpath(
"//div[@class='addProject']//table//td/a/tidyText()"));
[i][b]CSS选择器[/b][/i]
CSS选择器是与XPath类似的语言。如果大家做过前端开发,肯定知道$('h1.entry-title')这种写法的含义。客观的说,它比XPath写起来要简单一些,但是如果写复杂一点的抽取规则,就相对要麻烦一点。个人觉得更想jQuery的选择器。
[i][b]正则表达式[/b][/i]
正则表达式则是一种通用的文本抽取语言
page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());
[i][b]JsonPath[/b][/i]
JsonPath是于XPath很类似的一个语言,它用于从Json中快速定位一条内容。WebMagic中使用的JsonPath格式可以参考这里:[url]https://code.google.com/p/json-path/[/url]
page.getHtml().jsonPath("");
[b]链接的发现[/b]
有了处理页面的逻辑,我们的爬虫就接近完工了!
但是现在还有一个问题:一个站点的页面是很多的,一开始我们不可能全部列举出来,于是如何发现后续的链接,是一个爬虫不可缺少的一部分。
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()则将这些链接加入到待抓取的队列中去。
上一篇: 爬取糗事百科[文字]栏前十页