Добавление паузы в Scrapy Spider - PullRequest
0 голосов
/ 04 мая 2020

Привет, я хочу создать паука, который удаляет один сайт в день. У меня есть паук, который отбирает все, что мне нужно, но мне нужно сделать паузу после каждой статьи. Я пробовал также модуль threading и модуль time, но их использование не работает, так как я получаю этот ответ (только от некоторых запросов):


DEBUG: Retrying <GET https://www.example.com/.../> (failed 1 times): [<twisted.python.failure.Failure twisted.internet.error.ConnectionLost: Connection to the other side was lost in a non-clean fashion: Connection lost.>] .


Мой код выглядит так

class AutomatedSpider(scrapy.Spider):
    name = 'automated'
    allowed_domains = ['example-domain.com']
    start_urls = [
        'https://example.com/page/1/...'
    ]
    pause = threading.Event()
    article_num = 1

    def parse(self, response):
        for page_num in range(1, 26):
            for href in set(response.css(".h-100 a::attr(href)").extract()):
                # extract data from all the articles on current page
                self.pause.wait(5.0) # this causes the response mentioned above
                yield scrapy.Request(href, callback=self.parse_article)
                self.article_num += 1

            # move to next page
            next_page = 'https://www.information-age.com/page/'+str(page_num)+'/...'
            yield scrapy.Request(next_page, callback=self.parse)

    def parse_article(self, response):
        # function to extract desired data from website that is being scraped

1 Ответ

1 голос
/ 04 мая 2020

Я не думаю, что time.sleep и ожидания от многопоточности могут хорошо работать в Scrapy из-за его асинхронного способа работы. Вы можете сделать следующее:

  • Вы можете поместить DOWNLOAD_DELAY = 5 в settings.py, чтобы задержка между запросами составляла от 2,5 до 7,5 секунд
  • С RANDOMIZE_DOWNLOAD_DELAY = False it будет ждать ровно 5 секунд.
  • Установка CONCURRENT_REQUESTS = 1 обеспечит одновременное выполнение нескольких запросов
...