欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

简单的例子

程序员文章站 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()则将这些链接加入到待抓取的队列中去。
相关标签: webmagic