У меня есть рабочий паук, очищающий URL-адреса изображений и размещение их в поле image_urls scrapy.Item. У меня есть собственный конвейер, который наследуется от ImagesPipeline. Когда определенный URL-адрес возвращает код ответа не-200 http (например, ошибка 401). Например, в лог-файлы, я считаюRetreive http return code from ImagesPipeline (или MediaPipeline) в scrapy
WARNING:scrapy.pipelines.files:File (code: 404): Error downloading file from <GET http://a.espncdn.com/combiner/i%3Fimg%3D/i/headshots/tennis/players/full/425.png> referred in <None>
WARNING:scrapy.pipelines.files:File (code: 307): Error downloading file from <GET http://www.fansshare.com/photos/rogerfederer/federer-roger-federer-406468306.jpg> referred in <None>
Однако, я не могу захватить коды ошибок , и т.д. в моем пользовательском трубопроводе изображения в item_completed()
функции:
def item_completed(self, results, item, info):
image_paths = []
for download_status, x in results:
if download_status:
image_paths.append(x['path'])
item['images'] = image_paths # update item image path
item['result_download_status'] = 1
else:
item['result_download_status'] = 0
#x.printDetailedTraceback()
logging.info(repr(x)) # x is a twisted failure object
return item
Копаясь через исходный код scrapy, внутри функции media_downloaded()
в files.py, я обнаружил, что для кодов ответов, отличных от 200, регистрируется предупреждение (что объясняет приведенные выше строки WARNING), а затем FileException
поднял.
if response.status != 200:
logger.warning(
'File (code: %(status)s): Error downloading file from '
'%(request)s referred in <%(referer)s>',
{'status': response.status,
'request': request, 'referer': referer},
extra={'spider': info.spider}
)
raise FileException('download-error')
Как мне этот ответ код, так что я могу справиться с этим в моем трубопроводе в item_completed функции()?
Спасибо за ваш ответ. Но в media_downloaded код состояния всегда 200, поскольку он вызывается только в случае успешной загрузки (я полагаю). Фактически, я пробовал аналогичный подход. Я перегрузил file_downloaded() вместо media_downloaded(), поскольку ImagesPipeline наследует от FilesPipeline, который определяет этот метод. См. Мой подход в http://pastebin.com/bpLKyWYx. Тем не менее, я не вижу коды статуса не-200 в item_completed(). Я думаю, это потому, что, как я упоминал в вопросе, возникает исключение FileException, когда происходят коды статуса не-200. – hAcKnRoCk
Фактически 'media_downloaded' получает любой ответ, а не только 200. Что мы делаем в приведенном выше коде, перезаписываем по умолчанию' media_downloaded', проверяем, не отвечает ли ответ не 200, если да, верните dict с ответом, иначе вызовите родительский метод ImagesPipeline - таким образом, код выше работает для каждого ответа ** перед ** повышением исключения. – mizhgun
Спасибо за руководство. Я понял, что лучший способ состоял в том, чтобы поймать исключение и обработать его вместо вызова супер только для ответов, отличных от 200. Я отправлю свой подход в качестве отдельного ответа, хотя ваше руководство было необходимо для продолжения и выяснения ответа – hAcKnRoCk