3 回答

TA貢獻2041條經(jīng)驗 獲得超4個贊
嘗試修復(fù)刮刀本身的代碼。有時,錯誤的解析函數(shù)可能會導(dǎo)致您所描述的那種錯誤。一旦我修復(fù)了代碼,它就消失了。

TA貢獻1796條經(jīng)驗 獲得超10個贊
當(dāng)達到最大重試次數(shù)時,類似的方法parse_error()應(yīng)該處理蜘蛛中存在的任何錯誤:
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
然而,我想在這里提出一種完全不同的方法。如果您采用以下路線,則根本不需要任何自定義中間件。包括重試邏輯在內(nèi)的所有內(nèi)容都已經(jīng)存在于蜘蛛中。
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)
不要忘記添加以下行以從上述建議中獲得上述結(jié)果:
custom_settings = {
'DOWNLOADER_MIDDLEWARES': {
'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
}
}
順便說一句,我正在使用 scrapy 2.3.0。

TA貢獻1876條經(jīng)驗 獲得超5個贊
也許問題不在您這邊,但第三方網(wǎng)站可能有問題。也許他們的服務(wù)器上存在連接錯誤,或者可能是安全的,所以沒有人可以訪問它。
因為該錯誤甚至表明該錯誤與一方有關(guān),該錯誤已關(guān)閉或無法正常工作,可能首先檢查第三方站點是否在請求時正常工作。如果可以的話嘗試聯(lián)系他們。
因為錯誤不是在你這邊,而是在黨那邊,正如錯誤所說。
添加回答
舉報