#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: