Искатель Scrapy на Heroku возвращает 503 Служба недоступна

У меня есть сканер 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-адреса облачных сервисов забанены, как и IP-адреса Heroku. Вы должны использовать прокси.

Murat Demir 25.12.2020 15:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
1 045
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вероятно, это связано с защитой от 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

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

Также доступно другое подобное промежуточное ПО, например

скрап-вращающиеся прокси

инструмент scrapy-proxy

Спасибо, использование прокси - это именно то, что решило эту проблему для меня. Наконец-то я перешел на использование контейнеров докеров на лазури вместо хероку.

Puneet Shrivas 27.12.2020 17:14

Другие вопросы по теме