Heroku 上的 Scrapy 爬虫返回 503 服务不可用
Scrapy crawler on Heroku returning 503 Service Unavailable
我有一个 scrapy 爬虫,它可以从网站上抓取数据并将抓取的数据上传到远程 MongoDB 服务器。我想将它托管在 heroku 上以自动抓取很长时间。
我正在使用 scrapy-user-agents 在不同的用户代理之间轮换。
当我在我的电脑上本地使用 scrapy crawl <spider>
时,爬虫正确运行并且 returns 数据到 MongoDB 数据库。
但是,当我在 heroku 上部署项目时,我的 heroku 日志中出现以下几行:
2020-12-22T12:50:21.132731+00:00 app[web.1]: 2020-12-22 12:50:21 [scrapy.downloadermiddlewares.retry] DEBUG: Retrying <GET https://indiankanoon.org/browse/> (failed 1 times): 503 Service Unavailable
2020-12-22T12:50:21.134186+00:00 app[web.1]: 2020-12-22 12:50:21 [scrapy_user_agents.middlewares] DEBUG: Assigned User-Agent 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] ERROR: Gave up retrying <GET https://indiankanoon.org/browse/> (failed 9 times): 503 Service Unavailable
2020-12-22T12:50:23.599310+00:00 app[web.1]: 2020-12-22 12:50:23 [scrapy.core.engine] DEBUG: Crawled (503) <GET https://indiankanoon.org/browse/> (referer: None)
2020-12-22T12:50:23.701386+00:00 app[web.1]: 2020-12-22 12:50:23 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <503 https://indiankanoon.org/browse/>: HTTP status code is not handled or not allowed
2020-12-22T12:50:23.714834+00:00 app[web.1]: 2020-12-22 12:50:23 [scrapy.core.engine] INFO: Closing spider (finished)
总而言之,我的本地 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-proxies。使用它,您可以轮换、过滤不良代理或使用单个代理来处理您的请求。另外,这样可以省去你每次都设置代理的麻烦。
这直接来自开发者 GitHub 自述文件 (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 爬虫,它可以从网站上抓取数据并将抓取的数据上传到远程 MongoDB 服务器。我想将它托管在 heroku 上以自动抓取很长时间。
我正在使用 scrapy-user-agents 在不同的用户代理之间轮换。
当我在我的电脑上本地使用 scrapy crawl <spider>
时,爬虫正确运行并且 returns 数据到 MongoDB 数据库。
但是,当我在 heroku 上部署项目时,我的 heroku 日志中出现以下几行:
2020-12-22T12:50:21.132731+00:00 app[web.1]: 2020-12-22 12:50:21 [scrapy.downloadermiddlewares.retry] DEBUG: Retrying <GET https://indiankanoon.org/browse/> (failed 1 times): 503 Service Unavailable
2020-12-22T12:50:21.134186+00:00 app[web.1]: 2020-12-22 12:50:21 [scrapy_user_agents.middlewares] DEBUG: Assigned User-Agent 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] ERROR: Gave up retrying <GET https://indiankanoon.org/browse/> (failed 9 times): 503 Service Unavailable
2020-12-22T12:50:23.599310+00:00 app[web.1]: 2020-12-22 12:50:23 [scrapy.core.engine] DEBUG: Crawled (503) <GET https://indiankanoon.org/browse/> (referer: None)
2020-12-22T12:50:23.701386+00:00 app[web.1]: 2020-12-22 12:50:23 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <503 https://indiankanoon.org/browse/>: HTTP status code is not handled or not allowed
2020-12-22T12:50:23.714834+00:00 app[web.1]: 2020-12-22 12:50:23 [scrapy.core.engine] INFO: Closing spider (finished)
总而言之,我的本地 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-proxies。使用它,您可以轮换、过滤不良代理或使用单个代理来处理您的请求。另外,这样可以省去你每次都设置代理的麻烦。
这直接来自开发者 GitHub 自述文件 (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
使用此方法,您的所有请求都将通过代理发送,该代理针对每个请求随机轮换,因此不会影响并发性。
其他类似的中间件也可用