【问题标题】:How do I make Scrapy print all duplicate urls?如何让 Scrapy 打印所有重复的 url?
【发布时间】:2014-02-05 07:12:30
【问题描述】:

我在日志中收到此消息一次:

2014-01-16 12:41:45+0100 [mybot] DEBUG: Filtered duplicate request: <GET https://mydomain/someurl> - no more duplicates will be shown (see DUPEFILTER_CLASS)

该 url 是使用 Request() 请求的,它在第一次请求时说它是重复的。我不知道这是什么原因造成的。我能做些什么来调试这个?如何让它打印它过滤的所有重复 url?

【问题讨论】:

  • 页面是否被重定向到同一页面或其他页面?
  • 不,这不是重定向。我创建了 Request() 但它甚至不发送请求而是跳过它说它是重复的。
  • 我有过一次,在这种情况下,您可以在创建 Request 时添加 dont_filter=True
  • 添加 dont_filter=True 将导致它试图解决的更多问题。我确实想过滤重复项,但前提是它确实是重复项。
  • 好吧,Scrapy 不会无缘无故地过滤,所以希望你能在控制台日志中找到一些解释(你可以在这里分享,如果需要,删除域信息),也许还有我在下面建议的 DupeFilter。页面中是否有元刷新?

标签: python scrapy


【解决方案1】:

您可能需要创建自己的 DupeFilter

from scrapy.dupefilter import RFPDupeFilter

class VerboseRFPDupeFilter(RFPDupeFilter):

    def log(self, request, spider):
        fmt = "Filtered duplicate request: %(request)s"
        log.msg(format=fmt, request=request, level=log.DEBUG, spider=spider)

并将 DUPEFILTER_CLASS 设置为这个新类 (http://doc.scrapy.org/en/latest/topics/settings.html#dupefilter-class)

【讨论】:

    【解决方案2】:

    使用curl -v URL 尝试精确的网址,并查看标头是否包含 301 或 302。或者,您可以尝试 scrapy shell URL

    当参数的顺序或预期的字母大小写不同时,我看到一些网站会重定向到同一页面。 Scrapy 在比较两个请求对象时不考虑参数的顺序或字母大小写。

    【讨论】:

    • 我已经检查过了。它不是重定向。有问题的 URL 根本不是由 scrapy 请求的。我在wireshark中检查了它。该请求是我自己使用 Request() 创建的。它以前从未被爬过。很奇怪。控制台日志中没有可在此处发布的内容。它只是说重复的 URL,但我可以在控制台日志中清楚地看到它不是重复的,并且从来没有任何重定向。
    • 你在使用JOBDIR吗?在这种情况下,dupefilter 会保留在 JOBDIR 内的文件 requests.seen 中看到的请求。
    • 是的,我正在使用 JOBDIR,我尝试在运行之前将其删除。我也试过没有 JOBDIR。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 2011-08-23
    相关资源
    最近更新 更多