CrawlSpider通过Rule和LinkExtractor实现自动链接提取与跟进,需正确配置rules元组、allow正则(仅匹配路径)、follow与callback组合,并用scrapy genspider -t crawl生成模板以避免继承和导入错误。

直接用 CrawlSpider 就能自动跟进链接,但多数人卡在规则写不对、follow 误设、回调函数名拼错这三处——不是框架不行,是配置没对齐页面真实结构。
如何生成正确结构的 CrawlSpider 模板
别手写类继承关系,scrapy genspider -t crawl 是唯一可靠起点。手动改 scrapy.Spider 到 CrawlSpider 容易漏掉 Rule 和 LinkExtractor 的 import,还会丢掉默认 rules 元组结构。
-
scrapy genspider -t crawl bookspider books.toscrape.com生成的文件已预置from scrapy.spiders import CrawlSpider, Rule和from scrapy.linkextractors import LinkExtractor -
rules必须是元组(末尾加逗号),写成列表或单个 Rule 不带括号会静默失效 -
allowed_domains若留空或写错,Scrapy 会直接过滤掉所有跨域链接,哪怕你写了follow=True
LinkExtractor 的 allow 正则为什么总不匹配
LinkExtractor 匹配的是 URL 路径片段,不是完整 URL。比如页面里有链接 /catalog/item/123,正则写 r'/catalog/item/\d+' 就行,不用加协议、域名或查询参数。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 常见错误:写
r'https://example.com/catalog/item/\d+'—— 这会永远不命中,因为提取器只看路径部分 - 调试技巧:先在 shell 里跑
response.css('a::attr(href)').getall(),挑几个真实链接,用 Python 的re.search()测试你的正则是否真能捕获 - 支持 XPath/CSS 限定范围:
LinkExtractor(restrict_xpaths='//div[@class="nav"]//a'),避免从页脚、广告等无关区域提取垃圾链接
callback 和 follow 的组合逻辑怎么设
callback 和 follow 是绑定在同一个 Rule 上的,不是全局开关。一个 Rule 处理一类链接,该不该继续往下爬,取决于这条规则本身。
立即学习“Python免费学习笔记(深入)”;
-
follow=True表示:对这个 Rule 提取出的每个链接,再用全部rules去匹配一遍(包括它自己),形成递归追踪 -
follow=False表示:只解析当前页内容,不把提取出的链接喂给下一轮规则匹配 - 典型分层场景:首页用 Rule 提取分类页(
follow=True),分类页用另一个 Rule 提取详情页(follow=False),详情页只做数据提取不继续跳转 - 回调函数名必须和
rules里写的字符串完全一致,parse_item写成parseitem或parse_Item都会导致静默跳过,无报错也无输出
为什么爬着爬着就停了,或者只爬了首页
最常被忽略的是 start_urls 页面本身没包含任何匹配 allow 的链接——CrawlSpider 不会主动扫描整个 DOM,它只处理 LinkExtractor 找到的链接,而这些链接又依赖于你写的正则和 restrict 参数。
- 检查
start_urls返回的 HTML,确认目标链接确实存在且结构符合你写的restrict_xpaths或 CSS 选择器 - 禁用
ROBOTSTXT_OBEY = False,否则 robots.txt 可能屏蔽掉关键路径 - 临时加
LOG_LEVEL = 'DEBUG',看日志里有没有Filtered offsite request或Ignoring link提示,这是最直接的线索 -
CrawlSpider默认不处理start_urls页面的内容,除非你单独写一个 Rule 匹配它自身(比如Rule(LinkExtractor(allow=r'^/$'), callback='parse_home', follow=True))

















