解决方案:*敏*感*词* Web 数据采集的终极开源方案 - PulsarR
优采云 发布时间: 2022-10-05 21:08解决方案:*敏*感*词* Web 数据采集的终极开源方案 - PulsarR
方法一:通过可执行jar体验PulsarR
我们发布了一个基于 PulsarR 的独立可执行 jar,其中收录:
使用单个命令行下载并探索其功能:
java -jar exotic-standalone.jar
方法二:使用 PulsarR 作为软件库
利用 PulsarR 功能的最简单方法是将其作为库添加到您的项目中。
马文:
ai.platon.pulsar
pulsar-all
1.10.2
摇篮:
implementation("ai.platon.pulsar:pulsar-all:1.10.2")
对于国内开发者,我们强烈建议您按照本指南加快构建速度。
基本用法
科特林
// 创建一个 Pulsar 会话
val session = PulsarContexts.createSession()
// 示例程序使用的 url
val url = "https://list.jd.com/list.html?cat=652,12345,12349"
// 加载一个页面,如果该页面为首次加载,或者该页面已过期,则从互联网下载该页面
val page = session.load(url, "-expires 1d")
// 将一个网页内容解析为Jsoup文档
val document = session.parse(page)
// 使用该文档做一些事情
// ...
// 或者,加载并解析
val document2 = session.loadDocument(url, "-expires 1d")
// 使用该文档做一些事情
// ...
// 加载由 -outLink 指示的链出页面
val pages = session.loadOutPages(url, "-expires 1d -itemExpires 7d -outLink a[href~=item]")
// 加载,解析并提取字段
val fields = session.scrape(url, "-expires 1d", "li[data-sku]", listOf(".p-name em", ".p-price"))
// 加载,解析并提取具名字段
val fields2 = session.scrape(url, "-i 1d", "li[data-sku]", mapOf("name" to ".p-name em", "price" to ".p-price"))
// 从由 -outLink 指示的链出页面中加载,解析并提取具名字段
val fields3 = session.scrapeOutPages(url, "-i 10s -ii 10s", "li[data-sku]", mapOf("name" to ".sku-name", "price" to ".p-price"))
示例代码可以在这里找到:kotlin、java。
加载选项
请注意,我们的大多数抓取方法都接受一个称为加载参数或加载选项的参数来控制网页的加载/获取方式。
-expires // 网页失效时间
-itemExpires // 批采集方法中,项目页的失效时间
-outLink // 批采集方法中,项目页链接的 CSS 选择器
-refresh // 强制重新采集网页
-parse // 激活数据解析流程
-resource // 以单一资源模式进行采集,不经过浏览器渲染
单击以查看所有加载选项。
提取网络数据
PulsarR 使用 jsoup 从 HTML 文档中提取数据。Jsoup 将 HTML 解析为与现代浏览器相同的 DOM。查看所有支持的 CSS 选择器的选择器语法。
科特林
val document = session.loadDocument(url, "-expires 1d")
val price = document.selectFirst('.price').text()
连续采集
在 PulsarR 中抓取大量 url 或运行连续的 采集 非常简单。
科特林
fun main() {
val context = PulsarContexts.create()
val parseHandler = { _: WebPage, document: Document ->
// 使用该文档
println(document.title() + "\t|\t" + document.baseUri())
}
val urls = LinkExtractors.fromResource("seeds.txt")
.map { ParsableHyperlink("$it -refresh", parseHandler) }
<p>
context.submitAll(urls)
// 你可以继续提交上百万采集任务
context.submitAll(urls)
// ...
context.await()
}</p>
爪哇
public class ContinuousCrawler {
private static void onParse(WebPage page, Document document) {
// do something wonderful with the document
System.out.println(document.title() + "\t|\t" + document.baseUri());
}
public static void main(String[] args) {
PulsarContext context = PulsarContexts.create();
List urls = LinkExtractors.fromResource("seeds.txt")
.stream()
.map(seed -> new ParsableHyperlink(seed, ContinuousCrawler::onParse))
.collect(Collectors.toList());
context.submitAll(urls);
// feel free to submit millions of urls here
context.submitAll(urls);
// ...
context.await();
}
}
示例代码可以在这里找到:kotlin、java。
RPA(机器人过程自动化)
随着 网站 变得越来越复杂,RPA 已成为从某些 网站 采集数据的唯一方法,例如某些使用自定义字体技术的 网站。
PulsarR 收录一个 RPA 子系统,该子系统提供了一种在网页生命周期中模仿真人的便捷方式,使用 Web 驱动程序与网页交互:滚动、打字、屏幕捕获、鼠标拖放、单击等。这类似与知名的 selenium、剧作家、木偶师不同的是,PulsarR 的所有行为都针对*敏*感*词*数据进行了优化采集。
以下是从顶级电子商务 网站 采集数据所需的典型 RPA 代码片段:
val options = session.options(args)
val event = options.event.browseEvent
event.onBrowserLaunched.addLast { page, driver ->
// 预热浏览器,以避免被网站阻止,或选择全局设置,例如您的位置
warnUpBrowser(page, driver)
}
event.onWillFetch.addLast { page, driver ->
// 必须先访问引荐来源页面,然后才能访问所需页面
waitForReferrer(page, driver)
// 网站可能会阻止我们一次打开过多页面,因此我们应该逐一打开链接
waitForPreviousPage(page, driver)
}
event.onWillCheckDocumentState.addLast { page, driver ->
// 等待特殊字段出现在页面上
driver.waitForSelector("body h1[itemprop=name]")
// 关闭遮罩层,它可能是促销、广告或其他东西
driver.click(".mask-layer-close-button")
}
// 访问 URL 并触发事件
session.load(url, options)
示例代码可以在这里找到:kotlin。
使用 X-SQL 查询 Web
PulsarR 支持网络作为数据库范式,并开发了用于数据提取、类型转换和数据清洗的 X-SQL,让我们可以像传统数据库一样简单地访问 Internet。
提取单个页面:
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');
执行 X-SQL:
val context = SQLContexts.create()
val rs = context.executeQuery(sql)
println(ResultSetFormatter(rs, withHeader = true))
结果如下:
TITLE | BRAND | PRICE | RATINGS | SCORE
HUAWEI P20 Lite (32GB + 4GB RAM) 5.84" FHD+ Display ... | Visit the HUAWEI Store | $1.10.1 | 1,349 ratings | 4.40
示例代码可以在这里找到:kotlin。
方法 3:将 PulsarR 作为 REST 服务运行
当 PulsarR 作为 REST 服务运行时,无需打开 IDE,即可随时随地使用 X-SQL 爬取网页或直接查询网页数据。
从源代码构建
git clone https://github.com/platonai/pulsar.git
cd pulsar && bin/build-run.sh
对于国内开发者,我们强烈建议您按照本指南加快构建速度。
使用 X-SQL 查询 Web
如果没有,启动 pulsar 服务器:
bin/pulsar
在另一个终端窗口中抓取网页:
bin/scrape.sh
bash 脚本就像使用 curl 发送 X-SQL 一样简单:
curl -X POST --location "http://localhost:8182/api/x/e" -H "Content-Type: text/plain" -d "
select
dom_base_uri(dom) as url,
dom_first_text(dom, '#productTitle') as title,
str_substring_after(dom_first_href(dom, '#wayfinding-breadcrumbs_container ul li:last-child a'), '&node=') as category,
dom_first_slim_html(dom, '#bylineInfo') as brand,
cast(dom_all_slim_htmls(dom, '#imageBlock img') as varchar) as gallery,
dom_first_slim_html(dom, '#landingImage, #imgTagWrapperId img, #imageBlock img:expr(width > 400)') as img,
dom_first_text(dom, '#price tr td:contains(List Price) ~ td') as listprice,
dom_first_text(dom, '#price tr td:matches(^Price) ~ td') as price,
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 1d -njr 3', 'body');"
示例代码可以在这里找到:bash、batch、java、kotlin、php。
Json格式的响应如下:
{
"uuid": "cc611841-1f2b-4b6b-bcdd-ce822d97a2ad",
"statusCode": 200,
"pageStatusCode": 200,
"pageContentBytes": 1607636,
"resultSet": [
{
"title": "Tara Toys Ariel Necklace Activity Set - Amazon Exclusive (51394)",
"listprice": "$19.99",
"price": "$12.99",
"categories": "Toys & Games|Arts & Crafts|Craft Kits|Jewelry",
"baseuri": "https://www.amazon.com/dp/B00BTX5926"
}
],
"pageStatus": "OK",
"status": "OK"
}
日志和指标
PulsarR 精心设计了日志和度量子系统来记录系统中发生的每个事件。
PulsarR 会在日志中报告每个页面加载任务执行的状态,因此很容易知道系统中发生了什么,判断系统运行是否健康,回答成功获取了多少页,重试了多少页,重试了多少页使用了代理 IP,等等。
只需注意几个符号,您就可以深入了解整个系统的状态:⚡。
下面是一组典型的任务日志,查看日志格式了解如何阅读日志,一目了然地了解整个系统的状态。
<p>2022-09-24 11:46:26.045 INFO [-worker-14] a.p.p.c.c.L.Task - 3313. ⚡ U for N got 200 580.92 KiB in 1m14.277s, fc:1 | 75/284/96/277/6554 | 106.32.12.75 | 3xBpaR2 | https://www.walmart.com/ip/Restored-iPhone-7-32GB-Black-T-Mobile-Refurbished/329207863 -expires PT24H -ignoreFailure -itemExpires PT1M -outLinkSelector a[href~=/ip/] -parse -requireSize 300000
2022-09-24 11:46:09.190 INFO [-worker-32] a.p.p.c.c.L.Task - 3738. U got 200 452.91 KiB in 55.286s, last fetched 9h32m50s ago, fc:1 | 49/171/82/238/6172 | 121.205.220.179 | https://www.walmart.com/ip/Boost-Mobile-Apple-iPhone-SE-2-Cell-Phone-Black-64GB-Prepaid-Smartphone/490934488 -expires PT24H -ignoreFailure -itemExpires PT1M -outLinkSelector a[href~=/ip/] -parse -requireSize 300000
2022-09-24 11:46:28.567 INFO [-worker-17] a.p.p.c.c.L.Task - 2269. U for SC got 200 565.07 KiB