Python Scrapy 不会重试超时连接

标签 python web-scraping screen-scraping scrapy

我使用了一些代理来抓取一些网站。这是我在 settings.py 中所做的:

# Retry many times since proxies often fail
RETRY_TIMES = 10
# Retry on most error codes since proxies fail for different reasons
RETRY_HTTP_CODES = [500, 503, 504, 400, 403, 404, 408]

DOWNLOAD_DELAY = 3 # 5,000 ms of delay

DOWNLOADER_MIDDLEWARES = {
                    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware' : None,
                    'myspider.comm.rotate_useragent.RotateUserAgentMiddleware' : 100,

                    'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware': 200,
                    'myspider.comm.random_proxy.RandomProxyMiddleware': 300,

                    'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 400,
                }

我还有一个代理下载中间件,它有以下方法:

def process_request(self, request, spider):
    log('Requesting url %s with proxy %s...' % (request.url, proxy))

def process_response(self, request, response, spider):
    log('Response received from request url %s with proxy %s' % (request.url, proxy if proxy else 'nil'))

def process_exception(self, request, exception, spider):
    log_msg('Failed to request url %s with proxy %s with exception %s' % (request.url, proxy if proxy else 'nil', str(exception)))
    #retry again.
    return request

由于代理有时候不是很稳定,所以process_exception经常会提示很多请求失败的信息。这里的问题是失败的请求再也没有被尝试过。

如前所示,我已经设置了 RETRY_TIMES 和 RETRY_HTTP_CODES 设置,并且还在代理中间件的 process_exception 方法中返回了重试请求。

为什么 scrapy 不再重试失败请求,或者我如何确保至少尝试请求 RETRY_TIMES 我在 settings.py 中设置?

最佳答案

感谢Scrapy IRC channel @nyov的帮助。

'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware': 200,
'myspider.comm.random_proxy.RandomProxyMiddleware': 300,

这里 Retry 中间件首先运行,因此它会在请求到达 Proxy 中间件之前重试该请求。在我的情况下,scrapy 需要代理来抓取网站,否则它会无休止地超时。

所以我颠倒了这两个下载中间件的优先级:

'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware': 300,
'myspider.comm.random_proxy.RandomProxyMiddleware': 200,

关于Python Scrapy 不会重试超时连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20533614/

相关文章:

python - matplotlib 默认移除轴标签偏移量

python - 使用 Selenium 添加新的 CSS

css - 获取 CSS 选择器的前一个同级

python - 当我执行 GET 请求时(在 Python 中),我得到了翻译的文本。如何获取英文内容?

python - 为什么 scrapy 在尝试抓取和解析网站时会为我抛出错误?

python - 使用带修饰协程的单个事件循环返回 future 结果

python - 如何跨多列使用 groupby 转换

python - 基维 : How to use on_key_down and on_key_up keyboard event in Tree View?

python - ScraperWiki 数据存储区需要什么编码?

python - 在Linux服务器中使用Scrapy Crawlera时,连接被对方​​拒绝: 111: Connection refused.