Я запускаю паук Scrapy в python для очистки изображений с веб-сайта. Одно из изображений не загружается (даже если я пытаюсь загрузить его регулярно через сайт), что является внутренней ошибкой для сайта. Это прекрасно, я не забочусь о том, чтобы попытаться получить изображение, я просто хочу пропустить изображение, когда оно не удается, и переместиться на другие изображения, но я продолжаю получать ошибку 10054.Scrapy: Ошибка 10054 после повторного загрузки изображения
> Traceback (most recent call last): File
> "c:\python27\lib\site-packages\twisted\internet\defer.py", line 588,
> in _runCallbacks
> current.result = callback(current.result, *args, **kw) File "C:\Python27\Scripts\nhtsa\nhtsa\spiders\NHTSA_spider.py", line 137,
> in parse_photo_page
> self.retrievePhoto(base_url_photo + url[0], url_text) File "C:\Python27\Scripts\nhtsa\nhtsa\retrying.py", line 49, in wrapped_f
> return Retrying(*dargs, **dkw).call(f, *args, **kw) File "C:\Python27\Scripts\nhtsa\nhtsa\retrying.py", line 212, in call
> raise attempt.get() File "C:\Python27\Scripts\nhtsa\nhtsa\retrying.py", line 247, in get
> six.reraise(self.value[0], self.value[1], self.value[2]) File "C:\Python27\Scripts\nhtsa\nhtsa\retrying.py", line 200, in call
> attempt = Attempt(fn(*args, **kwargs), attempt_number, False) File "C:\Python27\Scripts\nhtsa\nhtsa\spiders\NHTSA_spider.py", line
> 216, in retrievePhoto
> code.write(f.read()) File "c:\python27\lib\socket.py", line 355, in read
> data = self._sock.recv(rbufsize) File "c:\python27\lib\httplib.py", line 612, in read
> s = self.fp.read(amt) File "c:\python27\lib\socket.py", line 384, in read
> data = self._sock.recv(left) error: [Errno 10054] An existing connection was forcibly closed by the remote
Вот моя функция синтаксического анализа, который смотрит на страницы с фотографией и находит важный URL,:
def parse_photo_page(self, response):
for sel in response.xpath('//table[@id="tblData"]/tr'):
url = sel.xpath('td/font/a/@href').extract()
table_fields = sel.xpath('td/font/text()').extract()
if url:
base_url_photo = "http://www-nrd.nhtsa.dot.gov/"
url_text = table_fields[3]
url_text = string.replace(url_text, " ","")
url_text = string.replace(url_text," ","")
self.retrievePhoto(base_url_photo + url[0], url_text)
Вот моя функция загрузки с повторной попытки декоратора:
from retrying import retry
@retry(stop_max_attempt_number=5, wait_fixed=2000)
def retrievePhoto(self, url, filename):
fullPath = self.saveLocation + "/" + filename
urllib.urlretrieve(url, fullPath)
Он повторит скачайте 5 раз, но затем выдает ошибку 10054 и не переходит к следующему изображению. Как я могу заставить паука продолжать работу после повторной попытки? Опять же, я не забочусь о загрузке образа проблемы, я просто хочу пропустить его.
Это не рекомендуется смешивать синхронную сеть IO (например, 'urllib.urlretrieve') и асинхронной IO (SCRAPY/скрученный). В любом случае, после 5 попыток, 'self.retrievePhoto (base_url_photo + url [0], url_text)' все равно может вызвать исключение. Вам нужно поймать это в 'try: ... except: ...', если вы хотите продолжить итерации цикла в 'parse_photo_page'. У Scrapy есть ['ImagesPipeline'] (http://doc.scrapy.org/en/latest/topics/media-pipeline.html#using-the-images-pipeline) для асинхронного извлечения изображений. –
Спасибо за комментарий, я пытаюсь реализовать ImagePipeline сейчас ... не могу заставить его работать, я не впечатлен документацией для этого –
@JohnK: вы говорите, что хотите внести свой вклад к проекту с открытым исходным кодом путем совершенствования документации? –