要让Scrapy爬虫稳定抓取不被封禁,必须正确配置settings.py:①设BOT_NAME为唯一项目名;②指定SPIDER_MODULES路径;③ROBOTSTXT_OBEY=False;④合理设置DOWNLOAD_DELAY、CONCURRENT_REQUESTS及并发限制;⑤显式配置USER_AGENT或UA池;⑥按需启用COOKIES_ENABLED及cookiejar标记;⑦正确配置ITEM_PIPELINES顺序。

要让Scrapy爬虫不被目标网站封禁、稳定抓取数据,必须正确配置settings.py文件——它直接控制请求频率、身份伪装、并发行为和中间件加载等核心运行逻辑。
基础项目信息与协议控制
打开项目根目录下的settings.py,先确认三项基础配置是否已按需设置:
① 设置项目唯一标识:BOT_NAME = "my_news_spider"。这个名称会参与默认User-Agent构造,也用于日志归类,【不可与其他项目重名】。
② 指定爬虫模块路径:SPIDER_MODULES = ["my_news_spider.spiders"]。如果后续新增spider文件但无法被识别,大概率是这里路径写错或未同步更新。
③ 控制是否遵守robots.txt:ROBOTSTXT_OBEY = False。多数新闻站/电商站的robots.txt会禁止爬虫访问关键路径,设为True会导致start_urls直接被拦截,【开发调试阶段务必设为False】。
防封关键:延迟与并发控制
这是最易踩坑的部分。不加限制的并发请求会被服务器瞬时拉黑IP。
方法一:最稳妥的串行策略
取消注释并设置:CONCURRENT_REQUESTS_PER_DOMAIN = 1,再设置DOWNLOAD_DELAY = 2。这样每个域名严格按2秒间隔发请求,适合小规模采集或反爬强的站点。
方法二:中等压力平衡策略
启用CONCURRENT_REQUESTS = 8,同时设CONCURRENT_REQUESTS_PER_DOMAIN = 4和DOWNLOAD_DELAY = 0.5。这允许单域名最多4个并发,配合0.5秒延迟,实际吞吐可控,但需搭配随机UA和Referer头才安全。
注意:若目标站使用CDN且对IP限频,必须启用CONCURRENT_REQUESTS_PER_IP = 2并注释掉CONCURRENT_REQUESTS_PER_DOMAIN,否则延迟逻辑将失效。
身份伪装:User-Agent与请求头
默认的Scrapy UA极容易被识别。必须显式覆盖。
直接在settings.py中写死一个高可信UA(适用于简单站点):
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
更推荐启用UA池(需配合中间件):
在settings.py底部添加:
USER_AGENT_LIST = [ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)"]
然后在middlewares.py中编写随机UA中间件,并在DOWNLOADER_MIDDLEWARES中启用它。
Cookie与会话管理
爬取需要登录态的页面(如用户中心、后台接口)必须保留Cookie。
确认COOKIES_ENABLED = True处于启用状态(默认就是True,但常有人误关)。
如果发现登录后仍跳转回登录页,检查是否在请求中漏传了meta={'cookiejar': 'login'}——这是Scrapy多Cookie容器机制的关键标记,【不加此参数,登录态无法跨请求延续】。
管道与数据去重
数据落地前必须经过管道清洗和存储。
启用自定义Pipeline(假设你写了my_news_spider.pipelines.DuplicatesPipeline):
ITEM_PIPELINES = { "my_news_spider.pipelines.DuplicatesPipeline": 200, "my_news_spider.pipelines.JsonWriterPipeline": 300}
数字代表执行优先级,越小越先执行。DuplicatesPipeline必须排在JsonWriterPipeline之前,否则重复数据已写入文件才去重就晚了。


















