基本用法

用一句话介绍 PulsarRPA,它仅仅正确实现了两个方法:加载网页,提取数据。为了实现这个目标,PulsarRPA 增删近百万行代码,沉淀数十万行代码,开发了一系列尖端技术。

加载网页:

  1. 加载一个网页或者资源
  2. 使用浏览器加载并渲染网页,或者使用原始协议加载单一资源
  3. 用一台机器加载十万个网页
  4. 用十台机器加载一百万个网页
  5. 用 N 台机器加载 10 x N 万个网页

提取数据:

  1. 从网页内容文本中提取数据,从文本资源中提取数据
  2. 从文档对象模型(DOM)中提取数据
  3. 同网页进行交互后提取数据
  4. 将网页截屏后提取数据
  5. 从数以百万计的网页中自动提取数据

综合起来:

  1. 使用 SQL 加载网页并提取数据
  2. 通过云服务加载网页并提取数据
  3. 在极端复杂的应用场景中,正确地加载网页并正确地提取数据
  4. 围绕加载和提取的其他辅助性方法

PulsarRPA 实现网络即数据库范式,像对待内部数据库一样对待外部网络,如果需要的数据不在本地存储中,或者现存版本不满足分析需要,则系统会从互联网上采集该数据的最新版本。

本课程介绍了加载数据和提取数据的基本 API,这些 API 出现在 PulsarSession 中。PulsarSession 提供了丰富的 API,以覆盖“加载-解析-提取”的所有需求。

这样丰富的 API 使得我们的绝大多数编程场景下,都能够使用一行代码解决“加载-解析-提取”问题:

  1. 普通加载
  2. 异步加载
  3. 批量加载
  4. 批量加载链出页面
  5. 各种参数组合

下面是这些 API 的预览,后面我们会详细解释。

  1. load()
  2. loadDeferred()
  3. loadAsync()
  4. submit()
  5. loadAll()
  6. submitAll()
  7. loadOutPages()
  8. submitOutPages()
  9. loadResource()
  10. loadResourceDeferred()
  11. loadDocument()
  12. scrape()
  13. 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 - 基本用法相关推荐

  1. commander入门教程及高级用法

    简介 commander是一个轻巧的nodejs模块,提供了用户命令行输入和参数解析强大功能 安装 cnpm i -S commander 最小力度的脚手架 入门教程及高级用法 // 注册命令:com ...

  2. eval 函数 java_[Java教程]eval()函数用法详解

    [Java教程]eval()函数用法详解 0 2015-12-14 11:00:26 eval()函数用法详解: 此函数可能使用的频率并不是太高,但是在某些情况下具有很大的作用,下面就介绍一下eval ...

  3. python 使用全局变量_Python教程之全局变量用法

    Python教程之全局变量用法 本文实例讲述了Python全局变量用法.分享给大家供大家参考,具体如下: 全局变量不符合参数传递的精神,所以,平时我很少使用,除非定义常量.今天有同事问一个关于全局变量 ...

  4. Git 教程 - Git 基本用法

    Git 是当前最流行的版本控制程序之一,文本包含了 Git 的一些基本用法 创建 git 仓库 初始化 git 仓库 mkdir project  # 创建项目目录  cd project  # 进入 ...

  5. 测试教程网.unittest教程.2. 基本用法

    From: http://www.testclass.net/pyunit/basic_example/ 我们通过最简单的例子来看一下unittest的基本用法,下面的代码测试了3个python字符串 ...

  6. java visitor_java11教程--接口FileVisitor用法

    文件的访问者. 该接口的实现被提供给Files.walkFileTree方法以访问文件树中的每个文件. 用法示例:假设我们要删除文件树. 在这种情况下,删除目录中的条目后,应删除每个目录. Path ...

  7. c语言中单词的作用与形式,C语言基础教程:单词的用法与规则

    在C语言中,单词是由若干个有序的字符组成的,单词的集合称为词汇.C语言的单词有如下几种:标识符.关键字.运算符.分隔符.常量.字符串和注释符. 下面对上述7种单词的词法规则逐一详述,有些单词,例如,关 ...

  8. python基础教程:__call__用法

    __call__可以使得方法变成可被调用对象:(PS:python中的方法和普通函数有点区别:方法的第一个参数是类实例) 允许一个类的实例像函数一样被调用.实质上说,这意味着 x() 与 x.call ...

  9. Python教程:self用法

    1. self代表类的实例,而非类 class Test:def prt(self):print(self)print(self.__class__)t = Test() t.prt() ------ ...

最新文章

  1. python 制作gif-如何在线制作gif图片?
  2. 目前计算机辅助数控编程的方法,数控编程试题(附自己整理的答案)
  3. MyEclipse使用总结——设置MyEclipse开发项目时使用的JDK
  4. 《思科数据中心I/O整合》一2.11 活动-活动连接(Active-Active)
  5. stream of java_java8新特性之强大的Stream API
  6. Java虚拟机栈介绍
  7. linux 按键驱动中断 rockchip_嵌入式linux快速入门(转载)
  8. C++基础知识(六)函数
  9. Linux 视频播放器
  10. STM32基于TFTP固件升级经验分享
  11. Vivado2018的使用
  12. 一款强大的通讯录管理软件,Cardhop让你管理和编辑联系人更加方便和多样化
  13. 井口综合安检-解决方案
  14. 运维黄金4指标,构筑
  15. 动什么别动感情 第66节:你不是一个虚荣的女性
  16. 常用的表格正则验证 + 省份选择 JS JQ
  17. IOS 设置icon 出现的bug The app icon set named “AppIcon“ did not have any applicable content.
  18. 如何找到时序列中的缺失月(missing month)/天(missing day)并补全?尤其针对多个客户或产品的月/天销量 -- 史上最简单方法,只要2行python代码
  19. Firefox F12 + Python 3.6 下载B站视频
  20. 空白符号筛选测试真正能用的空白格符号直接复制即可

热门文章

  1. (转)聊聊我跟大漠插件的恩怨情仇
  2. Strongly-connected components
  3. Flutter系列(三):Flutter挑战复杂页面!视频编辑页面来袭。
  4. 高可用详细概念及三种决策方式分析
  5. 不黑艺术学社京藏行——参观五台山孙溟㠭为五台山红英师治印
  6. Serverlet的生命周期
  7. 安装nagios+监控Linux客户端服务端+监控windows客户端
  8. ubuntu搭建vnc实现windows端控制linux桌面
  9. 输出成绩等级ABCDE【c语言】
  10. 基于Java+Springboot+Vue的校园爱心捐赠互助管理系统设计和实现