Scrapy - парсинг ссылок по дате

Можно ли очистить ссылки по дате, связанной с ними? Я пытаюсь реализовать ежедневного запускаемого паука, который сохраняет информацию о статьях в базе данных, но я не хочу повторно очищать статьи, которые я уже очищал раньше, то есть вчерашние статьи. Я наткнулся на этот SO-пост с тем же вопросом и Был предложен подключаемый модуль scrapy-deltafetch.

Однако это зависит от проверки новых запросов на соответствие ранее сохраненному запросу. отпечатки пальцев хранятся в базе данных. Я предполагаю, что если бы ежедневная очистка продолжалась какое-то время, потребовались бы значительные накладные расходы на память в базе данных для хранения отпечатков запросов, которые уже были очищены.

Итак, учитывая список статей на таком сайте, как cnn.com, я хочу чтобы очистить все статьи, которые были опубликованы сегодня 14.06.17, но как только парсер обнаружит более поздние статьи с датой, указанной как 13.06.17, я хочу закрыть паук и прекратить очистку. Возможен ли такой подход с scrapy? Для данной страницы статей будет ли CrawlSpider начинаться вверху страницы и очищать статьи по порядку?

Просто новичок в Scrapy, поэтому не знаю, что попробовать. Любая помощь будет принята с благодарностью, спасибо!


person ocean800    schedule 14.06.2017    source источник
comment
Я не думаю, что он встроен в scrapy, но, учитывая, что URL-адреса статей должны быть в формате /2017/06/14/politics/two-arrested-brawl-turkish-embassy/index.html, думали ли вы о том, чтобы проанализировать дату из URL-адреса и сравнить ее?   -  person etemple1    schedule 15.06.2017
comment
@ etemple1 К сожалению, в данном случае cnn.com - это просто пример сайта, а не сайт, который я хотел бы очистить. Большинство сайтов, которые я хотел бы очистить, не включают дату в URL-адресе.   -  person ocean800    schedule 15.06.2017
comment
Ах хорошо. Итак, как узнать дату, связанную со ссылкой?   -  person etemple1    schedule 15.06.2017
comment
@ etemple1 Ну, на некоторых сайтах со страницей со списком статей дата статьи указана в предварительном просмотре статьи. Конечно, с сайтами, которые этого не делают, мне действительно пришлось бы сделать запрос, а затем вытащить информацию о дате из статьи .... После чего, если статья была предыдущей датой, я не сохраню информацию о статье и остановлю все дальнейшие запросы по закрытию паука?   -  person ocean800    schedule 15.06.2017


Ответы (2)


Я составляю дату, используя datetime.strptime(Item['dateinfo'], "%b-%d-%Y") из собранной информации по интересующему вопросу.

После этого я просто проверяю его на соответствие настроенному возрасту в моих настройках, который можно переопределить для каждого вызова. Вы можете выдать исключение closespider, когда обнаружите, что возраст слишком стар, или вы можете установить флаг завершения и действовать в соответствии с ним в любом другом коде.

Не нужно ничего запоминать. Я использую это на пауке, которым бегаю ежедневно, и просто устанавливаю возрастное ограничение в 24 часа.

person RabidCicada    schedule 15.06.2017
comment
Спасибо!! Просто интересно, вы используете CrawlSpider при реализации этого? Учитывая, что статьи находятся в списке, причем самые новые появляются вверху страницы, я просто хотел закрыть паука, когда я попаду на первую предыдущую дату. Но CrawlSpider не анализирует ссылки на статьи сверху вниз, что означает, что он пропускает страницу, и я не могу немедленно прекратить запрос. Я стараюсь не запрашивать все статьи на странице ... но, учитывая, что CrawlSpider идет не по порядку, разве это невозможно? - person ocean800; 16.06.2017

Вы можете использовать настраиваемый delta-fetch_key, который проверяет дату и заголовок как отпечаток пальца.

from w3lib.url import url_query_parameter

...

def parse(self, response):
    ...
    for product_url in response.css('a.product_listing'):
        yield Request(
            product_url,
            meta={'deltafetch_key': url_query_parameter(product_url, 'id')},
            callback=self.parse_product_page
        )
    ...
person graph    schedule 15.06.2017
comment
Спасибо, но я хочу посмотреть, смогу ли я использовать подход без deltafetch, как указано в вопросе, но также, поскольку он использует Berkeley DB, и я не уверен, совместим ли он с MongoDB, который я хочу использовать - person ocean800; 15.06.2017