Scrapy settings.py 里哪些配置最该优先调整?
Scrapy 的 settings.py 决定爬虫速度、稳定性、反爬风险和数据质量。新项目最该优先调整并发、延迟、超时、重试、请求头、robots、日志、pipeline、middleware 和环境覆盖方式。不要一开始就追求最快,先让目标站、代理池、数据库和自己机器都扛得住。速度可以逐步加,封禁和脏数据一旦出现,排查成本会高很多。
基础配置先保持清楚
BOT_NAME、SPIDER_MODULES、NEWSPIDER_MODULE 通常由项目生成,但要和部署项目名一致。Scrapyd 日志、任务和发布记录都会反复出现这些名字,命名混乱会让排查变难。ROBOTSTXT_OBEY 默认建议开启,是否关闭要看授权、目标站条款和数据用途。
pythonBOT_NAME = "news_crawler" SPIDER_MODULES = ["news_crawler.spiders"] NEWSPIDER_MODULE = "news_crawler.spiders" ROBOTSTXT_OBEY = True
并发和延迟决定稳定性
最常见的事故是把 CONCURRENT_REQUESTS 开太高,又把 DOWNLOAD_DELAY 设为 0。建议先用保守配置跑基线,观察状态码、平均延迟、item 数和失败率,再逐步调高。AutoThrottle 适合响应波动明显的网站,但它不是反爬万能药。
pythonCONCURRENT_REQUESTS = 16 CONCURRENT_REQUESTS_PER_DOMAIN = 4 DOWNLOAD_DELAY = 0.5 RANDOMIZE_DOWNLOAD_DELAY = True DOWNLOAD_TIMEOUT = 20 AUTOTHROTTLE_ENABLED = True AUTOTHROTTLE_MAX_DELAY = 10
请求头、Cookie、重试分场景配置
普通静态页面通常设置合理 UA 即可;登录态、地区化或个性化页面才可能需要 Cookie。Cookie 一旦过期,爬虫可能不报错,却一直抓登录页。重试也要控制,网络错误和 5xx 适合重试,403、验证码和参数错误不适合反复撞。
pythonUSER_AGENT = "Mozilla/5.0 (compatible; ResearchBot/1.0)" COOKIES_ENABLED = False RETRY_ENABLED = True RETRY_TIMES = 2 RETRY_HTTP_CODES = [429, 500, 502, 503, 504, 408]
Pipeline 和 Middleware 别乱塞
ITEM_PIPELINES 适合清洗、校验、去重和入库,DOWNLOADER_MIDDLEWARES 适合代理、请求头、限速和异常处理。优先级数字越小越先执行,顺序错了会导致代理没生效或脏数据先入库。Spider 负责页面解析,通用能力尽量沉到 pipeline 和 middleware。
pythonITEM_PIPELINES = { "news_crawler.pipelines.ValidatePipeline": 200, "news_crawler.pipelines.MongoPipeline": 500, } DOWNLOADER_MIDDLEWARES = { "news_crawler.middlewares.ProxyMiddleware": 350, }
生产环境可以用 -s 或环境变量覆盖配置,例如 scrapy crawl article -s LOG_LEVEL=INFO -s CONCURRENT_REQUESTS=8。多份 settings 文件能用,但容易漏改;部署系统注入环境变量通常更可靠。
追问
CONCURRENT_REQUESTS 越高越好吗?
不是。并发提高会增加吞吐,也会放大限流、代理失败和数据库压力。合理做法是先跑稳定基线,再按错误率和延迟调高。踩坑是只看抓取速度,不看 pipeline 是否堆积。
ROBOTSTXT_OBEY 要不要开?
默认建议开启,特别是公开网页和长期采集任务。关闭它只是 Scrapy 不再自动检查 robots,不代表可以随意抓。实际要结合授权、条款、频率和用途判断。内部测试站或明确授权数据源可以按约定关闭。
COOKIES_ENABLED 什么时候打开?
页面依赖登录态、地区选择或会话校验时才考虑打开。普通静态页面不建议默认开启,因为请求状态会变复杂。打开后要监控 Cookie 过期和登录页误抓。最常见坑是爬虫运行正常,解析到的却是风控页。
Retry 为什么不能无限加?
重试能处理临时网络问题,不能解决封禁、验证码和页面结构变化。无限重试会浪费代理、拖慢队列,还可能让限流更严重。建议区分可重试状态码,并限制次数。遇到 403 或 429,应先查频率、代理和请求行为。
settings.py 能放敏感信息吗?
不应该。数据库密码、代理账号、Token 和 Cookie 应来自环境变量或密钥系统。写进 settings.py 只是省事,却容易提交到仓库。边界是本地可以提供示例值,生产值必须外部注入。日志里也不要把这些值打印出来。