Моему скрипту запрещено сканировать этот веб-сайт (http:403 ) но не мои браузеры

#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 не дал никакого эффекта, чтобы избежать ошибки. Так что это мне не помогает.