`
liyixing1
  • 浏览: 959276 次
  • 性别: Icon_minigender_1
  • 来自: 江西上饶
社区版块
存档分类
最新评论

简单的例子

阅读更多
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的一个简单例子

    在这个名为“mfc的一个简单例子”的项目中,我们可以预期它会展示如何在Visual C++环境下使用MFC创建一个基本的图形用户界面(GUI)。MFC将窗口、控件、菜单、对话框等元素抽象为类,程序员可以通过继承和实例化这些...

    VC API常用函数简单例子大全.doc

    VC API常用函数简单例子大全第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄 4 第二个:SendMessage根据窗口句柄发送一个消息给窗口 4 第三个:GetCursorPos获取鼠标当前位置(屏幕) 6 第四个:...

    gcc编译C++共享库/静态库供C调用的简单例子

    C++编写的共享库,用gcc编译连接,分别生成.so和.a,C编写的main,用gcc编译,连接.so和.a调用的简单例子

    VTK 简单例子

    这个"VTK简单例子"提供了初学者一个入门VTK的起点,让我们深入了解一下VTK及其基本用法。 VTK的核心功能在于数据处理、可视化算法和图形用户界面的构建。它支持多种数据类型,包括点云、网格、图像和体积数据等。在...

    LINUX下JAVA程序与C语言程序通过SOCKET通信的简单例子.pdf

    LINUX下JAVA程序与C语言程序通过SOCKET通信的简单例子.pdf

    spring 的简单例子工程适合初学者

    这个"spring 的简单例子工程"是为了帮助初学者快速理解和入门 Spring 框架。 **数据库连接与Spring** 在 Spring 中,数据库连接通常通过 JDBC(Java Database Connectivity)或者 ORM(Object-Relational Mapping...

    异步编程的一个简单例子

    C# 异步编程 简单例子

    基于python语言,学习Opencv的简单例子.zip

    学习Opencv的简单例子.zip基于python语言,学习Opencv的简单例子.zip基于python语言,学习Opencv的简单例子.zip基于python语言,学习Opencv的简单例子.zip基于python语言,学习Opencv的简单例子.zip基于python语言,...

    mybatis简单例子

    标题 "mybatis简单例子" 涉及到的是MyBatis这一流行的数据持久层框架的实践应用。MyBatis是一个轻量级的Java框架,它允许开发者将SQL语句直接映射到Java方法,简化了数据库操作。在这个简单的例子中,我们将探讨如何...

    C#一些简单例子-测试用

    在"C#一些简单例子-测试用"这个资源中,我们可以期待找到一系列C#编程的基础示例,这些示例可能涵盖了语言的核心概念,帮助初学者理解和掌握C#的关键特性。 首先,基础的C#语法是学习的重点,包括变量声明、数据...

    C# 一个简单例子 登陆注册和省市联动选择(SQLite数据库)

    C# 一个简单例子 登陆注册和省市联动选择(SQLite数据库) Visual Studio 2015和Visual Studio 2017 运行ok,电脑里只有这两个版本。 附带SQLite数据库。 非常简单的例子,新人学习用!

    CSpinButtonCtrl的简单例子

    CSpinButtonCtrl的简单例子 CSpinButtonCtrl的简单例子 CSpinButtonCtrl的简单例子 CSpinButtonCtrl的简单例子 CSpinButtonCtrl的简单例子

    c#.Net 验证码识别简单事例

    在这个“c#.Net 验证码识别简单事例”中,我们将探讨以下几个关键知识点: 1. 图像处理:验证码识别的基础是图像处理技术。C# .NET提供了System.Drawing命名空间,其中包含各种图像处理类,如Bitmap、Graphics等,...

    DWR-J2EE 简单例子

    **DWR-J2EE简单例子详解** DWR (Direct Web Remoting) 是一个开源的Java库,它允许在Web应用程序中实现JavaScript与服务器端Java代码的双向通信。DWR简化了AJAX(Asynchronous JavaScript and XML)应用的开发,...

    C++builder 简单例子7个

    C++builder 简单例子7个 适合初学CB的同学 C++builder 简单例子7个 适合初学CB的同学 C++builder 简单例子7个 适合初学CB的同学 C++builder 简单例子7个 适合初学CB的同学

    H5 PhotoSwipe简单例子

    H5 PhotoSwipe简单例子 H5 PhotoSwipe简单例子 H5 PhotoSwipe简单例子 H5 PhotoSwipe简单例子

    三层架构最简单例子源码 SUMExamplesSanCengJG.rar

    三层架构最简单例子源码 源码描述: 一、源码特点 本程序是最简单三层架构的例子,注释很完善,也提供了多种写法的说明,还有一些经验性的提示,值得初学者参考。 二、菜单功能 一个非常简单的三层架构添加数据...

    Ajax最简单例子Demo

    Ajax最简单例子,一个例子让你明白Ajax原理,XMLHttpRequest原理 var http_request = false; function createRequest(url) { http_request = false; if (window.XMLHttpRequest) { // Mozilla浏览器 ...

    C语言程序简单例子C语言程序简单例子.doc

    C语言程序简单例子C语言程序简单例子

    网络访问海康硬盘录像机简单事例

    网络访问海康硬盘录像机简单事例 [DllImport("HCNetSDK.dll")] public static extern bool NET_DVR_Init(); //初始化SDK //用户注册 [DllImport("HCNetSDK.dll")] public static extern int NET_DVR_Login...

Global site tag (gtag.js) - Google Analytics