Подсчитывать удаленные элементы из scrapy во время выполнения и приостанавливать или переходить в режим ожидания после определенного количества страниц

#python-3.x #scrapy

#python-3.x #scrapy

Вопрос:

У меня более 210000 ссылок, которые я хочу очистить. Есть ли какой-либо способ, которым мы можем напечатать, сколько ссылок было завершено во время выполнения, и переходить в режим ожидания или приостанавливать выполнение на 10 минут после каждых 10000 страниц?

Ответ №1:

Если вы просто хотите напечатать номер страницы, это сделано scrapy, вы можете сделать что-то вроде этого. Имейте в виду, что Scrapy не гарантирует разбор страниц в том порядке, в котором они были получены.

 def start_requests(self)
     for i in range(1,210000):
         yield scrapy.Request(
            url=f'https://someurl.com?page={str(i)}',
            meta={'page': i}
         )

def parse(self, response):
    page = response.meta.get('page')
    print('Parsed page #'   str(page))
 

Если вы хотите увидеть «прогресс», вы можете сделать что-то вроде этого:

 def __init__(self, *args, **kwargs):
    self.parsed_pages = 0
    self.total_pages = 210000
    super().__init__(*args, **kwargs)


def start_requests(self)
     for i in range(1, self.total_pages):
         yield scrapy.Request(
            url=f'https://someurl.com?page={str(i)}',
            meta={'page': i}
         )

def parse(self, response):
    page = response.meta.get('page')
    self.parsed_pages  = 1
    print(f'Parsed {str(self.parsed_pages)} of {str(self.total_pages)}')'
 

Если вы хотите сделать паузу на 10 минут, я бы не рекомендовал использовать какую-либо функцию сна. Поскольку это заблокирует код. (Если у вас нет других пауков, я думаю, вы могли бы это сделать, но это не очень хорошая практика).

Вместо этого я бы запланировал запуск spider с интервалом и ограничил до 10 000 страниц.

Или, если вам просто нужно ограничить количество отправляемых вами запросов, вы можете просто установить DOWNLOAD_DELAY settings.py до некоторого целого числа, которое уменьшит нагрузку на целевой сервер.

Ответ №2:

отличный ответ! Я думал об использовании sleep внутри оператора if, например.

если parsed_pages == 100 * x time.sleep(rand(20,150) else: