Heroku 上的 Scrapy 爬虫返回 503 服务不可用
Posted
技术标签:
【中文标题】Heroku 上的 Scrapy 爬虫返回 503 服务不可用【英文标题】:Scrapy crawler on Heroku returning 503 Service Unavailable 【发布时间】:2021-04-01 05:03:08 【问题描述】:我有一个爬虫,它从网站上抓取数据并将抓取的数据上传到远程 MongoDB 服务器。我想将它托管在heroku上以自动抓取很长时间。
我正在使用 scrapy-user-agents 在不同的用户代理之间轮换。
当我在我的电脑上本地使用scrapy crawl <spider>
时,蜘蛛程序正常运行并将数据返回到 MongoDB 数据库。
但是,当我在 heroku 上部署项目时,我的 heroku 日志中出现以下几行:
2020-12-22T12:50:21.132731+00:00 app[web.1]: 2020-12-22 12:50:21 [scrapy.downloadermiddlewares.retry] 调试:重试
https://indiankanoon.org/browse/>(失败1 次):503 服务不可用 2020-12-22T12:50:21.134186+00:00 app[web.1]: 2020-12-22 12:50:21 [scrapy_user_agents.middlewares] 调试:分配的用户代理 Mozilla/5.0(Windows NT 6.1; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/53.0.2785.143 Safari/537.36
(它同样失败了 9 次,直到:)
2020-12-22T12:50:23.594655+00:00 app[web.1]: 2020-12-22 12:50:23 [scrapy.downloadermiddlewares.retry] 错误:放弃重试
https://indiankanoon.org/browse/> (失败9次):503 Service Unavailable 2020-12-22T12:50:23.599310+00:00 app[web.1]: 2020-12-22 12:50:23 [scrapy.core.engine] 调试:已爬网 (503)
2020-12-22T12:50:23.701386+00:00 app[web.1]: 2020-12-22 12:50:23 [scrapy.spidermiddlewares.httperror] 信息:忽略响应 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 都像 Heroku IP 一样被禁止。您应该使用代理。 【参考方案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-rotating-proxies
scrapy-proxies-tool
【讨论】:
谢谢,使用代理正是为我解决了这个问题。我终于开始在 azure 上使用 docker 容器,而不是 heroku。以上是关于Heroku 上的 Scrapy 爬虫返回 503 服务不可用的主要内容,如果未能解决你的问题,请参考以下文章
在heroku上部署后无法读取mongo数据库,返回503错误,但它在本地工作
Yarn Registry 总是返回 503 Unavailable