Как остановить скрапинг, когда он достигает начальной точки предыдущего запуска - PullRequest
0 голосов
/ 26 сентября 2018

Я делаю паука, который будет сканировать весь сайт при первом запуске и сохранит данные в моей базе данных.

Но я буду продолжать запускать этот паук еженедельно, чтобы получать обновления просканированного сайтав моей базе данных, и я не хочу, чтобы scrapy сканировал страницы, которые уже присутствуют в моей базе данных. Как этого добиться, я сделал два плана:

1] Сделать сканер, чтобы получить весь сайт и каким-то образом сохранитьпервый извлеченный URL-адрес в CSV-файле, а затем продолжать следовать на следующих страницах.Затем создайте еще один сканер, который начнет извлекать данные в обратном направлении, что означает, что он будет принимать входные данные из URL-адреса в csv и продолжит работать до тех пор, пока не выйдет прежняя страница таким образом. Я получу данные, но URL-адрес в csv будет сканироваться дважды.

2] Создать сканер, который проверит состояние, если данные находятся в базе данных, а затем остановится, возможно ли это?Это будет самый продуктивный путь, но я не могу найти выход.Может быть, создание файлов журналов может помочь каким-то образом?

Обновление Сайт - это блог, который часто обновляется и сортируется как последний пост в топовой манере

1 Ответ

0 голосов
/ 28 сентября 2018

Примерно так:

from scrapy import Spider
from scrapy.http import Request, FormRequest



class MintSpiderSpider(Spider):

    name = 'Mint_spider'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com/']

    def parse(self, response):
        urls =  response.xpath('//div[@class = "post-inner post-hover"]/h2/a/@href').extract()

        for url in urls:
            if never_visited(url, database):
                yield Request(url, callback=self.parse_lyrics) #do you mean parse_foo ?

        next_page_url = response.xpath('//li[@class="next right"]/a/@href').extract_first()
        if next_page_url:
            yield scrapy.Request(next_page_url, callback=self.parse)


    def parse_foo(self, response):
        save_url(response.request.url, database)
        info = response.xpath('//*[@class="songinfo"]/p/text()').extract()
        name =  response.xpath('//*[@id="lyric"]/h2/text()').extract()

        yield{
            'name' : name,
            'info': info
        }

Вам просто нужно реализовать функции never_visited и save_url.never_visited проверит вашу базу данных, если URL уже существует.save_url добавит URL в вашу базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...