WebMagic in Action

WebMagic是一个简单灵活、便于二次开发的爬虫框架。除了可以便捷的实现一个爬虫,WebMagic还提供多线程功能,以及基本的分布式功能。

你可以直接使用WebMagic进行爬虫开发,也可以定制WebMagic以适应复杂项目的需要。

1. 在项目中使用WebMagic

WebMagic主要包含两个jar包:webmagic-core-{version}.jar和webmagic-extension-{version}.jar。在项目中添加这两个包的依赖,即可使用WebMagic。

1.1 使用Maven

WebMagic基于Maven进行构建,推荐使用Maven来安装WebMagic。在项目中添加以下坐标即可:

us.codecraft

webmagic-extension

0.4.3

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

us.codecraft

webmagic-extension

0.4.3

org.slf4j

slf4j-log4j12

1.2 不使用Maven

不使用maven的用户,可以下载附带二进制jar包的版本(感谢oschina):

git clone http://git.oschina.net/flashsword20/webmagic.git

在lib目录下,有项目依赖的所有jar包,直接在IDE里,将这些jar添加到Libraries即可。

1.3 第一个项目

在你的项目中添加了WebMagic的依赖之后,即可开始第一个爬虫的开发了!我们这里拿一个抓取Github信息的例子:

import us.codecraft.webmagic.Page;

import us.codecraft.webmagic.Site;

import us.codecraft.webmagic.Spider;

import us.codecraft.webmagic.processor.PageProcessor;

public class GithubRepoPageProcessor implements PageProcessor {

private Site site = Site.me().setRetryTimes(3).setSleepTime(100);

@Override

public void process(Page page) {

page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());

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()"));

}

@Override

public Site getSite() {

return site;

}

public static void main(String[] args) {

Spider.create(new GithubRepoPageProcessor()).addUrl("https://github.com/code4craft").thread(5).run();

}

}

点击main方法,选择“运行”,你会发现爬虫已经可以正常工作了!

2.下载和编译源码

WebMagic是一个纯Java项目,如果你熟悉Maven,那么下载并编译源码是非常简单的。如果不熟悉Maven也没关系,这部分会介绍如何在Eclipse里导入这个项目。

2.1 下载源码

WebMagic目前有两个仓库:

github上的仓库保存最新版本,所有issue、pull request都在这里。大家觉得项目不错的话别忘了去给个star哦!

此仓库包含所有编译好的依赖包,只保存项目的稳定版本,最新版本仍在github上更新。oschina在国内比较稳定,主要作为镜像。

无论在哪个仓库,使用

git clone https://github.com/code4craft/webmagic.git

或者

git clone http://git.oschina.net/flashsword20/webmagic.git

即可下载最新代码。

如果你对git本身使用也不熟悉,建议看看@黄勇的 从 Git@OSC 下载 Smart 源码

2.2 导入项目

Intellij Idea默认自带Maven支持,import项目时选择Maven项目即可。

2.2.1 使用m2e插件

安装后,在File->Import中选择Maven->Existing Maven Projects即可导入项目。

导入后看到项目选择界面,点击finish即可。

2.2.2 使用Maven Eclipse插件

如果没有安装m2e插件,只要你安装了Maven,也是比较好办的。在项目根目录下使用命令:

mvn eclipse:eclipse

生成maven项目结构的eclipse配置文件,然后在File->Import中选择General->Existing Projects into Workspace即可导入项目。

导入后看到项目选择界面,点击finish即可。

2.3 编译和执行源码

导入成功之后,应该就没有编译错误了!此时你可以运行一下webmagic-core项目中自带的exmaple:"us.codecraft.webmagic.processor.example.GithubRepoPageProcessor"。

同样,看到控制台输出如下,则表示源码编译和执行成功了!

3. 基本的爬虫

3.1 实现PageProcessor

在WebMagic里,实现一个基本的爬虫只需要编写一个类,实现PageProcessor接口即可。这个类基本上包含了抓取一个网站,你需要写的所有代码。

以之前的GithubRepoPageProcessor为例,我将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();

}

}

3.1.1 爬虫的配置

第一部分关于爬虫的配置,包括编码、抓取间隔、超时时间、重试次数等,也包括一些模拟的参数,例如User Agent、cookie,以及代理的设置,我们会在第5章-“爬虫的配置”里进行介绍。在这里我们先简单设置一下:重试次数为3次,抓取间隔为一秒。

3.1.2 页面元素的抽取

第二部分是爬虫的核心部分:对于下载到的Html页面,你如何从中抽取到你想要的信息?WebMagic里主要使用了三种抽取技术:XPath、正则表达式和CSS选择器。

XPath本来是用于XML中获取元素的一种查询语言,但是用于Html也是比较方便的。例如:

page.getHtml().xpath("//h1[@class='entry-title public']/strong/a/text()")

这段代码使用了XPath,它的意思是“查找所有class属性为'entry-title public'的h1元素,并找到他的strong子节点的a子节点,并提取a节点的文本信息”。

对应的Html是这样子的:

