#python-3.x #web-scraping #scrapy
#python-3.x #очистка веб-страниц #scrapy
Вопрос:
Я сканировал веб-сайт, когда они заблокировали меня с помощью 403. Я все еще могу получить доступ к веб-сайту из любого моего браузера, но мой скрипт Scrapy не может сканировать.
Я сканирую из дома, используя 5 прокси, и у каждого случайно выбрано 10 IP-адресов. У меня около 40 пользовательских агентов, выбранных случайным образом (см. Код ниже). При каждом запросе выбирается новый набор прокси и user_agent. Каждый запрос на выход имеет объем около 1 МБ. Когда собирается около 100 запросов, скрипт (используя S3pipelines из Github) отправляет пакет на мой S3 на AWS. У меня задержка загрузки составляет 10, и в настройках моего проекта Scrapy активировано автоматическое регулирование. Все, что соответствует веб-сайту robots.txt сканирование запроса с задержкой 10.
Я читал инструкции от Scrapy, от Python и некоторых других, но не смог найти никакого способа стать более «человечным» при сканировании.
Мои настройки (извлечение):
BOT_NAME = 'acCrawler10'
SPIDER_MODULES = ['acCrawler10.spiders']
NEWSPIDER_MODULE = 'acCrawler10.spiders'
s3 = boto3.client('s3', aws_access_key_id='AWS_ACCESS_KEY_ID',
aws_secret_access_key='AWS_SECRET_ACCESS_KEY')
USER_AGENT = get_random_agent()
# Obey robots.txt rules
ROBOTSTXT_OBEY = True
CONCURRENT_REQUESTS = 32
DOWNLOAD_DELAY = 10
PROXYMESH_TIMEOUT = 60
# CONCURRENT_REQUESTS_PER_DOMAIN = 16
CONCURRENT_REQUESTS_PER_IP = 16
# Disable cookies (enabled by default)
# COOKIES_ENABLED = False
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 5
AUTOTHROTTLE_MAX_DELAY = 60
AUTOTHROTTLE_TARGET_CONCURRENCY = 4.0
AUTOTHROTTLE_DEBUG = False
Комментарии:
1. возможно, сокращение CONCURRENT_REQUESTS_PER_IP подойдет
2. @AgusMathew, спасибо, но это не так. Хотя я считаю, что это хорошая идея, это не позволило мне пройти. При тестировании я запускаю только одного паука.
Ответ №1:
Я использовал настройки от Freddy с небольшой модификацией и, как было предложено @Agus-Mathew, уменьшил «CONCURRENT_REQUESTS_PER_IP».
Итак, >мои< окончательные настройки, которые выполнили эту работу, были:
DOWNLOAD_DELAY = 10
CONCURRENT_REQUESTS = 1
...
#PROXYMESH_TIMEOUT = 60
#CONCURRENT_REQUESTS_PER_IP = 16
#Disable cookies (enabled by default)
#COOKIES_ENABLED = False
...
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 5
AUTOTHROTTLE_MAX_DELAY = 60
AUTOTHROTTLE_TARGET_CONCURRENCY = 4.0
#AUTOTHROTTLE_DEBUG = False
Я настроил свой заголовок Scrapy следующим образом, потому что я получил блок только с моим скриптом Scrapy, но не с моим веб-браузером (например, Freddy). Вращающиеся прокси, которые я не использовал для работы.
DEFAULT_REQUEST_HEADERS = {
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'en-US,en;q=0.9',
'sec-ch-ua': '"Chromium";v="106", "Microsoft Edge";v="106", ";Not A Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
}
Но, конечно, это зависит от веб-сайта, с которого мы пытаемся очистить. Если их настройки API слишком чувствительны к запросам, то мы должны соответствующим образом настроить.
Кстати: часто я читаю об использовании «time.seep ()» (или о том, что человек не использует, из-за Twisted Reactor и Scrapy concurrency) в пауке. Но в моем случае time.sleep не дал никакого эффекта, чтобы избежать ошибки. Так что это мне не помогает.