使用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();
}
}
分享到:
相关推荐
在JavaScript编程中,"selectable"通常指的是对HTML元素的选择性操作,允许用户或脚本在页面上选择特定的文本内容。这个特性广泛应用于各种交互式应用,如文本编辑器、代码编辑器或者数据筛选工具等。下面我们将深入...
然而,对于Vue开发者来说,如果想在Vue项目中使用类似jQuery UI Selectable的功能,却找不到一个现成的Vue指令插件,这时候就需要自定义一个Vue指令来实现相似的功能。 本文介绍了一个名为v-selectable的Vue指令,...
在JavaScript编程中,使用键盘箭头来控制选中标签元素是一项常见的交互设计,尤其是在网页应用中。这个小demo展示了如何通过监听键盘事件并处理箭头键的按下,以实现元素的选择切换。以下将详细讲解这一功能的实现...
`django-selectable`1.2.0版本可能包含一些已知的问题和限制,因此在实际使用中,开发者应该查阅官方文档和社区讨论,了解可能的解决方案和最佳实践。此外,持续关注库的更新,以便及时利用新特性并修复潜在的安全...
在Django项目中使用`django-selectable`,首先需要在`settings.py`中添加`django_selectable`到`INSTALLED_APPS`列表中,然后根据需求配置相应的数据源。例如,如果需要基于模型创建选择框,可以创建一个`Lookup`类...
5. **多语言支持**:考虑到国际化需求,`django-selectable` 支持多语言,方便全球用户使用。 在`django-selectable-0.3.tar.gz`这个压缩包中,通常会包含以下文件和目录: - `django_selectable`: 库的主要代码,...
react-selectable, 用于响应的组件,允许鼠标选择子项 可以选择的项目允许使用鼠标对项目进行单个或者组选择。演示试试它。从 0.1升级到 0.20.2版本中发生了显著的变化。 请在这里阅读关于他们的文章。正在启动npm ...
`django_selectable`是Django的一个扩展,主要用于提供可选择的输入元素,比如下拉列表、自动补全等功能。它通常用于构建用户界面时,需要从数据库或其他数据源动态获取选项的场景。该库可以提高开发效率,让开发者...
《PyPI官网下载:pandas_selectable-1.1.1.tar.gz——Python库在分布式环境中的应用》 PyPI(Python Package Index)是Python开发者的重要资源库,它提供了丰富的Python软件包,供全球开发者下载和使用。在这个场景...
"django-selectable-select2"这个名字暗示它可能是Django的一个UI组件,特别是与选择元素(比如下拉列表)相关的。在Web开发中,"select2"是一个著名的前端库,用于增强HTML的选择器。结合Django,这个库可能是将...
快速React可选 启用可通过鼠标/触摸选择的React组件(或组件组)。 演示版 安装 ... 为了使其他组件成为可选组件,可以使用HoC createSelectable将它们包装起来,将传递的selectableRef属性添加到目标
vue-selectable概述对页面上的某些对象进行鼠标选择是常见的任务。 您可以在所有菜单中选择该指令,这使该任务变得非常容易。概述这是一项常见任务,需要在页面上用...可以使用Ctrl +单击o将单个项目排除在选择范围之外
<电子可选> 用于选择子元素的 Web 组件包装器 由维护 演示 。 用法 ... 开始使用吧! < div> Item 1 < div> Item 2 < div> Item 3 属性 名称 选项 默认 描述 selectedIndex 细绳 undefi
其中,`SelectableExample`是一个演示如何在Garmin应用程序中使用`Selectable`元素的示例项目。本文将深入解析这个示例,帮助开发者理解如何通过`Selectable`元素提升用户交互体验。 首先,`Selectable`元素是...
允许使用鼠标单独或分组选择项目。 演示版 从0.1升级到0.2 0.2版本发生了重大变化。 请。 入门 npm install react-selectable import React from 'react' ; import { render } from 'react-dom' ; import { ...
本示例探讨的是如何使用jQuery实现一个名为DrawSelect的插件,该插件允许用户通过鼠标框选页面上的多个元素。这个功能在数据分析、内容编辑或任何需要批量操作的场景中尤其有用。 首先,我们需要理解`index.html`是...
Backbone.Selectable 是一个基于 JavaScript 的库,专为在 Backbone.js 框架中实现可选元素的功能而设计。这个库扩展了 Backbone.View,增加了对单一选择和多重选择的支持,使得用户可以在界面上方便地进行交互操作...
运行: npm install react-native-selectable-grid --save或yarn add react-native-selectable-grid 用法(示例) import React , { Component } from 'react' ; import { View } from 'react-native' ; import ...
要求jQuery 1.7以上数据表1.9.1+ jquery.groupToggle插件( 如果Selectable与bSelectAllCheckbox = true一起使用是必需的用法Selectable是一个功能插件,因此可以通过在数据表sDom选项中添加'S'字符来启用它。...