Я использую Scrapy, чтобы пропинговать кучу веб-страниц и определить, какие из домашних страниц больше не живут.
Полный код моего паука очень прост и воспроизведен ниже:
class BrokenLinksSpider(scrapy.Spider):
name = 'broken-link-spider'
def __init__(self, id_homepage_mapping, *args, **kwargs):
self.org_homepages = id_homepage_mapping
self.download_timeout = 10
def start_requests(self):
for qId, url in self.org_homepages.items():
if url.endswith("/"):
url = url[0:-1]
yield scrapy.Request(url,
callback=self.complete_callback,
errback=self.error_callback,
dont_filter=True,
meta={ 'handle_httpstatus_all': True, 'id': id })
def complete_callback(self, response):
if str(response.status)[0] in ("4", "5"):
yield BrokenLinkCheckerItem(
url=response.request.url,
status=response.status,
qId=response.meta['id'])
def error_callback(self, failure):
yield BrokenLinkCheckerItem(
url=failure.request.url,
status=repr(failure),
qId=failure.request.meta['id'])
В журналах моего приложения я вижу в сборщике статистики scrapy, что были исключения с получением около 40 000 ссылок. Однако выходной файл csv, в который я пишу, содержит только около 8 тыс. Строк. Кроме того, файл CSV, кажется, содержит все различные типы исключений, о которых сообщает StatsCollector, только меньшее количество экземпляров каждого из них.
Итак, мой вопрос: почему существует такое расхождение между тем, что сообщает statsCollector, и тем, что фактически записывается в CSV? Учитывая мое понимание функции обратного вызова errback
, не должны ли все эти исключения быть записаны в CSV?
Спасибо!