在 scrapy crawl 下爬虫可以使用预期的代理,而由 Python 脚本启动时却会直接连接。在更改代理服务器之前,先检查该脚本如何构建自己的设置。

对于现有的 Scrapy 项目及其已注册的爬虫:

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

settings = get_project_settings()
process = CrawlerProcess(settings=settings)
process.crawl('catalog')
process.start()

把 catalog 替换为项目的爬虫名称。项目必须能通过其 scrapy.cfg 被发现,或通过一个指向可导入设置模块且正确设置的 SCRAPY_SETTINGS_MODULE 被发现。

仅构造 CrawlerProcess() 并不会仅仅因为脚本还导入了爬虫类就导入项目的设置文件。因此,由 DOWNLOADER_MIDDLEWARES 启用的自定义中间件可能在该次运行中缺失。

加载设置会提供已配置的组件;它不会凭空产生代理地址。Scrapy 的 HTTP 代理中间件仍然需要其常规的环境代理,或显式的 request.meta['proxy'] 值。检查 HTTPPROXY_ENABLED 是否没有将其禁用。对于获准的公开页面抓取,HTTP 代理列表可提供通过这些元数据或环境传入的 HTTP 代理值候选。

将启动脚本加载的设置和生效的中间件与命令行运行结果进行比较。如果二者一致,再继续检查所选请求的代理元数据和实际的传输错误。

相关文章