3 回答
TA贡献1796条经验 获得超10个赞
当达到最大重试次数时,类似的方法parse_error()应该处理蜘蛛中存在的任何错误:
def start_requests(self):
for start_url in self.start_urls:
yield scrapy.Request(start_url,errback=self.parse_error,callback=self.parse,dont_filter=True)
def parse_error(self, failure):
# print(repr(failure))
pass
然而,我想在这里提出一种完全不同的方法。如果您采用以下路线,则根本不需要任何自定义中间件。包括重试逻辑在内的所有内容都已经存在于蜘蛛中。
class mySpider(scrapy.Spider):
name = "myspider"
start_urls = [
"some url",
]
proxies = [] #list of proxies here
max_retries = 5
retry_urls = {}
def parse_error(self, failure):
proxy = f'https://{ip:port}'
retry_url = failure.request.url
if retry_url not in self.retry_urls:
self.retry_urls[retry_url] = 1
else:
self.retry_urls[retry_url] += 1
if self.retry_urls[retry_url] <= self.max_retries:
yield scrapy.Request(retry_url,callback=self.parse,meta={"proxy":proxy,"download_timeout":10}, errback=self.parse_error,dont_filter=True)
else:
print("gave up retrying")
def start_requests(self):
for start_url in self.start_urls:
proxy = f'https://{ip:port}'
yield scrapy.Request(start_url,callback=self.parse,meta={"proxy":proxy,"download_timeout":10},errback=self.parse_error,dont_filter=True)
def parse(self,response):
for item in response.css().getall():
print(item)
不要忘记添加以下行以从上述建议中获得上述结果:
custom_settings = {
'DOWNLOADER_MIDDLEWARES': {
'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
}
}
顺便说一句,我正在使用 scrapy 2.3.0。
TA贡献1876条经验 获得超5个赞
也许问题不在您这边,但第三方网站可能有问题。也许他们的服务器上存在连接错误,或者可能是安全的,所以没有人可以访问它。
因为该错误甚至表明该错误与一方有关,该错误已关闭或无法正常工作,可能首先检查第三方站点是否在请求时正常工作。如果可以的话尝试联系他们。
因为错误不是在你这边,而是在党那边,正如错误所说。
添加回答
举报