一个人能做出什么开源项目?

高性能分布式 RPA,一个人高强度连续写了几年,感觉大脑每个细胞都激活了,根本停不下来。目前该项目仍然由我独自维护升级。

PulsarRPA - Automate webpages at scale, scrape web data completely and accurately with high performance, distributed RPA.icon-default.png?t=N7T8https://github.com/platonai/PulsarRPA

可以操纵大规模浏览器集群,尤其适用于网络爬虫的各种场景:从 a, b, c 到大规模采集最复杂的站点,完整精确提取网页数据,支持使用 SQL 提取网页内容,从而降低管理复杂任务、复杂页面内容提取规则的难度。同时,我也独立开发了基于视觉模型和机器学习的自动网页数据提取算法。

经历分享

开发 PulsarRPA 的过程充满乐趣,也可以说充满艰辛,取决于我们怎么去理解“艰辛”。我喜欢拿大学时代通宵打游戏打比方:很快乐,很辛苦,很累。独立开发一款软件的感受类似。

在研发最深入的几年里,感觉大脑每个细胞都被激活了,都被占用了。

我从事的产品研发工作非常复杂,同时横跨多个子领域,同时参考几百万行专业代码是常态。结果就是大脑的几乎每一个细胞都被产品实现占据了,被拉着见客户,哪怕只有一个下午,回头都需要三天时间把工作需要的知识重新加载到大脑中。

高强度研发使得大脑每个细胞都被激活
高强度研发使得大脑每个细胞都被激活

有时候遇到困难,注意力集中不起来了,还得把自己逼成生物骇客,骇进自己的大脑,主动控制大脑的注意力方向。

要理解最复杂最困难的问题,譬如一千多万行代码的第三方系统,唯一的方法是有意识地控制情绪、心跳频率和大脑注意力,把大脑完全清空,留足够的内存加载尽可能多的知识;而要*解决*最困难最复杂的问题,还要在上述基础上进一步对大脑进行控制。 ​​​

高强度研发过程中对大脑的主动控制题

在研发攻关最深入的时候,有一些独特的体验:

  1. 同时调研和参考十来个大型开源项目,深入到源代码级别。涵盖多种陌生语言和不同细分领域

  2. 大脑需要把工作环境完全加载到热点区才能工作,由于知识量巨大,大脑的物理容量和运转功率达到前所未有的状态

  3. 大脑的存储机制和计算机存储非常类似,有内存和外存,一件事情的相关信息需要大部分加载到内存(热点区)才能正常工作

  4. 如果持续专注解决同类问题,就会形成强烈的心流,相关知识一直在大脑内存中,即使睡觉也不会清空

  5. 但不同性质的工作会相互干扰,譬如临时拜访客户,再回到研发工作状态,则大脑“内存”被清空,需要三天时间重新将研发相关知识加载到大脑热点区

  6. 大脑在处理不同性质的工作时,似乎运转在不同的频率上,即心境不同。譬如深度研发和商务谈判就完全是不同的心境,同一个心境下,一个做得好,第二个就做不好。两者都要做好,需要心境转换,也就是要花时间准备和预热。

  7. 自主控制注意力方向,使得大脑专注于目标问题非常困难,但并非不能克服

高强度研发过程中的奇特体验

主要功能

支持高质量的大规模数据采集和处理。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 指定的字段。 示例代码可以在这里找到:kotlinjava,国内镜像:kotlinjava

大多数生产环境数据采集项目可以从以下代码片段开始

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()
}

示例代码:kotlinjava,国内镜像:kotlinjava

最复杂的数据采集项目可以使用 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)

示例代码: kotlin国内镜像

Web 数据抽取难题可以使用机器学习来解决

使用无监督学习+监督学习进行网页数据提取,我们将网页数据提取的人效提升了1000倍以上,提升了数据提取准确率,降低了人员技能要求,同时也不再需要频繁维护数据提取规则。

下一代网络爬虫:AI agentsicon-default.png?t=N7T8http://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.

如需了解更多,可以看项目主页国内镜像 或者 专栏文章 或者在线教程


                
  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值