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();
}
}
爬虫的配置
第一部分关于爬虫的配置,包括编码、抓取间隔、超时时间、重试次数等,也包括一些模拟的参数,例如User Agent、cookie,以及代理的设置
页面元素的抽取
第二部分是爬虫的核心部分:对于下载到的Html页面,你如何从中抽取到你想要的信息?WebMagic里主要使用了三种抽取技术:XPath、正则表达式和CSS选择器。另外,对于JSON格式的内容,可使用JsonPath进行解析。
XPath
XPath本来是用于XML中获取元素的一种查询语言,但是用于Html也是比较方便的。例如:
page.getHtml().xpath(
"//div[@class='addProject']//table//td/a/tidyText()"));
CSS选择器
CSS选择器是与XPath类似的语言。如果大家做过前端开发,肯定知道$('h1.entry-title')这种写法的含义。客观的说,它比XPath写起来要简单一些,但是如果写复杂一点的抽取规则,就相对要麻烦一点。个人觉得更想jQuery的选择器。
正则表达式
正则表达式则是一种通用的文本抽取语言
page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());
JsonPath
JsonPath是于XPath很类似的一个语言,它用于从Json中快速定位一条内容。WebMagic中使用的JsonPath格式可以参考这里:
https://code.google.com/p/json-path/
page.getHtml().jsonPath("");
链接的发现
有了处理页面的逻辑,我们的爬虫就接近完工了!
但是现在还有一个问题:一个站点的页面是很多的,一开始我们不可能全部列举出来,于是如何发现后续的链接,是一个爬虫不可缺少的一部分。
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()则将这些链接加入到待抓取的队列中去。
分享到:
相关推荐
在这个名为“mfc的一个简单例子”的项目中,我们可以预期它会展示如何在Visual C++环境下使用MFC创建一个基本的图形用户界面(GUI)。MFC将窗口、控件、菜单、对话框等元素抽象为类,程序员可以通过继承和实例化这些...
VC API常用函数简单例子大全第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄 4 第二个:SendMessage根据窗口句柄发送一个消息给窗口 4 第三个:GetCursorPos获取鼠标当前位置(屏幕) 6 第四个:...
C++编写的共享库,用gcc编译连接,分别生成.so和.a,C编写的main,用gcc编译,连接.so和.a调用的简单例子
这个"VTK简单例子"提供了初学者一个入门VTK的起点,让我们深入了解一下VTK及其基本用法。 VTK的核心功能在于数据处理、可视化算法和图形用户界面的构建。它支持多种数据类型,包括点云、网格、图像和体积数据等。在...
LINUX下JAVA程序与C语言程序通过SOCKET通信的简单例子.pdf
这个"spring 的简单例子工程"是为了帮助初学者快速理解和入门 Spring 框架。 **数据库连接与Spring** 在 Spring 中,数据库连接通常通过 JDBC(Java Database Connectivity)或者 ORM(Object-Relational Mapping...
C# 异步编程 简单例子
学习Opencv的简单例子.zip基于python语言,学习Opencv的简单例子.zip基于python语言,学习Opencv的简单例子.zip基于python语言,学习Opencv的简单例子.zip基于python语言,学习Opencv的简单例子.zip基于python语言,...
标题 "mybatis简单例子" 涉及到的是MyBatis这一流行的数据持久层框架的实践应用。MyBatis是一个轻量级的Java框架,它允许开发者将SQL语句直接映射到Java方法,简化了数据库操作。在这个简单的例子中,我们将探讨如何...
在"C#一些简单例子-测试用"这个资源中,我们可以期待找到一系列C#编程的基础示例,这些示例可能涵盖了语言的核心概念,帮助初学者理解和掌握C#的关键特性。 首先,基础的C#语法是学习的重点,包括变量声明、数据...
C# 一个简单例子 登陆注册和省市联动选择(SQLite数据库) Visual Studio 2015和Visual Studio 2017 运行ok,电脑里只有这两个版本。 附带SQLite数据库。 非常简单的例子,新人学习用!
CSpinButtonCtrl的简单例子 CSpinButtonCtrl的简单例子 CSpinButtonCtrl的简单例子 CSpinButtonCtrl的简单例子 CSpinButtonCtrl的简单例子
在这个“c#.Net 验证码识别简单事例”中,我们将探讨以下几个关键知识点: 1. 图像处理:验证码识别的基础是图像处理技术。C# .NET提供了System.Drawing命名空间,其中包含各种图像处理类,如Bitmap、Graphics等,...
**DWR-J2EE简单例子详解** DWR (Direct Web Remoting) 是一个开源的Java库,它允许在Web应用程序中实现JavaScript与服务器端Java代码的双向通信。DWR简化了AJAX(Asynchronous JavaScript and XML)应用的开发,...
C++builder 简单例子7个 适合初学CB的同学 C++builder 简单例子7个 适合初学CB的同学 C++builder 简单例子7个 适合初学CB的同学 C++builder 简单例子7个 适合初学CB的同学
H5 PhotoSwipe简单例子 H5 PhotoSwipe简单例子 H5 PhotoSwipe简单例子 H5 PhotoSwipe简单例子
三层架构最简单例子源码 源码描述: 一、源码特点 本程序是最简单三层架构的例子,注释很完善,也提供了多种写法的说明,还有一些经验性的提示,值得初学者参考。 二、菜单功能 一个非常简单的三层架构添加数据...
Ajax最简单例子,一个例子让你明白Ajax原理,XMLHttpRequest原理 var http_request = false; function createRequest(url) { http_request = false; if (window.XMLHttpRequest) { // Mozilla浏览器 ...
C语言程序简单例子C语言程序简单例子
网络访问海康硬盘录像机简单事例 [DllImport("HCNetSDK.dll")] public static extern bool NET_DVR_Init(); //初始化SDK //用户注册 [DllImport("HCNetSDK.dll")] public static extern int NET_DVR_Login...