1500多万种商品的价格每天尽收眼底,我是怎么做到的?

全文共2148字,预计学习时长4分钟


本文的原作者为信息技术和服务企业Waldo的联合创始人、首席技术官Greg Lamp。该企业一直致力于gets you money back when prices drop.也许这篇文章可以为你提供一些做研究或者创业的思路。


图片来源:pexels.com/@belart84

以下为文章全文:


Waldo每天都可以从你最喜欢的卖家那里收集到以上信息


在卖掉第一家数据科学公司后,我决定成立一家新公司,帮助人们轻松地在最近购买过的东西上省钱。


我们将公司命名为Waldo(https://www.getwaldo.com/),致力于帮你拿回多花的冤枉钱。如果你近期购买过的商品降价或促销,Waldo可以自动在价格防护窗口上调整商品的价格。


构建整体规划


Waldo的“人工大脑”其实是一个技术基础设施,能够每天追踪1500多万种线上商品的价格。目前,我们已经追踪了超过70个商家的产品,并且这个数字与日俱增。


必须盯住每一个价格


从工程的角度来看,我们知道,由于在线销售的商品销量大,一些域将更难维护。因此,我们查看了按产品销量划分的零售商分布 ——发现绝大多数域都只有少量产品需要追踪。


按产品销量划分的零售商长尾分布


据此,商品的原始数量不成问题,真正的挑战是如何维护这么多不同的域。


实现这一疯狂想法的方法

因此,为了追踪1500多万种商品的价格,问题可以分为以下两类:

1. 广度—— 追踪70多个域中的商品价格且维护成本不会激增。

2. 频率——价格更新的频率越高,我们能发现的促销就越多,处理退款的速度也就越快。

基于以上两个问题,我们决定针对运行效率和用户定制优化实施时间、可重用性以及维护时间。

给Waldo配备“人工大脑”


我们开始在Waldo支持的每一个域中创建爬虫(scraper)。虽然超文本标记语言(HTML)可能因域而异,但方法是相同的:

1. 获取每个域所有类别的列表

2. 获取每个类别中的所有产品


这意味着创建的爬虫在样式上都非常相似。我们实现了代码的可重用性,这也意味着团队的认知超荷状态减少了。


Navs可以让我们在一个特定域中更快捷地找到所有类别


Python

将Python作为Waldo爬虫堆的编程语言,有两个主要的考虑因素:


1. “自上而下,从左到右”全方位适配

我们最初想着就用node.js(这是我们的web应用程序所使用的语言)。虽然一家公司能拥有统一的编程语言是件好事,但在处理回调和异步操作时,node.js既麻烦又容易出错。因此,我们开始尝试使用Python,感觉非常适配。


https://media.giphy.com/media/BZhvKu7MT0n2voRhtf/giphy.gif


2. 库

Python有着惊人的爬虫生态系统,涵盖了很多库,例如requests(https://2.python-requests.org/en/master/), BeautifulSoup(https://www.crummy.com/software/BeautifulSoup/bs4/doc/)和Scrapy(https://scrapy.org/)。

当涉及到代码可重用性时,Scrapy真的有很大用处。Scrapy拥有大量默认值和丰富的工具集,让最初级的开发人员也可以在短时间内创建有效的爬虫。

Scrapy还内置支持XPaths(https://www.w3schools.com/xml/xml_xpath.asp),我们使用它来解析和提取每个产品页面中的数据。


Scrapinghub

Scrapy的另一个好处就是拥有Scrapinghub(https://scrapinghub.com/)的专业支持。Scrapinghub团队不仅为Scrapy的开源项目提供了新的特性,而且还基于Scrapy管理和运行自己的SaaS产品。

Scrapinghub提供了爬虫管理从调度到弹性伸缩所有的基础设施,使得团队能够专注于爬虫的业务应用,而不是局限于“看护”工作。


XPathHelper

最后一个工具是XPath Helper(https://chrome.google.com/webstore/detail/xpath-helper/hgimnogjllphhhkhlmebbmlgjoejdpjl?hl=en),可以用于测试XPaths的Chrome插件。


Xpaths可能会失控,所以拥有一个沙盒/控制台工具确实有助于调试scraper。


在右上角的文本框中键入XPath,并实时查看结果


质量管理

如果不能及时监控到爬虫质量下降,那它们就没什么价值了。我们发现域有时会改变布局,从而让爬虫能够检测产品价格。两个最常见的问题是:

1. 数据完整性问题(即重复值、产品价格缺失等)

2. 数据缺失(即产品确实在域中,但不在我们的数据库中)


数据完整性

为了解决数据完整性问题,我们进行了很多检验和。检验和是一种简单的检查形式,可以查询检验和来识别那些看起来不太正确的计数。例如,检查数据库中是否有重复的库存量单位(SKU)。

我们有一组每小时运行一次的校验和,以确保所有数据正常。



在这个例子中可以看到,anopolgie.com缺少价格变化


数据缺失

我们只能估计每个域中有多少产品,所以不知道是否已经抓取了整个目录。因此,有时会漏掉产品。

通常,这些产品被隐藏在一些我们认为爬虫无需涉及的模糊类别里。其中一个例子就是网站分类促销产品的方式。假设一款Coach的钱包正在打折。这就可能导致这款包从配饰类别被移到促销类别,甚至是更棘手的清仓类别中(是的,促销和清仓通常是两个独立的类别)。



在上面的例子中,“夏季大甩卖”就是一个完全独立的类别


为了解决这个问题,我们建立了一套手动的质量保证流程,从域中抽取产品样本,并验证它们是否已入库。没错,就是样本。虽然很原始,但非常高效。你会惊讶地发现,人类是多么擅长发现爬虫可能漏掉的产品。

留言 点赞 关注

我们一起分享AI学习与发展的干货

欢迎关注全平台AI垂类自媒体 “读芯术”

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();