编写可维护的Web scrappers的最佳实践是什么?

Neo*_*ang 11 python beautifulsoup web-scraping web

我需要实现一些抓取工具来抓取一些网页(因为该网站没有开放的API),提取信息并保存到数据库.我目前正在使用漂亮的汤来编写这样的代码:

discount_price_text = soup.select("#detail-main del.originPrice")[0].string;
discount_price = float(re.findall('[\d\.]+', discount_price_text)[0]);
Run Code Online (Sandbox Code Playgroud)

我想这样的代码在网页更改时很容易变得无效,甚至是轻微的.除了编写回归测试以定期运行以捕获故障之外,我应该如何编写不易受这些更改影响的scrappers?

特别是,即使原始的xpath/css选择器不再有效,是否有任何现有的"智能剪贴板"可以"尽力猜测"?

Dav*_*vid 8

页面有可能发生如此剧烈的变化,以至于构建一个非常"智能"的刮刀可能会非常困难; 如果可能的话,即使使用机器学习等技术,刮刀也会有些不可预测.制造具有可靠性和自动化灵活性的刮刀很难.

可维护性在某种程度上是以如何定义和使用选择器为中心的艺术形式.

在过去,我已经推出了自己的"两阶段"选择器:

  1. (find)第一阶段非常不灵活,并检查页面的结构是否符合所需元素.如果第一阶段失败,那么它会抛出某种"页面结构已更改"错误.

  2. (检索)然后第二阶段有些灵活,并从页面上的所需元素中提取数据.

这使得刮刀可以通过一定程度的自动检测将自身与剧烈的页面更改隔离开来,同时仍然保持一定程度的可靠灵活性.

我经常使用xpath选择器,它真的很令人惊讶,通过一些练习,你可以灵活地使用一个好的选择器,同时仍然非常准确.我确信css选择器很相似.页面设计的语义和"平面"越多越容易.

要回答的几个重要问题是:

  1. 您希望在页面上更改什么?

  2. 您希望在页面上保持不变?

在回答这些问题时,您的选择器越精确越好.

最后,您可以选择要承担多少风险,选择器的可信度,在页面上查找和检索数据时,如何制作它们会产生很大的不同; 理想情况下,最好从web-api获取数据,希望更多的资源可以开始提供.


编辑:小例子

使用您想要的元素所在的场景,.content > .deal > .tag > .price常规.content .price选择器对于页面更改非常"灵活"; 但是,如果出现假阳性因素,我们可能希望避免从这个新元素中提取.

使用两阶段选择器,我们可以指定一个不太通用,更不灵活的第一阶段.content > .deal,然后是第二个更一般的阶段,比如.price使用对于第一阶段结果的查询来检索最终元素.

那么为什么不使用像.content > .deal .price

对于我的使用,我希望能够检测大页面更改,而无需单独运行额外的回归测试.我意识到,不是一个大的选择器,我可以编写第一个阶段来包含重要的页面结构元素.如果结构元素不再存在,则第一阶段将失败(或报告).然后我可以编写第二个阶段来更优雅地检索与第一阶段结果相关的数据.

我不应该说这是一种"最好"的做法,但它运作良好.