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

Heroku 上的 Django。没有运行 Web 进程

Heroku 503 服务不可用

已成功上传到 Heroku Local,但一旦推送到 Heroku live 就会出现 503 错误

scrapy框架设置代理