高性能分布式 RPA,一个人高强度连续写了几年,感觉大脑每个细胞都激活了,根本停不下来。目前该项目仍然由我独自维护升级。
可以操纵大规模浏览器集群,尤其适用于网络爬虫的各种场景:从 a, b, c 到大规模采集最复杂的站点,完整精确提取网页数据,支持使用 SQL 提取网页内容,从而降低管理复杂任务、复杂页面内容提取规则的难度。同时,我也独立开发了基于视觉模型和机器学习的自动网页数据提取算法。
经历分享
开发 PulsarRPA 的过程充满乐趣,也可以说充满艰辛,取决于我们怎么去理解“艰辛”。我喜欢拿大学时代通宵打游戏打比方:很快乐,很辛苦,很累。独立开发一款软件的感受类似。
在研发最深入的几年里,感觉大脑每个细胞都被激活了,都被占用了。
我从事的产品研发工作非常复杂,同时横跨多个子领域,同时参考几百万行专业代码是常态。结果就是大脑的几乎每一个细胞都被产品实现占据了,被拉着见客户,哪怕只有一个下午,回头都需要三天时间把工作需要的知识重新加载到大脑中。
有时候遇到困难,注意力集中不起来了,还得把自己逼成生物骇客,骇进自己的大脑,主动控制大脑的注意力方向。
要理解最复杂最困难的问题,譬如一千多万行代码的第三方系统,唯一的方法是有意识地控制情绪、心跳频率和大脑注意力,把大脑完全清空,留足够的内存加载尽可能多的知识;而要*解决*最困难最复杂的问题,还要在上述基础上进一步对大脑进行控制。
在研发攻关最深入的时候,有一些独特的体验:
-
同时调研和参考十来个大型开源项目,深入到源代码级别。涵盖多种陌生语言和不同细分领域
-
大脑需要把工作环境完全加载到热点区才能工作,由于知识量巨大,大脑的物理容量和运转功率达到前所未有的状态
-
大脑的存储机制和计算机存储非常类似,有内存和外存,一件事情的相关信息需要大部分加载到内存(热点区)才能正常工作
-
如果持续专注解决同类问题,就会形成强烈的心流,相关知识一直在大脑内存中,即使睡觉也不会清空
-
但不同性质的工作会相互干扰,譬如临时拜访客户,再回到研发工作状态,则大脑“内存”被清空,需要三天时间重新将研发相关知识加载到大脑热点区
-
大脑在处理不同性质的工作时,似乎运转在不同的频率上,即心境不同。譬如深度研发和商务谈判就完全是不同的心境,同一个心境下,一个做得好,第二个就做不好。两者都要做好,需要心境转换,也就是要花时间准备和预热。
-
自主控制注意力方向,使得大脑专注于目标问题非常困难,但并非不能克服
主要功能
支持高质量的大规模数据采集和处理。PulsarRPA 开发了一系列基础设施和前沿技术,来保证即使是大规模数据采集场景,也能达到最高标准的性能、质量和总体拥有成本。
支持网络即数据库范式。PulsarRPA 像对待内部数据库一样对待外部网络,如果需要的数据不在本地存储中,或者现存版本不满足分析需要,则系统会从互联网上采集该数据的最新版本。PulsarRPA 还开发了 X-SQL 来直接查询互联网,并将网页转换成表格和图表。
支持浏览器渲染并将其作为数据采集的首要方法。将浏览器渲染作为数据采集的首要方法,我们在数据点规模、数据质量、人力成本和硬件成本之间实现了最佳平衡,并实现了最低的总体拥有成本。通过优化,如屏蔽不必要的资源文件,浏览器渲染的性能甚至可以与传统的单一资源采集方法相媲美。
支持 RPA 采集。PulsarRPA 包含一个 RPA 子系统,来实现网页交互:滚动、打字、屏幕捕获、鼠标拖放、点击等。该子系统和大家所熟知的 selenium, playwright, puppeteer 是类似的,但对所有行为进行了优化,譬如更真实的模拟操作,更好的执行性能,更好的并行性,更好的容错处理,等等。
支持退化的单一资源采集。PulsarRPA 的默认采集方式是通过浏览器渲染来采集 完整的 网页数据,但如果需要的数据可以通过单一接口获取,譬如可以通过某个 ajax 接口返回,也可以调用 PulsarRPA 的资源采集方法进行超高速采集。
技术特征
-
网络爬虫:各种数据采集模式,包括浏览器渲染、ajax数据采集、普通协议采集等
-
RPA:机器人流程自动化、模仿人类行为、采集单网页应用程序或执行其他有价值的任务
-
简洁的 API:一行代码抓取,或者一条 SQL 将整个网站栏目变成表格
-
X-SQL:扩展 SQL 来管理 Web 数据:网络爬取、数据采集、Web 内容挖掘、Web BI
-
爬虫隐身:浏览器驱动隐身,IP 轮换,隐私上下文轮换,永远不会被屏蔽
-
高性能:高度优化,单机并行渲染数百页而不被屏蔽
-
低成本:每天抓取 100,000 个浏览器渲染的电子商务网页,或 n * 10,000,000 个数据点,仅需要 8 核 CPU/32G 内存
-
数据质量保证:智能重试、精准调度、Web 数据生命周期管理
-
大规模采集:完全分布式,专为大规模数据采集而设计
-
大数据支持:支持各种后端存储:本地文件/MongoDB/HBase/Gora
-
日志和指标:密切监控并记录每个事件
代码示例
大多数抓取尝试可以从几乎一行代码开始
fun main() = PulsarContexts.createSession().scrapeOutPages( "https://www.amazon.com/", "-outLink a[href~=/dp/]", listOf("#title", "#acrCustomerReviewText"))
上面的代码从一组产品页面中抓取由 css 选择器 #title 和 #acrCustomerReviewText 指定的字段。 示例代码可以在这里找到:kotlin,java,国内镜像:kotlin,java。
大多数生产环境数据采集项目可以从以下代码片段开始
fun main() {
val context = PulsarContexts.create()
val parseHandler = { _: WebPage, document: Document ->
// use the document
// ...
// and then extract further hyperlinks
context.submitAll(document.selectHyperlinks("a[href~=/dp/]"))
}
val urls = LinkExtractors.fromResource("seeds10.txt")
.map { ParsableHyperlink("$it -refresh", parseHandler) }
context.submitAll(urls).await()
}
示例代码:kotlin,java,国内镜像:kotlin,java。
最复杂的数据采集项目可以使用 RPA 模式
最复杂的数据采集项目往往需要和网页进行复杂交互,为此我们提供了简洁强大的 API。以下是一个典型的 RPA 代码片段,它是从顶级电子商务网站收集数据所必需的:
val options = session.options(args)
val event = options.event.browseEvent
event.onBrowserLaunched.addLast { page, driver ->
// warp up the browser to avoid being blocked by the website,
// or choose the global settings, such as your location.
warnUpBrowser(page, driver)
}
event.onWillFetch.addLast { page, driver ->
// have to visit a referrer page before we can visit the desired page
waitForReferrer(page, driver)
// websites may prevent us from opening too many pages at a time, so we should open links one by one.
waitForPreviousPage(page, driver)
}
event.onWillCheckDocumentState.addLast { page, driver ->
// wait for a special fields to appear on the page
driver.waitForSelector("body h1[itemprop=name]")
// close the mask layer, it might be promotions, ads, or something else.
driver.click(".mask-layer-close-button")
}
// visit the URL and trigger events
session.load(url, options)
Web 数据抽取难题可以使用机器学习来解决
使用无监督学习+监督学习进行网页数据提取,我们将网页数据提取的人效提升了1000倍以上,提升了数据提取准确率,降低了人员技能要求,同时也不再需要频繁维护数据提取规则。
下一代网络爬虫:AI agentshttp://t.csdnimg.cn/kXOHn
Web 数据抽取难题也可以用 X-SQL 来解决
除了使用机器学习手段提取人眼可见数据外,一些人眼不可见数据、页面源代码中的数据、其他流经浏览器的数据,也可以使用 X-SQL 来提取。
现在,我们在大型数据采集项目中,所有提取规则都是用 X-SQL 编写的,数据类型转换、数据清理等工作也由强大的 X-SQL 内联处理。编写 X-SQL 做数据采集项目的体验,就像传统的 CRUD 项目一样简单高效。一个很好的例子是 x-asin.sql(国内镜像),它从每个产品页面中提取 70 多个字段。
select
dom_first_text(dom, '#productTitle') as title,
dom_first_text(dom, '#bylineInfo') as brand,
dom_first_text(dom, '#price tr td:matches(^Price) ~ td, #corePrice_desktop tr td:matches(^Price) ~ td') as price,
dom_first_text(dom, '#acrCustomerReviewText') as ratings,
str_first_float(dom_first_text(dom, '#reviewsMedley .AverageCustomerReviews span:contains(out of)'), 0.0) as score
from load_and_select('https://www.amazon.com/dp/B09V3KXJPB -i 1s -njr 3', 'body');
示例代码: Exotic Amazon’s X-SQLs.