【问题标题】:Scrapy: how to debug scrapy lost requestsScrapy:如何调试scrapy丢失的请求
【发布时间】:2013-12-21 20:46:21
【问题描述】:

我有一个爬虫,但它有时不返回请求。

我发现通过在产生请求之前和获得响应之后添加日志消息。

Spider 遍历页面并解析链接以在每个页面上进行项目报废。

这是部分代码

SampleSpider(BaseSpider):
    ....
    def parse_page(self, response):
        ...
        request = Request(target_link, callback=self.parse_item_general)
        request.meta['date_updated'] = date_updated
        self.log('parse_item_general_send {url}'.format(url=request.url), level=log.INFO)
        yield request

    def parse_item_general(self, response):
        self.log('parse_item_general_recv {url}'.format(url=response.url), level=log.INFO)
        sel = Selector(response)
        ...

我比较了每条日志消息的数量,“parse_item_general_send”比“parse_item_general_recv”多

最终统计没有 400 或 500 错误,所有响应状态码只有 200。看起来请求就消失了。

我还添加了这些参数以尽量减少可能的错误:

CONCURRENT_REQUESTS_PER_DOMAIN = 1
DOWNLOAD_DELAY = 0.8

由于twisted的异步特性,我不知道如何调试这个bug。 我发现了一个类似的问题:Python Scrapy not always downloading data from website,但没有任何回应

【问题讨论】:

  • 尝试禁用异地中间件看看会发生什么。
  • 我试过(基于this example,没有任何改变。有些请求消失了。从大约120个请求中的2到5总是消失。
  • 您能否提供一个重现此问题的最小示例?否则将很难指出哪里出了问题,因为这不是一个常见问题。
  • 或者,尝试将dont_filter=True 添加到您的Request 对象中。通常重复请求会被过滤掉,恕不另行通知。您的请求可能会被重定向到已访问过的请求并因此被过滤。
  • 我尝试创建简短的演示脚本,它可以正常工作而不会出错。因此,正如预期的那样,蜘蛛代码中的某个地方出现了错误。可能我在条件下使用了错误的产量。当找出根本原因时,我会更新问题

标签: python twisted scrapy


【解决方案1】:

开,和Rho一样的音符,可以添加设置

DUPEFILTER_CLASS = 'scrapy.dupefilter.BaseDupeFilter' 

到您的“settings.py”,这将删除 url 缓存。这是一个棘手的问题,因为scrapy 日志中没有调试字符串告诉您它何时使用缓存结果。

【讨论】:

  • 我遇到了同样的问题。不知何故,我总是丢失 30 个请求,而且总是相同的请求。在我的 settings.py 文件中设置此选项后,一切正常。
猜你喜欢
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
相关资源
最近更新 更多