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

使用Selectable抽取元素

阅读更多
使用Selectable抽取元素

Selectable相关的抽取元素链式API是WebMagic的一个核心功能。使用Selectable接口,你可以直接完成页面元素的链式抽取,也无需去关心抽取的细节。

在刚才的例子中可以看到,page.getHtml()返回的是一个Html对象,它实现了Selectable接口。这个接口包含一些重要的方法,我将它分为两类:抽取部分和获取结果部分。

抽取部分API:
方法说明示例
xpath(String xpath)使用XPath选择html.xpath("//div[@class='title']")
$(String selector)使用Css选择器选择html.$("div.title")
$(String selector,String attr)使用Css选择器选择html.$("div.title","text")
css(String selector)功能同$(),使用Css选择器选择html.css("div.title")
links()选择所有链接html.links()
regex(String regex)使用正则表达式抽取html.regex("\(.\*?)\")
regex(String regex,int group)使用正则表达式抽取,并指定捕获组html.regex("\(.\*?)\",1)
replace(String regex, String replacement)替换内容html.replace("\","")



获取结果的API:

当链式调用结束时,我们一般都想要拿到一个字符串类型的结果。这时候就需要用到获取结果的API了。我们知道,一条抽取规则,无论是XPath、CSS选择器或者正则表达式,总有可能抽取到多条元素。WebMagic对这些进行了统一,你可以通过不同的API获取到一个或者多个元素。

方法说明示例
get()返回一条String类型的结果String link= html.links().get()
toString()功能同get(),返回一条String类型的结果String link= html.links().toString()
all()返回一条String类型的结果List links= html.links().all()
match()是否有匹配结果if (html.links().match()){ xxx; }



例如,我们知道页面只会有一条结果,那么可以使用selectable.get()或者selectable.toString()拿到这条结果。

这里selectable.toString()采用了toString()这个接口,是为了在输出以及和一些框架结合的时候,更加方便。因为一般情况下,我们都只需要选择一个元素!

selectable.all()则会获取到所有元素。


示例代码

package com.lsiding.msg.page;

import java.util.ArrayList;
import java.util.List;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;

/**
 * 建造师列表页面抓取
 * 
 * @author liyixing
 *
 */
public class BuilderListPageProcessor implements PageProcessor {
	/**
	 * 部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等
	 */
	private Site site = Site
			.me()
			.setRetryTimes(3)
			.setSleepTime(100)
			.setUserAgent(
					"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36");
	/**
	 * 是否已经获取所有的分页列表
	 */
	private boolean isAddTargetRequests = false;

	/**
	 * process是定制爬虫逻辑的核心接口,在这里编写抽取逻辑
	 */
	@Override
	public void process(Page page) {
		// 部分二:定义如何抽取页面信息,并保存下来
		// 姓名
		page.putField(
				"name",
				page.getHtml()
						.xpath("//div[@class='addProject']//table//td[2]/a/allText()")
						.get());
		page.putField(
				"click",
				"http://location/"
						+ page.getHtml()
								.xpath("//div[@class='addProject']//table//td[2]/a/@onclick")
								.replace("winopen\\('", "")
								.replace("',1000,600,'人员证书轨迹查看'\\);", "").get());
		// 企业名称
		page.putField(
				"company",
				page.getHtml()
						.xpath("//div[@class='addProject']//table//td[3]/tidyText()")
						.get());
		// 注册编号
		page.putField(
				"registerNumber",
				page.getHtml()
						.xpath("//div[@class='addProject']//table//td[4]/tidyText()")
						.get());
		// 证书编号
		page.putField(
				"cerNumber",
				page.getHtml()
						.xpath("//div[@class='addProject']//table//td[5]/tidyText()")
						.get());
		// 資格證書编号
		page.putField(
				"qualCerNumber",
				page.getHtml()
						.xpath("//div[@class='addProject']//table//td[6]/tidyText()")
						.get());
		// 状态
		page.putField(
				"status",
				page.getHtml()
						.xpath("//div[@class='addProject']//table//td[7]/tidyText()")
						.get());
		// 注册专业
		page.putField(
				"company",
				page.getHtml()
						.xpath("//div[@class='addProject']//table//td[8]/tidyText()")
						.get());
		// 注册有效期
		page.putField(
				"valTime",
				page.getHtml().xpath(
						"//div[@class='addProject']//table//td[9]/tidyText()"));

		ResultItems resultItems = page.getResultItems();

		for (String key : resultItems.getAll().keySet()) {
			System.out.println(page.getResultItems().get(key));
		}

		// 部分三:从页面发现后续的url地址来抓取
		if (!isAddTargetRequests) {
			// 根据分页数,增加爬取链接
			Integer allNumber = Integer
					.valueOf(page
							.getHtml()
							.xpath("//div[@class='paging']//span[@class='localPage'][2]/tidyText()")
							.get());

			//
			List<String> urls = new ArrayList<String>();
			// 计算总共有多少页
			int pageMaxSize = allNumber / 50;

			if (allNumber % 50 != 0) {
				pageMaxSize++;
			}

			for (int x = 2; x <= pageMaxSize; x++) {
				urls.add("http://location/outQualificationQuery?pageSize=50&pageIndex="
						+ x + "&q_certStatus=0");
			}

			page.addTargetRequests(urls);
			isAddTargetRequests = true;
		}
	}

	@Override
	public Site getSite() {
		return site;
	}

	public static void main(String[] args) {
		Spider.create(new BuilderListPageProcessor())
				// 从"某个地址再试抓取"开始抓
				.addUrl("http://location/outQualificationQuery?pageSize=50&pageIndex=1&q_certStatus=0")
				// 开启5个线程抓取
				.thread(5)
				// 启动爬虫
				.run();
	}
}

分享到:
评论

相关推荐

    selectable:使用 HTML 元素轻松获取和设置文本选择

    在JavaScript编程中,"selectable"通常指的是对HTML元素的选择性操作,允许用户或脚本在页面上选择特定的文本内容。这个特性广泛应用于各种交互式应用,如文本编辑器、代码编辑器或者数据筛选工具等。下面我们将深入...

    自定义类似于jQuery UI Selectable 的Vue指令v-selectable

    然而,对于Vue开发者来说,如果想在Vue项目中使用类似jQuery UI Selectable的功能,却找不到一个现成的Vue指令插件,这时候就需要自定义一个Vue指令来实现相似的功能。 本文介绍了一个名为v-selectable的Vue指令,...

    js键盘箭头控制上下选中标签元素

    在JavaScript编程中,使用键盘箭头来控制选中标签元素是一项常见的交互设计,尤其是在网页应用中。这个小demo展示了如何通过监听键盘事件并处理箭头键的按下,以实现元素的选择切换。以下将详细讲解这一功能的实现...

    Python库 | django-selectable-1.2.0.tar.gz

    `django-selectable`1.2.0版本可能包含一些已知的问题和限制,因此在实际使用中,开发者应该查阅官方文档和社区讨论,了解可能的解决方案和最佳实践。此外,持续关注库的更新,以便及时利用新特性并修复潜在的安全...

    Python库 | django-selectable-select2-0.3.0.tar.gz

    在Django项目中使用`django-selectable`,首先需要在`settings.py`中添加`django_selectable`到`INSTALLED_APPS`列表中,然后根据需求配置相应的数据源。例如,如果需要基于模型创建选择框,可以创建一个`Lookup`类...

    PyPI 官网下载 | django-selectable-0.3.tar.gz

    5. **多语言支持**:考虑到国际化需求,`django-selectable` 支持多语言,方便全球用户使用。 在`django-selectable-0.3.tar.gz`这个压缩包中,通常会包含以下文件和目录: - `django_selectable`: 库的主要代码,...

    react-selectable, 用于响应的组件,允许鼠标选择子项.zip

    react-selectable, 用于响应的组件,允许鼠标选择子项 可以选择的项目允许使用鼠标对项目进行单个或者组选择。演示试试它。从 0.1升级到 0.20.2版本中发生了显著的变化。 请在这里阅读关于他们的文章。正在启动npm ...

    PyPI 官网下载 | django_selectable-0.9.0-py2.py3-none-any.whl

    `django_selectable`是Django的一个扩展,主要用于提供可选择的输入元素,比如下拉列表、自动补全等功能。它通常用于构建用户界面时,需要从数据库或其他数据源动态获取选项的场景。该库可以提高开发效率,让开发者...

    PyPI 官网下载 | pandas_selectable-1.1.1.tar.gz

    《PyPI官网下载:pandas_selectable-1.1.1.tar.gz——Python库在分布式环境中的应用》 PyPI(Python Package Index)是Python开发者的重要资源库,它提供了丰富的Python软件包,供全球开发者下载和使用。在这个场景...

    PyPI 官网下载 | django-selectable-select2-0.1.7.tar.gz

    "django-selectable-select2"这个名字暗示它可能是Django的一个UI组件,特别是与选择元素(比如下拉列表)相关的。在Web开发中,"select2"是一个著名的前端库,用于增强HTML的选择器。结合Django,这个库可能是将...

    react-selectable-fast:使React组件可以通过鼠标触摸进行选择

    快速React可选 启用可通过鼠标/触摸选择的React组件(或组件组)。 演示版 安装 ... 为了使其他组件成为可选组件,可以使用HoC createSelectable将它们包装起来,将传递的selectableRef属性添加到目标

    vue-selectable-Vue 1.x / 2.x指令,可通过鼠标选择项目。-Vue.js开发

    vue-selectable概述对页面上的某些对象进行鼠标选择是常见的任务。 您可以在所有菜单中选择该指令,这使该任务变得非常容易。概述这是一项常见任务,需要在页面上用...可以使用Ctrl +单击o将单个项目排除在选择范围之外

    e-selectable:用于选择子元素的 Web 组件

    &lt;电子可选&gt; 用于选择子元素的 Web 组件包装器 由维护 演示 。 用法 ... 开始使用吧! &lt; div&gt; Item 1 &lt; div&gt; Item 2 &lt; div&gt; Item 3 属性 名称 选项 默认 描述 selectedIndex 细绳 undefi

    SelectableExample:演示Garmin应用程序中可选用法的示例应用程序

    其中,`SelectableExample`是一个演示如何在Garmin应用程序中使用`Selectable`元素的示例项目。本文将深入解析这个示例,帮助开发者理解如何通过`Selectable`元素提升用户交互体验。 首先,`Selectable`元素是...

    react-selectable:react的组件,允许鼠标选择子项

    允许使用鼠标单独或分组选择项目。 演示版 从0.1升级到0.2 0.2版本发生了重大变化。 请。 入门 npm install react-selectable import React from 'react' ; import { render } from 'react-dom' ; import { ...

    jquery实现鼠标框选多个页面元素

    本示例探讨的是如何使用jQuery实现一个名为DrawSelect的插件,该插件允许用户通过鼠标框选页面上的多个元素。这个功能在数据分析、内容编辑或任何需要批量操作的场景中尤其有用。 首先,我们需要理解`index.html`是...

    backbone.selectable:带有主干的单选多选功能

    Backbone.Selectable 是一个基于 JavaScript 的库,专为在 Backbone.js 框架中实现可选元素的功能而设计。这个库扩展了 Backbone.View,增加了对单一选择和多重选择的支持,使得用户可以在界面上方便地进行交互操作...

    react-native-selectable-grid:可定制的可选(无,一个或多个)网格

    运行: npm install react-native-selectable-grid --save或yarn add react-native-selectable-grid 用法(示例) import React , { Component } from 'react' ; import { View } from 'react-native' ; import ...

    datatables.Selectable:一个功能插件,增加了选择数据表行的功能

    要求jQuery 1.7以上数据表1.9.1+ jquery.groupToggle插件( 如果Selectable与bSelectAllCheckbox = true一起使用是必需的用法Selectable是一个功能插件,因此可以通过在数据表sDom选项中添加'S'字符来启用它。...

Global site tag (gtag.js) - Google Analytics