java爬虫抓取动态网页( WebMagic使用slf4j-log4j12测试方法 )
优采云 发布时间: 2022-01-16 08:14java爬虫抓取动态网页(
WebMagic使用slf4j-log4j12测试方法
)
<p>WebMagic的架构设计参照了Scrapy,而实现则应用了HttpClient、Jsoup等Java成熟的工具。<br />
<br /> WebMagic由四个组件(Downloader、PageProcessor、Scheduler、Pipeline)构成:Downloader : 下载器PageProcessor: 页面解析器Scheduler: 任务分配、url去重Pipeline:数据存储、处理
WebMagic数据流转的对象:
Request : 一个Request对应一个URL地址 。它是是PageProcessor控制Downloader唯一方式。Page : 代表了从Downloader下载到的内容ResultItems : 相当于一个Map,它保存PageProcessor处理的结果,供Pipeline使用。
爬虫引擎–Spider:
Spider是WebMagic内部流程的核心,上面的四个组件都相当于Spider的一个属性,通过设置这个属性可以实现不同的功能。Spider也是WebMagic操作的入口,它封装了爬虫的创建、启动、停止、多线程等功能
<a id="_MavenWebMagic_26"></a>使用 Maven来安装WebMagic
us.codecraft
webmagic-core
0.7.3
us.codecraft
webmagic-extension
0.7.3
</p>
WebMagic 使用 slf4j-log4j12 作为 slf4j 的实现。如果自己自定义slf4j的实现,需要从项目中去掉这个依赖。
us.codecraft
webmagic-extension
0.7.3
org.slf4j
slf4j-log4j12
如果你不使用Maven,可以去下载最新的jar包,下载后解压,然后导入到项目中。
开始开发第一个爬虫
在项目中添加WebMagic的依赖后,就可以开始第一个爬虫的开发了!
下面是一个测试,点击main方法,选择“运行”看看是否正常运行。
package com.example.demo;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
public class DemoPageGet implements PageProcessor {
private Site site = Site.me();
@Override
public void process(Page page) {
System.out.println(page.getHtml());
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
Spider.create(new DemoPageGet()).addUrl("http://httpbin.org/get").run();
}
}
编写一个基本的爬虫
在WebMagic中,实现一个基本的爬虫只需要写一个实现PageProcessor接口的类。
这一部分我们通过GithubRepoPageProcessor的例子直接介绍PageProcessor的编写方式。
PageProcessor的定制分为爬虫配置、页面元素提取和链接发现三个部分。
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();
}
}
附加请求的链接
首先,通过正则表达式匹配或拼接出链接,例如:page.getHtml().links().regex("").all()
通过 addTargetRequests 方法 page.addTargetRequests(url) 将这些链接添加到要爬取的队列中。
爬虫的配置
Spider:爬虫程序的入口,可以通过set方法设置Spider的其他组件(Downloader、Scheduler、Pipeline)。
Site:站点本身的一些配置信息,如编码、HTTP头、超时、重试策略等,代理等,可以通过设置Site对象来配置。
配置 http 代理。从版本0.7.1开始,WebMagic开始使用新的代理APIProxyProvider,因为ProxyProvider定位更像是一个“组件”而不是Site的“配置”,所以代理不再从站点设置,但由 HttpClientDownloader 设置。
查看官方文档了解更多详情。
页面元素的提取
WebMagic 中使用了三种主要的数据提取技术:
使用管道保存结果
WebMagic 用来保存结果的组件称为管道。
比如我们通过“控制台输出”做的事情,也是通过一个内置的Pipeline来完成的,这个Pipeline叫做ConsolePipeline。
那么,我现在想把结果保存成Json格式,怎么做呢?
我只需要将 Pipeline 的实现替换为“JsonFilePipeline”即可。
public static void main(String[] args) {
Spider.create(new GithubRepoPageProcessor())
//从"https://github.com/code4craft"开始抓
.addUrl("https://github.com/code4craft")
.addPipeline(new JsonFilePipeline("./webmagic"))
//开启5个线程抓取
.thread(5)
//启动爬虫
.run();
}
模拟 POST 请求方法
0.7.1版以后放弃了nameValuePair的老写法,通过在Request对象中添加Method和requestBody来实现。
Request request = new Request("http://xxx/path");
request.setMethod(HttpConstant.Method.POST);
request.setRequestBody(HttpRequestBody.json("{'id':1}","utf-8"));
HttpRequestBody内置多种初始化方法,支持最常见的表单提交、json提交等方法。