CSS选择器是于XPath类似的语言。如果大家做过前端开发,肯定知道$('h1.entry-title')这种写法的含义。客观的说,它比XPath写起来要简单一些,但是如果写复杂一点的抽取规则,就相对要麻烦一点。

正则表达式则是一种通用的文本抽取语言。

page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());

XPath、CSS选择器和正则表达式的具体用法我会在第4章“抽取工具详解”中讲到。

3.1.3 链接的发现

3.2 保存结果

4. 抽取工具详解

4.1 XPath

4.2 CSS选择器

4.3 正则表达式

4.4 JsonPath

5. 配置爬虫

5.1 抓取频率

5.2 编码

5.3 代理

5.4 设置cookie/UA等http头信息

5.5 重试机制

5.6 多线程

6. 爬虫的启动和终止

6.1 启动爬虫

6.2 终止爬虫

6.3 设置执行时间

6.4 定期抓取

7. 抽取结果的处理

7.1 输出到控制台

7.2 保存到文件

7.3 JSON格式输出

7.4 自定义持久化方式(mysql/mongodb…)

8. 管理URL

8.1 手动添加URL

8.2 在URL中保存信息

8.3 几种URL管理方式

8.4 自己管理爬虫的URL

9. 实例

9.1 基本的列表+详情页的抓取

9.2 抓取动态页面

9.3 分页抓取

9.4 定期抓取

mysql git 获取 稳定版本 源码_webmagic新版文档(更新中)相关推荐

  1. java计算机毕业设计汽车客运站票务管理系统源码+程序+lw文档+mysql数据库

    java计算机毕业设计汽车客运站票务管理系统源码+程序+lw文档+mysql数据库 java计算机毕业设计汽车客运站票务管理系统源码+程序+lw文档+mysql数据库 本源码技术栈: 项目架构:B/S ...

  2. 基于java吾悦商城管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java吾悦商城管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java吾悦商城管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 本源码技术栈: ...

  3. 基于java点播影院运营系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java点播影院运营系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java点播影院运营系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 本源码技术栈: ...

  4. java计算机毕业设计培训学校教学管理平台源码+程序+lw文档+mysql数据库

    java计算机毕业设计培训学校教学管理平台源码+程序+lw文档+mysql数据库 java计算机毕业设计培训学校教学管理平台源码+程序+lw文档+mysql数据库 本源码技术栈: 项目架构:B/S架构 ...

  5. 基于java汽车4S服务管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java汽车4S服务管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java汽车4S服务管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 本源码技 ...

  6. 基于java的滑雪场学具租赁管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java的滑雪场学具租赁管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java的滑雪场学具租赁管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 ...

  7. 基于java的商城后台管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java的商城后台管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java的商城后台管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 本源码技术栈 ...

  8. 基于java二次元信息分享平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java二次元信息分享平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java二次元信息分享平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 项目架构:B ...

  9. java计算机毕业设计培训机构运营系统源码+程序+lw文档+mysql数据库

    java计算机毕业设计培训机构运营系统源码+程序+lw文档+mysql数据库 java计算机毕业设计培训机构运营系统源码+程序+lw文档+mysql数据库 本源码技术栈: 项目架构:B/S架构 开发语 ...

最新文章

  1. vue防抖和节流是什么_防抖和节流为什么重要!!!
  2. pytorch笔记——简易回归问题
  3. Execution in the Kingdom of Nouns (名词王国中的死刑)
  4. 解决tomcat的undeploy
  5. 【切图】门户网首页模板一 (类似CSDN)
  6. 炼丹中遇到的一些BUG
  7. 数据结构二叉树算法c语言实现,数据结构与算法 :AVL平衡二叉树C语言实现
  8. 期货跟单软件:大数据排名展示跟随
  9. 求矩形和圆柱的体积(用到了接口)
  10. 困扰了很久的ubuntu下智能拼音输入法
  11. 四川眉山中院宣判两起特大跨国电信诈骗案
  12. alanwang[GDOU] 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入
  13. 违章查询免费api接口代码
  14. SpyNote V5.0图形化工具远程控制Android手机教程(图文教程+演示视频)
  15. hualinux 编程概念 3.11 快速原型模型:以最快最小代价完成产品特性
  16. java get请求405_get方法没问题,post方法报405错误
  17. svn update冲突解决
  18. compat-wireles的理解
  19. 深搜和广搜的原理及优缺点
  20. element el-checkbox已绑定值却无法勾选的问题

热门文章

  1. mysql stop很久_mysql的timeout
  2. Elasticsearch 集群平衡配置
  3. mysql insert 锁
  4. 告别加班:一个让你不再重复工作的技能
  5. 太赞了!包邮送 60 本 Python 畅销书!
  6. 有人在代码里下毒!慎用 pip install 命令
  7. 同事给我埋了个坑:Insert into select语句把生产服务器炸了
  8. 我在 GitHub 上看到了一个丧心病狂的开源项目!
  9. c语言调用二维数组作为函数参数传递,C++ 二维数组作为形参传递使用实例
  10. python使用循环结构计算10_十二、 python中的循环结构