WebMagic的架构设计参照了Scrapy,而实现则应用了HttpClient、Jsoup等Java成熟的工具。

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操作的入口,它封装了爬虫的创建、启动、停止、多线程等功能

使用 Maven来安装WebMagic

<dependency><groupId>us.codecraft</groupId><artifactId>webmagic-core</artifactId><version>0.7.3</version>
</dependency>
<dependency><groupId>us.codecraft</groupId><artifactId>webmagic-extension</artifactId><version>0.7.3</version>
</dependency>


WebMagic使用slf4j-log4j12作为slf4j的实现.如果你自己定制了slf4j的实现,需要项目中去掉此依赖。

<dependency><groupId>us.codecraft</groupId><artifactId>webmagic-extension</artifactId><version>0.7.3</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions>
</dependency>

如果不使用Maven的话,可以去http://webmagic.io中下载最新的jar包,下载之后进行解压,然后在项目中import即可。


开始开发第一个爬虫

项目中添加了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();@Overridepublic void process(Page page) {System.out.println(page.getHtml());}@Overridepublic 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 pagepage.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());}@Overridepublic 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: 爬虫程序的入口,Spider的其他组件(Downloader、Scheduler、Pipeline)都可以通过set方法来进行设置。

Site: 对站点本身的一些配置信息,例如编码、HTTP头、超时时间、重试策略等、代理等,都可以通过设置Site对象来进行配置。

配置http代理,在0.7.1版本开始,WebMagic开始使用了新的代理APIProxyProvider,因为相对于Site的“配置”,ProxyProvider定位更多是一个“组件”,所以代理不再从Site设置,而是由HttpClientDownloader设置。

更多内容见官方文档。


页面元素的抽取

WebMagic里主要使用了三种数据抽取技术:

  • XPath
  • 正则表达式
  • CSS选择器
  • 另外,对于JSON格式的内容,可使用JsonPath进行解析

使用Pipeline保存结果

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提交等方式。


Java爬虫框架WebMagic相关推荐

  1. JAVA 爬虫框架webmagic 初步使用Demo

    一想到做爬虫大家第一个想到的语言一定是python,毕竟python比方便,而且最近也非常的火爆,但是python有一个全局锁的概念新能有瓶颈,所以用java还是比较牛逼的, webmagic 官网 ...

  2. java爬虫框架—WebMagic

    什么是网络爬虫 从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分.爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满 ...

  3. Java爬虫框架WebMagic简介及使用

    一.介绍 ​ webmagic的是一个无须配置.便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫.webmagic采用完全模块化的设计,功能覆盖整个爬虫的生命周期(链接提取 ...

  4. java爬虫框架(java爬虫框架webmagic)

    Java页面框架有哪些呢? 主要应用技术:EJB等出处:java.sun.com/blueprints/code/index.简述:这是SUN在展示J2EE平台时所用的例子PetStore(宠物商店系 ...

  5. JAVA爬虫框架WebMagic爬取ajax请求的页面数据

    查看WebMagic文档:http://webmagic.io/docs/zh/posts/ch1-overview/ 爬取网址需要翻墙: https://www.reddit.com/r/funny ...

  6. java爬虫框架之webMagic

    webMagic框架 前言 介绍 案例 控制类: 解析类: 持久化类: 用到的工具类以及配置类: 注意事项 后语 前言 文章仅供安全领域的朋友学习使用!! 严禁做违法违纪的事情,责任自负 介绍 Web ...

  7. Java爬虫框架wemgic_Java爬虫框架-WebMagic挖坑补坑指南

    以前总是用的Python下的Scrapy和crawley和PHP的小众爬虫框架,最近突然想到了何不用下Java下的框架试试? 查了下Java下的爬虫框架自然也不在少数,Nutch,WebMagic,W ...

  8. Java爬虫框架之WebMagic的学习总结

    Java爬虫框架之WebMagic WebMagic 概述 特性 架构 四大组件 数据流转对象 控制爬虫运转的引擎Spider WebMagic的基本使用 添加WebMagic的核心与扩展依赖 爬虫实 ...

  9. 爬虫框架webmagic与spring boot的结合使用--转

    原文地址:http://www.jianshu.com/p/c3fc3129407d 1. 爬虫框架webmagic WebMagic是一个简单灵活的爬虫框架.基于WebMagic,你可以快速开发出一 ...

最新文章

  1. Sandcastle是微软提供的一个根据XML注释和DLL文件生成帮助文件的工具
  2. 基于空间相关的图像模板匹配及MATLAB实现
  3. 这样的递归调用,你看出来了?
  4. 前端常见的安全性问题有哪些?
  5. PHP数据结构之三 线性表中的单链表的PHP实现
  6. 【汇编语言】记录一组数中负数的个数,8086与MIPS汇编程序
  7. 每日一学:如何用matplotlib展示图片
  8. 用python写的翻译器
  9. 集成电路模拟版图入门-版图基础学习笔记(四)
  10. DHTMLX Suite 7.1.10 Crack
  11. Redis布隆过滤器和布谷鸟过滤器
  12. js使用微信上传图片功能
  13. 双光耦开关电源电路图_开关电源中的光耦典型电路设计分析
  14. 鸿蒙的物联网世界之我的一天
  15. aimp输出dsd_极客评论:音乐播放器AIMP 2
  16. TensorFlow练手项目二:基于循环神经网络(RNN)的古诗生成器
  17. idea如何配置或者创建mybatis的xml文件 idea如何配置或者创建mybatis的配置文件
  18. 【读书笔记】《博弈论》
  19. 扩展显示器失败:“显示信号输入超出范围“问题解决方案
  20. 【JAVA 文件概述】

热门文章

  1. OriginPro,如何把软件Origin切换变成中文显示
  2. 【python图像处理】图像灰度化处理、图像灰度线性变换、图像灰度非线性变换
  3. 全空间视频融合---学习之路(一)--直线提取检测--投影纹理--相机姿态标定
  4. U盘启动快捷键查询列表
  5. 同时删除多个 Txt 文本文档的最后几行
  6. 编译原理实验一 词法分析程序设计与实现
  7. CodeGear2007到CodeGear2009全系列自动破解工具更新到v1.0.0.237
  8. OpenGL ES简介及几个相关重要概念
  9. 经验模态分解法简析(转)
  10. C# 使用一个timer实现转圈圈屏保