我有一个Scrapy项目,可以解析大约30多个列表站点,并且我试图找到一种方法来解决如果更新任何站点的底层Web结构时如何维护和监视刮板的一致性。
我已经尝试了两种方法来实现这一目标:
我有一套规则DropItem
,如果不存在一些核心字段(产品标题,价格以及其他始终存在的其他几个字段)。这有所帮助,但是假设如果这3/4个字段都可以,那么结构的其余部分也可以。对于上下文,我无法使所有其他必填字段成为必需字段(例如colour
,size
等)
我通过在每个本地蜘蛛的一组本地保存的HTML正文上运行抓取工具来发挥最大的作用。这对整体代码质量有好处,但不能解决确定蜘蛛可能由于DOM更改而损坏的问题。
我想按照以下方式做一些事情;
size
次出现30%
,则返回90%
或1%
的作业可能会发出警报。但是,我可以想到许多情况,这可能会触发许多错误的肯定结果,甚至不会触发某件事并且仍然被破坏TL; DR
如何监视HTML页面结构的更改,从而避免运行会导致数据损坏的Scrapy作业?
还有哪些其他选项可以检测刮削作业是否已损坏,启发式或其他方式? DropItem
已被尽可能使用。
答案 0 :(得分:2)
我亲自用Prometheus监视我的蜘蛛群。 Prometheus是用于从Web服务收集指标的数字数据的监视解决方案。即您的服务必须在HTTP端点上公开指标,然后Prometheus将从那里收集指标。
这对于开箱即用的Scrapy无效,因为会在一段时间后完成可抓取的蜘蛛。对我来说,它奏效了,因为我为自己开发了a Python project that schedules scrapy spiders。但是,其他方法也是可能的:
在大多数情况下,我建议使用 Push Gateway 方法,因为它可以与标准的scrapy spider一起使用,而无需付出更多努力。
我个人将这两个指标传递给普罗米修斯:
我目前无法使用Prometheus监视蜘蛛内部发生的事情,因为我在进程外运行了蜘蛛,但是可以在现有的Python进程内部运行scrapy(使用Push Gateway方法,您将直接从蜘蛛程序,因此您可以从抓取程序中访问所有数据。
这是我的活动监视器的屏幕截图。 “每日项目数”图表中的每一行都是一只蜘蛛,而我当前的触发器是“低于1”。即如果蜘蛛完全失败,我会收到一封电子邮件。由于某些蜘蛛可能有几天没有数据,因此我有另一个触发器“每周项目数”。
如果您有更详细的数据,当然可以使用更完善的过滤器。
答案 1 :(得分:1)
Spidermon是Scrapy蜘蛛的扩展。套餐提供 用于数据验证,统计信息监视和通知的有用工具 消息。这样,您将监视任务留给了Spidermon, 检查报告/通知。
答案 2 :(得分:1)
我编写了一个测试框架,用于测试爬虫与称为scrapy-test
的实时数据和缓存数据。该框架专注于测试解析和爬网范围。
您可以定义字段的测试:
foreach ( Counter c in counters)
{
Console.WriteLine("Name is: {0} Value is: {1}", Name, Value);
}
以及统计信息:
from scrapytest.tests import Match, Equal, Type, MoreThan, Map, Len, Required
from myspider.items import PostItem
class TestPost(ItemSpec):
# defining item that is being covered
item_cls = PostItem
# defining field tests
title_test = Match('.{5,}')
points_test = Type(int), MoreThan(0)
author_test = Type(str), Match('.{3}')
# every item should have title - 100%
title_cov = 100
因此,class TestStats(StatsSpec):
# stat pattern: test functions
validate = {
'log_count/ERROR$': LessThan(1),
'item_scraped_count': MoreThan(1),
'finish_reason': Match('finished'),
}
的一般工作流程是每天/每半小时运行一次测试,以维持蜘蛛健康。
答案 3 :(得分:1)
比方说,大小是输出csv中的第三个字段,您可以使用以下代码查看最后10个字段中有多少个丢失:
tail output.csv |切-f3 -d,| grep -v [0-9] | wc -l </ p>
然后,您可以在图表上找到可视化的内容或在满足条件时发出警报。 I think this project looks interesting