包装机器

从千亿页面上提取数据所总结的五大经验

发布时间:2022/12/4 8:35:32   
冬季白癜风护理 http://m.39.net/pf/a_6856344.html

如今从网上抓取数据看似非常容易。有许多开源库和框架、可视化抓取工具和数据提取工具,可以很容易地从一个网站上抓取数据。但是,当你想大规模地搜索网站时,很快就会感觉到非常棘手。

本文中,我们将与你分享自年以来借助Scrapinghub从一千亿个产品页面上抓取数据时所学到的经验教训,让你深入了解从电子商务店铺大规模提取产品数据时面临的挑战,并与你分享一些应对这些挑战的最佳实践经验。

Scrapinghub成立于年,是数据提取公司中的佼佼者之一,也是Scrapy的缔造者——Scrapy是当今最强大、最受欢迎的网络抓取框架。目前,Scrapinghub为全球众多的大型电子商务公司每月抓取超过80亿的页面(其中30亿是产品页面)。

大规模抓取网页的要点

与标准的抓取网页应用程序不同,大规模抓取电子商务的产品数据将面临一系列独特的挑战,这使得网页抓取异常艰难。

从本质上来说,这些困难可以归结为两个方面:速度和数据质量。

通常时间是一个限制性约束,因此大规模抓取需要网络爬虫以非常高的速度抓取页面,并不会影响数据质量。这种对速度的要求造成大量抓取产品数据富有非常大的挑战性。

挑战1:杂乱且变幻无常的网页格式

杂乱且变化无常的网页格式可能是最常见的挑战,也可能不是最令人感兴趣的挑战,但它是迄今为止大规模提取数据时面临的最大挑战。这项挑战的关键不在于复杂性,而是需要花费大量时间和资源去处理。

如果你有过创建电子商务店铺爬虫经历的话,你就会知道电子商务店铺代码的杂乱无章是普遍现象。这不仅仅是HTML的格式或偶尔的字符编码问题。多年来,我们遇到了各种各样的问题,例如滥用HTTP响应代码、不完整的JavaScripts,或滥用Ajax:

在产品销售终止后,店铺会删除页面,且在网站升级后错误处理程序突然返回的响应状态为;有些页面错误地转义JSON数据,导致页面上的Javascript遭到破坏,例如‘b0rk’d’等,所以必须使用正则表达式来删除这些数据;店铺大量滥用Ajax调用,所以只能等页面渲染完毕(这会导致爬虫速度更慢)或模仿API调用(这会导致额外的开发工作)才能想要的拿到信息。如此杂乱的代码会让编写爬虫工作十分痛苦,且无法使用抓取工具或自动提取工具。

在大规模抓取网页时,你不仅需要浏览几百个像这样杂乱的网站,还要处理网站的不断更新。一个经验法则是:每2-3个月目标网站的变动就会废掉你的爬虫。

可能听起来不是什么大不了的事儿,但是当你大规模抓取时,这些意外会积累成灾。例如,Scrapinghub的一个大型电子商务项目大约有个爬虫,需要抓取个电子商务网站,这意味着每天他们都有20-30只爬虫遭遇失败。

来自区域和多语言网站布局的变动,A/B分割测试和包装/定价变动也会经常给爬虫带来问题。

没有捷径

很不幸的是,没有完全解决这些问题的灵丹妙药。很多时候,我们只能随着规模扩展投入更多资源。以上述项目为例,负责项目的团队共有18名爬虫工程师和3名专职QA,以确保客户始终拥有可靠的数据。

但是,凭借经验团队可以学会如何创建更强大的爬虫,以便检测和对付网站格式的各种怪招。

最佳做法不是为目标网站可能使用的所有布局逐一编写爬虫,而是仅凭一个产品提取的爬虫就可以处理不同页面布局所使用的所有可能规则和方案。爬虫拥有的配置越多越好。

虽然这些做法会让爬虫更加复杂(我们的一些爬虫长达几千行),但可以保证爬虫更加易于维护。

由于大多数公司需要每天都抽取产品数据,所以我们无法花费几天时间等待工程团队修改遭到破坏的爬虫。对于这种情况,Scrapinghub使用一种基于数据提取工具的机器学习,我们开发了这种机器学习模型作为后备,直到爬虫被修复。这种基于机器学习的提取工具可以自动识别目标网站的目标字段(产品名称、价格、货币、图像、SKU等等),并返回所需的结果。

挑战2:可扩展性架构

你将面临的下一个挑战是:构建一个爬虫基础架构,该架构可以随着每天请求数量的增加而扩展,而不会降低性能。

当大规模提取产品数据时,简单的网页爬虫只能连续地抓取数据,而不会节选。通常,一个连续的网页抓取会循环发送请求,一个接一个,每个请求需要2-3秒才能完成。

如果爬虫每天都请求量小于4万个的话(每2秒发送一个请求,意味着每天可以发送43,个请求),这个方法还可以。但是,一旦请求数量超过这个数,你就需要切换到每天可以发送几百万请求且不会降低性能的爬虫架构。

正如上述讨论,速度是大规模抓取产品数据的关键。你需要确保在一定时间内(通常为一天)找到并抓取所有所需的产品页面。为此,你需要执行以下操作:

从产品提取中分离产品搜索

为了大规模提取产品数据,你需要从产品提取爬虫中分离产品搜索爬虫。

产品搜索爬虫的目标应该是找到目标产品种类(或“货架”),并保存该种类下产品的URL,以供产品提取爬虫使用。当产品搜索爬虫将产品URL加到队列后,产品提取爬虫会从茶品页面上抓取目标数据。

这项工作可以借助流行的爬虫工具的辅助,例如由Scrapinghub开发的开源爬虫工具Frontera等。虽然最初设计Frontera是为了用于Scrapy,但它完全没有限制,可以与任何其他爬虫框架或独立项目一起使用。在本文中,我们将分享如何使用Frontera大量挖掘HackerNews的数据。

为产品提取分配更多资源

由于每个产品类别“货架”可以包含10到个产品,且与提取产品URL相比,提取产品数据需要更多资源,因此搜索爬虫的速度通常比产品抽取爬虫更快。对于这种情况,你需要为每个搜索爬虫配备多个抽取爬虫。经验法则是:每,页需要创建一直单独的抽取爬虫。

挑战3:维持吞吐量性能

大规模抓取很像赛车Formula1,我们的目标是为了提高速度,尽可能地减轻车身重量,并从发动机中挤出最后一部分马力。对于大规模网络抓取也是如此。

在提取大量数据时,我们必须尽可能寻找可以将周期时间降到最小、并在现有硬件资源的基础上将爬虫性能提高到最大的方法。所有这些都必须减少每个请求的时间,哪怕是几毫秒。

为此,你的团队需要深入了解正在使用的网页抓取框架、代理管理和硬件,才能更好地调优,以获取最佳性能。你还需要

转载请注明:http://www.aideyishus.com/lkcf/2665.html

------分隔线----------------------------