CrawlSpider是Scrapy提供的通用爬虫类,通过rules属性定义Rule规则列表,利用LinkExtractor提取链接并自动跟进,需继承CrawlSpider类且不可重写start_requests;Rule中allow参数须用原始字符串正则,callback指向已定义方法名。

你需要从列表页自动跳转到每个球员详情页并提取姓名与体重,但卡在链接无法正确跟进这一步——常见原因是相对路径未转绝对、回调函数未注册或Rule规则匹配失败。
用 response.follow 跟进单个详情页链接
在 parse 方法中遍历当前页所有详情页 URL,用 response.follow 自动拼接并发起请求。
第一步:提取所有详情页 href 属性值,例如 player_links = response.css("figure.player a::attr(href)").getall()。
第二步:对每个 link 调用 response.follow(link, callback=self.parse_item),【callback 必须指向已定义的解析方法名,不能写字符串如 "parse_item"】。
这一步操作起来很简单,直接把文件拖进去就行。response.follow 会自动处理相对路径转绝对 URL,比 scrapy.Request 更安全。
用 CrawlSpider 的 Rule 自动跟进
适合结构稳定、多级页面需统一规则匹配的场景,比如“球员列表页→详情页→下一页列表”这种链式跳转。
方法一:启用 LinkExtractor + Rule 配置
在 spider 类中定义 rules 元组,例如:
rules = (
Rule(LinkExtractor(allow=r"info/1061/.*?\.htm"), callback="parse_item", follow=False),
Rule(LinkExtractor(allow=r"tzgg1/.*?\.htm"), follow=True),
)
注意:allow 参数是正则表达式,必须用原始字符串 r"" 包裹,否则 \. 会被转义失效。
方法二:确保 CrawlSpider 正确继承并启用
类声明必须为 class MySpider(CrawlSpider):,且不能重写 start_requests;否则 Rule 不生效。
手动构造 scrapy.Request 并指定回调
当需要动态控制请求头、Cookie 或 meta 传递时,必须用这种方式。
在 parse 中写:yield scrapy.Request(url=full_url, callback=self.parse_item, headers={"User-Agent": "xxx"})。
这一步的关键是 full_url 必须为绝对 URL,【如果传入的是相对路径,Scrapy 不会报错但请求会 404】。
获取绝对 URL 的稳妥方式是用 response.urljoin(href),而不是硬拼字符串。


















