java爬虫抓取动态网页( WebMagic使用slf4j-log4j12测试方法 )

优采云 发布时间: 2022-01-16 08:14

  java爬虫抓取动态网页(

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=&#39;entry-title public&#39;]/strong/a/text()").toString());

if (page.getResultItems().get("name") == null) {

//skip this page

page.setSkip(true);

}

page.putField("readme", page.getHtml().xpath("//div[@id=&#39;readme&#39;]/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("{&#39;id&#39;:1}","utf-8"));

  HttpRequestBody内置多种初始化方法,支持最常见的表单提交、json提交等方法。

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线