Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: ocean800Ответов: 2

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

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

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

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

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

pythonweb-crawlerscrapyscrapy-spider

Ответы

Ответ 1 · рейтинг 1 · RabidCicada

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

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

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

Ответ 2 · рейтинг 2 · graph

Вы можете использовать настраиваемый 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
        )
    ...

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы