Как возобновить Scrapy Spider с того места, где он остановился? - PullRequest
0 голосов
/ 21 февраля 2019

У меня очень большой веб-сайт с множеством URL-адресов, которые я бы хотел найти.Есть ли способ заставить Scrapy игнорировать список URL-адресов?

Сейчас я храню все URL-адреса в столбце БД, я хотел бы иметь возможность перезапустить паука, но пропустить длинный список (24 тыс. Строк) к Scrapy, чтобы он знал, чтобы пропустить те, которые он уже видел.

Есть ли в любом случае, чтобы сделать это?

class MySpider(Spider):
    custom_settings = {
        'AUTOTHROTTLE_ENABLED': True,
        'DOWNLOAD_DELAY': 1.5,
        'DEPTH_LIMIT': 0,
        'JOBDIR': 'jobs/scrapy_1'
    }

    name = None
    allowed_domains = []
    start_urls = []

    def parse(self, response):
        for link in le.extract_links(response):
            yield response.follow(link.url, self.parse)

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Проверьте информацию в вашей базе данных:

def check_duplicate_post_links(self, links):
    new_links = []
    for link in links:
        sql = 'SELECT id FROM your_table WHERE url = %s'
        self.cursor.execute(sql, (url,))
        duplicate_db = self.cursor.fetchall()

        if duplicate_db:
            self.logger.error("error url duplicated: {}".format(link))
        else:
            new_links.append(link)

    return new_links


class YourSpider(scrapy.Spider):

    def parse(self, response):
        links = le.extract_links(response):
        new_links = self.check_duplicate_post_links(links)

        if len(new_links) > 0:
            for link in new_links:
                #Add your information
                item = YourScrapyItem()
                item['url'] = link.url

                yield item
0 голосов
/ 21 февраля 2019

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

class YourSpider(scrapy.Spider):

    def parse(self, response):
        cursor.execute("SELECT url FROM table")

        already_scraped = tuple(a['url'] for a in cursor.fetchall())

        for link in le.extract_links(response):
            if url not in already_scraped:
                yield Request(...)
            else:
                self.logger.error("%s is already scraped"%(link.url))
...