English | 简体中文
Exotic Amazon 是采集整个 amazon.com 网站的完整解决方案,开箱即用,包含亚马逊大多数数据类型,它将永久免费提供并开放源代码。
其他电商平台数据采集,其方法和流程基本类似,可以在该项目基础上修改调整业务逻辑即可,其基础设施解决了所有大规模数据采集面临的难题。
得益于 PulsarRPA (中文) 提供的完善的 Web 数据管理基础设施,整个解决方案由不超过 3500 行的 kotlin 代码和不到 700 行的 X-SQL 组成,以提取 650 多个字段。
- Best Seller - 每天更新,约 32,000 个类别,约 4,000,000 个产品记录
- Most Wished For - 每天更新约 25,000 个类别,约 3,500,000 个产品记录
- New Releases - 每天更新,约 25,000 个类别,约 3,000,000 条产品记录
- Movers and Shakers - 约 20 个类别,每小时更新一次
- Products - 约 20,000,000 个产品,每月更新
- 100多个字段
- 标题、价格、库存、图像、描述、规格、店铺等
- 赞助产品、类似产品、相关产品等
- 阅读评论
- 热门评论
- Review - 每天更新
如果 maven 版本号是 3.8.1 或以上,需要在 .m2/settings.xml
文件中加入如下代码:
<mirrors>
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>dummy</mirrorOf>
<name>Dummy mirror to override default blocking mirror that blocks http</name>
<url>http://0.0.0.0/</url>
</mirror>
</mirrors>
或者如果这个文件不存在,可以直接拷贝 settings.xml 到 .m2 目录下。在 Q/A 章节可以找到关于 .m2/settings.xml 的基本介绍。
对于国内开发者,我们强烈建议您按照 这个 指导来加速构建。
现在可以开始了构建了:
# build
git clone https://github.com/platonai/exotic-amazon.git
cd exotic-amazon && mvn -DskipTests=true
####################
# On Linux:
# run in development mode
java -jar target/exotic-amazon*.jar
# run in production mode
ENV=prod java -jar target/exotic-amazon*.jar
####################
# On Windows:
# run in development mode
java -jar target/exotic-amazon-{the-actual-version}.jar
# run in production mode
ENV=prod java -jar target/exotic-amazon-{the-actual-version}.jar
一旦运行成功,你可以打开 System Glances 以一目了然地查看系统状态。
现在主流网站常用反爬手段基本都用了,譬如Cookie跟踪,IP跟踪,访问频率限制,访问轨迹跟踪,CSS 混淆等等。
使用基本的 HTTP 协议采集的话,会陷入无穷无尽的爬虫/反爬虫对抗中,得不偿失,并且未必能解决,譬如说采用了动态自定义字体的站点就不可能解决。
使用浏览器自动化工具如 selenium, playwright, puppeteer 等进行数据采集,会被检测出来并直接屏蔽。
使用 puppeteer-extra, apify/crawlee 这样的工具,虽然提供了 WebDriver 隐身特性,一定程度上缓解了这个问题,但仍然没有完全解决。
- 上述工具没有解决访问轨迹跟踪问题
- Headless 模式能够被检测出来。云端爬虫通常以 headless 模式运行,即使做了 WebDriver 隐身, headless 模式也能够被检测出来
- 其他爬虫对抗问题
即使解决完上述问题,也仅仅是入门而已。在大规模采集下,仍然面临诸多困难:
- 如何正确轮换IP?事实上,仅轮换IP是不够的,我们提出“隐私上下文轮换”
- 如何使用单台机器每天提取数千万数据点?
- 如何保证数据准确性?
- 如何保证调度准确性?
- 如何保证分布式系统弹性?
- 如何正确提取 CSS 混淆 的字段,它的 CSSPath/XPath/Regex 每个网页都不同,有什么技术解决?
- 如何采集数百个电商站点并避免爬虫失效?
- 如何降低总体拥有成本?
所有 提取规则 都是用 X-SQL 编写的。数据类型转换、数据清理也由强大的 X-SQL 内联处理,这也是我们需要 X-SQL 的部分原因。
一个很好的 X-SQL 例子是 x-asin.sql,它从每个产品页面中提取 70 多个字段: x-asin.sql.
默认情况下,结果以 json 格式写入本地文件系统:
Linux:
cd /tmp/pulsar-$USER/cache/web/export/amazon/json
ls
Windows:
echo %TMP%
echo %username%
cd %TMP%\pulsar-%username%/cache/web/export/amazon/json
dir
Mac:
echo $TMPDIR
echo $USER
echo $TMPDIR/pulsar-$USER/cache/web/export/amazon/json
ls
有几种方法可以将结果保存到数据库中:
- 将结果序列化为键值对,并保存为 WebPage 对象的一个字段,这是整个系统的核心数据结构
- 将结果写入 JDBC 兼容的数据库,如 MySQL、PostgreSQL、MS SQL Server、Oracle 等
- 自行编写几行代码,将结果保存到您希望的任何目的地
默认情况下,提取的字段也作为键值对保存到 WebPage.pageModel.
- 正确配置 AmazonJdbcSinkSQLExtractor.jdbcCommitter
- 数据库模式: schema
- 页面模型和数据库模式映射: extract-config.json
- 页面模型和提取规则: X-SQLs
您可以编写几行附加代码,将结果保存到您希望的任何目的地, 查看 AmazonJdbcSinkSQLExtractor.onAfterExtract() 了解如何编写自己的持久层。
- RPA:机器人流程自动化、模仿人类行为、采集单网页应用程序或执行其他有价值的任务
- 高性能:高度优化,单机并行渲染数百页而不被屏蔽
- 低成本:每天抓取 100,000 个浏览器渲染的电子商务网页,或 n * 10,000,000 个数据点,仅需要 8 核 CPU/32G 内存
- 数据质量保证:智能重试、精准调度、Web 数据生命周期管理
- 简洁的 API:一行代码抓取,或者一条 SQL 将整个网站栏目变成表格
- X-SQL:扩展 SQL 来管理 Web 数据:网络爬取、数据采集、Web 内容挖掘、Web BI
- 爬虫隐身:浏览器驱动隐身,IP 轮换,隐私上下文轮换,永远不会被屏蔽
- 大规模采集:完全分布式,专为大规模数据采集而设计
- 大数据支持:支持各种后端存储:本地文件/MongoDB/HBase/Gora
- 日志和指标:密切监控并记录每个事件
- Minimum memory requirement is 4G, 8G is recommended for test environment, 32G is recommended for product environment
- The latest version of the Java 11 JDK
- Java and jar on the PATH
- Maven 3.2+
- Google Chrome 90+
- MongoDB started
PulsarRPA 精心设计了日志和指标子系统,以记录系统中发生的每一个事件。
PulsarRPA 在日志中报告每个页面加载任务执行的状态,因此很容易知道系统中发生了什么,判断系统运行是否健康、回答成功获取多少页面、重试多少页面、使用了多少代理 IP。
只需注意几个符号,您就可以深入了解整个系统的状态:💯 💔 🗙 ⚡ 💿 🔃 🤺。
下面是一组典型的页面加载日志,查看 日志格式 了解如何阅读日志,从而一目了然地了解整个系统的状态。
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 <- 543.41 KiB in 1m22.767s, last fetched 16m58s ago, fc:6 | 58/230/98/295/6272 | 27.158.125.76 | 9uwu602 | https://www.walmart.com/ip/Straight-Talk-Apple-iPhone-11-64GB-Purple-Prepaid-Smartphone/356345388?variantFieldId=actual_color -expires PT24H -ignoreFailure -itemExpires PT1M -outLinkSelector a[href~=/ip/] -parse -requireSize 300000
2022-09-24 11:47:18.390 INFO [r-worker-8] a.p.p.c.c.L.Task - 3732. 💔 ⚡ U for N got 1601 0 <- 0 in 32.201s, fc:1/1 Retry(1601) rsp: CRAWL, rrs: EMPTY_0B | 2zYxg52 | https://www.walmart.com/ip/Apple-iPhone-7-256GB-Jet-Black-AT-T-Locked-Smartphone-Grade-B-Used/182353175?variantFieldId=actual_color -expires PT24H -ignoreFailure -itemExpires PT1M -outLinkSelector a[href~=/ip/] -parse -requireSize 300000
2022-09-24 11:47:13.860 INFO [-worker-60] a.p.p.c.c.L.Task - 2828. 🗙 🗙 U for SC got 200 0 <- 348.31 KiB <- 684.75 KiB in 0s, last fetched 18m55s ago, fc:2 | 34/130/52/181/5747 | 60.184.124.232 | 11zTa0r2 | https://www.walmart.com/ip/Walmart-Family-Mobile-Apple-iPhone-11-64GB-Black-Prepaid-Smartphone/209201965?athbdg=L1200 -expires PT24H -ignoreFailure -itemExpires PT1M -outLinkSelector a[href~=/ip/] -parse -requireSize 300000
有三种方法可以查看指标:
- Check logs/pulsar.m.log
- Open System Glances which is a Web UI to show the most metrics
- Install graphite on the same machine, and open http://127.0.0.1/ to view the graphical report
A: 点击查看 如何管理 IP
A: 它是用来设置 maven 参数的配置文件。Settings.xml
中包含本地仓库位置、修改远程仓库服务器、认证信息等配置。一般存在于两个位置:
全局配置:
${maven.home}/conf/settings.xml
用户配置:
${user.home}/.m2/settings.xml
如果这个文件不存在,你可以拷贝 settings.xml
到 .m2
目录下。
A: 你可以看看下面几个调用的 代码 逻辑:
AmazonJdbcSinkSQLExtractor.collectHyperlinks ->
amazonLinkCollector.collectReviewLinksFromProductPage,
amazonLinkCollector.collectSecondaryReviewLinks,
amazonLinkCollector.collectSecondaryReviewLinksFromPagination
A:
- 阅读 LoadOptions 文档,它描述一个任务该怎么处理
- 参考 PredefinedTask,它定义了亚马逊特定任务。PredefinedTask 的设置最终会被转换 LoadOptions 参数
- 定时任务在 CrawlScheduler 中设置
A: 参看本文档 将提取结果保存到数据库中 章节。
微博:galaxyeye 邮箱:galaxyeye@live.cn, ivincent.zhang@gmail.com Twitter: galaxyeye8 微信:galaxyeye