У меня есть сканер scrapy, который собирает данные с веб-сайта и загружает очищенные данные на удаленный сервер MongoDB. Я давно хотел разместить его на героку, чтобы парсить автоматически.
Я использую пользовательские агенты scrapy для переключения между различными пользовательскими агентами.
Когда я использую scrapy crawl <spider>
локально на своем компьютере, паук работает правильно и возвращает данные в базу данных MongoDB.
Однако, когда я развертываю проект на героку, я получаю следующие строки в своих журналах героку:
2020-12-22T12:50:21.132731+00:00 app[web.1]: 2020-12-22 12:50:21 [scrapy.downloadermiddlewares.retry] ОТЛАДКА: повторная попытка <GET https://indiankanoon. org/browse/> (сбой 1 раз): 503 Сервис недоступен
2020-12-22T12:50:21.134186+00:00 приложение[web.1]: 2020-12-22 12:50:21 [scrapy_user_agents.middlewares] DEBUG: назначенный пользовательский агент Mozilla/5.0 (Windows NT 6.1; WOW64 ) AppleWebKit/537.36 (KHTML, как Gecko) Chrome/53.0.2785.143 Safari/537.36
(аналогично не работает 9 раз, пока:)
2020-12-22T12:50:23.594655+00:00 приложение[web.1]: 2020-12-22 12:50:23 [scrapy.downloadermiddlewares.retry] ОШИБКА: отказ от повторной попытки <GET https:// indiankanoon.org/browse/> (сбой 9 раз): 503 Сервис недоступен
2020-12-22T12:50:23.599310+00:00 приложение[web.1]: 2020-12-22 12:50:23 [scrapy.core.engine] DEBUG: Просканировано (503) <GEThttps:/ /indiankanoon.org/browse/> (референт: нет)
2020-12-22T12:50:23.701386+00:00 приложение[web.1]: 2020-12-22 12:50:23 [scrapy.spidermiddlewares.httperror] ИНФОРМАЦИЯ: Игнорирование ответа <503 https://indiankanoon .org/browse/>: код состояния HTTP не обрабатывается или не разрешен
2020-12-22T12:50:23.714834+00:00 app[web.1]: 2020-12-22 12:50:23 [scrapy.core.engine] ИНФОРМАЦИЯ: закрывающий паук (готово)
Таким образом, мой локальный IP-адрес может очищать данные, а когда Heroku пытается, он не может. Может ли изменение чего-то в файле settings.py исправить это?
Мой файл settings.py:
BOT_NAME = 'indKanoon'
SPIDER_MODULES = ['indKanoon.spiders']
NEWSPIDER_MODULE = 'indKanoon.spiders'
MONGO_URI = ''
MONGO_DATABASE = 'casecounts'
ROBOTSTXT_OBEY = False
CONCURRENT_REQUESTS = 32
DOWNLOAD_DELAY = 3
COOKIES_ENABLED = False
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 400,
}
ITEM_PIPELINES = {
'indKanoon.pipelines.IndkanoonPipeline': 300,
}
RETRY_ENABLED = True
RETRY_TIMES = 8
RETRY_HTTP_CODES = [500, 502, 503, 504, 522, 524, 408]
Вероятно, это связано с защитой от DDoS или черным списком IP-адресов сервером, с которого вы пытаетесь выполнить очистку.
Чтобы преодолеть эту ситуацию, вы можете использовать прокси.
Я бы порекомендовал промежуточное программное обеспечение, такое как scrapy-proxy. Используя это, вы можете чередовать, фильтровать плохие прокси или использовать один прокси для своих запросов. Кроме того, это избавит вас от необходимости каждый раз настраивать прокси.
Это прямо из GitHub README разработчиков (Github Link).
Установите библиотеку scrapy-rotating-proxy
pip install scrapy_proxies
В вашем settings.py добавьте следующие настройки
# Retry many times since proxies often fail
RETRY_TIMES = 10
# Retry on most error codes since proxies fail for different reasons
RETRY_HTTP_CODES = [500, 503, 504, 400, 403, 404, 408]
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 90,
'scrapy_proxies.RandomProxy': 100,
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}
# Proxy list containing entries like
# http://host1:port
# http://username:password@host2:port
# http://host3:port
# ...
PROXY_LIST = '/path/to/proxy/list.txt'
# Proxy mode
# 0 = Every requests have different proxy
# 1 = Take only one proxy from the list and assign it to every requests
# 2 = Put a custom proxy to use in the settings
PROXY_MODE = 0
# If proxy mode is 2 uncomment this sentence :
#CUSTOM_PROXY = "http://host1:port"
Здесь вы можете изменить время повтора, установить один или ротацию прокси.
Затем добавьте свой прокси в файл list.txt, подобный этому.
http://host1:port
http://username:password@host2:port
http://host3:port
Используя это, все ваши запросы будут отправляться через прокси-сервер, который случайным образом вращается для каждого запроса, поэтому это не повлияет на параллелизм.
Также доступно другое подобное промежуточное ПО, например
Спасибо, использование прокси - это именно то, что решило эту проблему для меня. Наконец-то я перешел на использование контейнеров докеров на лазури вместо хероку.
он имеет защиту от DDoS. Вероятно, все IP-адреса облачных сервисов забанены, как и IP-адреса Heroku. Вы должны использовать прокси.