PulsarRPA 教程 1 - 基本用法
基本用法
用一句话介绍 PulsarRPA,它仅仅正确实现了两个方法:加载网页,提取数据。为了实现这个目标,PulsarRPA 增删近百万行代码,沉淀数十万行代码,开发了一系列尖端技术。
加载网页:
- 加载一个网页或者资源
- 使用浏览器加载并渲染网页,或者使用原始协议加载单一资源
- 用一台机器加载十万个网页
- 用十台机器加载一百万个网页
- 用 N 台机器加载 10 x N 万个网页
提取数据:
- 从网页内容文本中提取数据,从文本资源中提取数据
- 从文档对象模型(DOM)中提取数据
- 同网页进行交互后提取数据
- 将网页截屏后提取数据
- 从数以百万计的网页中自动提取数据
综合起来:
- 使用 SQL 加载网页并提取数据
- 通过云服务加载网页并提取数据
- 在极端复杂的应用场景中,正确地加载网页并正确地提取数据
- 围绕加载和提取的其他辅助性方法
PulsarRPA 实现网络即数据库范式,像对待内部数据库一样对待外部网络,如果需要的数据不在本地存储中,或者现存版本不满足分析需要,则系统会从互联网上采集该数据的最新版本。
本课程介绍了加载数据和提取数据的基本 API,这些 API 出现在 PulsarSession 中。PulsarSession 提供了丰富的 API,以覆盖“加载-解析-提取”的所有需求。
这样丰富的 API 使得我们的绝大多数编程场景下,都能够使用一行代码解决“加载-解析-提取”问题:
- 普通加载
- 异步加载
- 批量加载
- 批量加载链出页面
- 各种参数组合
下面是这些 API 的预览,后面我们会详细解释。
- load()
- loadDeferred()
- loadAsync()
- submit()
- loadAll()
- submitAll()
- loadOutPages()
- submitOutPages()
- loadResource()
- loadResourceDeferred()
- loadDocument()
- scrape()
- scrapeOutPages()
我们来看看常见的用法是怎样的。首先创建一个 Pulsar 会话,所有重要的工作都在 Pulsar 会话中处理:
val session = PulsarContexts.createSession()
val url = "https://www.amazon.com/dp/B09V3KXJPB"
最基本的思想和方法是 load(),它先尝试从本地存储加载网页,如果需要的页面不存在,或已过期,或者不满足其他要求,则从 Internet 获取该页面:
val page = session.load(url)
可以用一个简单参数指定网页过期时间,如果需要的页面已在本地存储中且未过期,则返回本地版本:
// Returns the local version
val page2 = session.load(url, "-expires 100d")
在连续采集任务中,我们会以异步并行的方式来处理大批量采集任务,会将大批 URL 提交到 URL 池中,在采集循环中持续处理这些 URL:
// 向 URL 池提交 URL,提交的 URL 将在一个采集循环中处理
session.submit(url, "-expires 10s")
// 向 URL 池提交一批 URL,提交的 URL 将在采集循环中处理
session.submitAll(urls, "-expires 30d")
一旦一个网页成功加载或者采集,我们通常会需要将该网页解析成一个 DOM,并开始后续的数据提取工作:
// 将页面内容解析成文档
val document = session.parse(page)
// 使用该文档
val title = document.selectFirstText(".title")
// ...
或者“加载-解析”两个步骤可以在一个方法中完成:
// 加载并解析
val document = session.loadDocument(url, "-expires 10s")
// 使用该文档
val title = document.selectFirstText(".title")
// ...
在后续章节中,我们会详细介绍如何使用标准 CSS 选择器和扩展的 CSS 选择器来提取数据。
在很多场景中,我们会从一个列表页出发,采集链出页面。譬如说,我们需要打开一个商品列表页,然后采集其中的商品详情页。PulsarSession 提供了一组方法来简化这个任务:
// 加载入口页面,然后加载由 `-outLink` 指定的所有链接。
// 选项“-outLink”指定cssSelector来选择入口页面中要加载的链接。
// 选项“-topLinks”指定“-outLink”选择的链接的最大数量。
val pages = session.loadOutPages(url, "-expires 10s -itemExpires 10s -outLink a[href~=/dp/] -topLinks 10")// 加载门户页面并将`-outLink '指定的外部链接提交到URL池。
// 选项“-outLink”指定cssSelector来选择入口页面中要提交的链接。
// 选项“-topLinks”指定“-outLink”选择的链接的最大数量。
session.submitOutPages(url, "-expires 1d -itemExpires 7d -outLink a[href~=/dp/] -topLinks 10")
网页采集最终是要从网页中提取字段,PulsarSession 也提供了丰富的方法来简化“采集-解析-提取”复合任务,有单网页版本的,也有批处理版本的:
// 加载页面、解析页面并提取字段
val fields = session.scrape(url, "-expires 10s", "#centerCol", listOf("#title", "#acrCustomerReviewText"))// 加载页面、解析页面并提取具名字段
val fields2 = session.scrape(url, "-i 10s", "#centerCol",mapOf("title" to "#title", "reviews" to "#acrCustomerReviewText"))// 加载链出页面、解析链出页面并从链出页面中提取具名字段
val fields3 = session.scrapeOutPages(url, "-i 10s -ii 10s -outLink a[href~=/dp/] -topLink 10", "#centerCol",mapOf("title" to "#title", "reviews" to "#acrCustomerReviewText"))
在大规模采集项目中,我们通常不会编写 load() -> parse() -> select() 这样的顺序性代码,而是会激活解析子系统,并在解析子系统中注册事件处理器,通过事件处理器来执行文档相关任务,譬如提取字段,将字段保存到数据库,收集更多链接等等:
// 添加 `-parse` 选项来激活解析子系统
val page = session.load(url, "-parse")
PulsarSession 也提供了一批实用方法,来方便实际的编程工作,譬如异步调用,协程支持,参数组合等。
// Kotlin suspend calls
val page = runBlocking { session.loadDeferred(url, "-expires 10s") }// Java-style async calls
session.loadAsync(url, "-expires 10s").thenApply(session::parse).thenAccept(session::export)
最后小结一下,我们提供了一系列方法家族来加载页面:
函数名 | 描述 |
---|---|
load() | 加载一个页面 |
loadDeferred() | 异步加载一个页面,它可以在 Kotlin 协程中执行 |
loadAsync() | 异步加载一个页面,它以 Java 异步编程风格执行 |
submit() | 提交一个链接,它会在采集循环中被加载 |
loadAll() | 加载批量页面 |
submitAll() | 提交批量页面,它们会在采集循环中被加载 |
loadOutPages() | 加载一批链出页面 |
submitOutPages() | 提交一批链出链接,它们会在采集循环中被加载 |
loadResource() | 加载一个资源,使用简单的 HTTP 协议,而不是通过浏览器渲染 |
loadResourceDeferred() | 加载一个资源,它可以在 Kotlin 协程中执行 |
loadDocument() | 加载一个页面,并且解析成 DOM 文档 |
scrape() | 加载一个页面,解析成 DOM 文档,并且从中提取数据 |
scrapeOutPages() | 加载一批链出页面,解析成 DOM 文档,并且从中提取数据 |
这些函数提供了丰富的重载函数,以满足绝大多数复杂编程要求。譬如,当我们准备启动一个新的采集项目时,我们第一步要做的是评估采集难度,这可以用一行代码来启动:
fun main() = PulsarContexts.createSession().scrapeOutPages("https://www.amazon.com/", "-outLink a[href~=/dp/]", listOf("#title", "#acrCustomerReviewText"))
本课程完整的代码可以在这里找到:kotlin,国内镜像。了解更加详细的使用方法,可以直接阅读源代码:PulsarSession,国内镜像。
下一章我们将详细介绍加载参数,通过配置加载参数,可以精确定义我们的采集任务。
上一章 目录 下一章
PulsarRPA 教程 1 - 基本用法相关推荐
- commander入门教程及高级用法
简介 commander是一个轻巧的nodejs模块,提供了用户命令行输入和参数解析强大功能 安装 cnpm i -S commander 最小力度的脚手架 入门教程及高级用法 // 注册命令:com ...
- eval 函数 java_[Java教程]eval()函数用法详解
[Java教程]eval()函数用法详解 0 2015-12-14 11:00:26 eval()函数用法详解: 此函数可能使用的频率并不是太高,但是在某些情况下具有很大的作用,下面就介绍一下eval ...
- python 使用全局变量_Python教程之全局变量用法
Python教程之全局变量用法 本文实例讲述了Python全局变量用法.分享给大家供大家参考,具体如下: 全局变量不符合参数传递的精神,所以,平时我很少使用,除非定义常量.今天有同事问一个关于全局变量 ...
- Git 教程 - Git 基本用法
Git 是当前最流行的版本控制程序之一,文本包含了 Git 的一些基本用法 创建 git 仓库 初始化 git 仓库 mkdir project # 创建项目目录 cd project # 进入 ...
- 测试教程网.unittest教程.2. 基本用法
From: http://www.testclass.net/pyunit/basic_example/ 我们通过最简单的例子来看一下unittest的基本用法,下面的代码测试了3个python字符串 ...
- java visitor_java11教程--接口FileVisitor用法
文件的访问者. 该接口的实现被提供给Files.walkFileTree方法以访问文件树中的每个文件. 用法示例:假设我们要删除文件树. 在这种情况下,删除目录中的条目后,应删除每个目录. Path ...
- c语言中单词的作用与形式,C语言基础教程:单词的用法与规则
在C语言中,单词是由若干个有序的字符组成的,单词的集合称为词汇.C语言的单词有如下几种:标识符.关键字.运算符.分隔符.常量.字符串和注释符. 下面对上述7种单词的词法规则逐一详述,有些单词,例如,关 ...
- python基础教程:__call__用法
__call__可以使得方法变成可被调用对象:(PS:python中的方法和普通函数有点区别:方法的第一个参数是类实例) 允许一个类的实例像函数一样被调用.实质上说,这意味着 x() 与 x.call ...
- Python教程:self用法
1. self代表类的实例,而非类 class Test:def prt(self):print(self)print(self.__class__)t = Test() t.prt() ------ ...
最新文章
- python 制作gif-如何在线制作gif图片?
- 目前计算机辅助数控编程的方法,数控编程试题(附自己整理的答案)
- MyEclipse使用总结——设置MyEclipse开发项目时使用的JDK
- 《思科数据中心I/O整合》一2.11 活动-活动连接(Active-Active)
- stream of java_java8新特性之强大的Stream API
- Java虚拟机栈介绍
- linux 按键驱动中断 rockchip_嵌入式linux快速入门(转载)
- C++基础知识(六)函数
- Linux 视频播放器
- STM32基于TFTP固件升级经验分享
- Vivado2018的使用
- 一款强大的通讯录管理软件,Cardhop让你管理和编辑联系人更加方便和多样化
- 井口综合安检-解决方案
- 运维黄金4指标,构筑
- 动什么别动感情 第66节:你不是一个虚荣的女性
- 常用的表格正则验证 + 省份选择 JS JQ
- IOS 设置icon 出现的bug The app icon set named “AppIcon“ did not have any applicable content.
- 如何找到时序列中的缺失月(missing month)/天(missing day)并补全?尤其针对多个客户或产品的月/天销量 -- 史上最简单方法,只要2行python代码
- Firefox F12 + Python 3.6 下载B站视频
- 空白符号筛选测试真正能用的空白格符号直接复制即可