Scrapy抓取多层链接需明确跳转路径、控制去重、正确传递中间数据;可用Spider类手动控制三级解析,或CrawlSpider自动跟踪规则化链接,并注意相对路径拼接与跨域域名配置。

Scrapy抓取多层链接需明确跳转路径、控制请求去重、正确传递中间数据,避免重复爬取和字段缺失。
用Spider类手动控制多层跳转
适用于层级逻辑清晰、需精细控制每层解析逻辑的场景,比如从列表页→详情页→评论页三级结构。
第一步:在parse方法中提取当前页所有详情页URL,用response.follow()发起请求,并通过meta传入基础Item或标识信息。
第二步:在详情页回调函数(如parse_detail)中提取关键字段,同时判断是否存在下一层链接(如“查看更多评论”按钮),若存在则再次yield scrapy.Request(),并将已收集的Item继续通过meta向下传递。
第三步:在最终回调(如parse_comments)中补全剩余字段,确认所有数据就位后yield item。注意:不要在parse或parse_detail中提前yield item,否则会生成不完整数据项。
这一步操作起来很简单,直接把文件拖进去就行。但必须确保每层只yield一次完整item,否则导出结果会出现大量缺字段的脏数据。
用CrawlSpider自动跟踪内部链接
适合网站结构规则固定、需批量发现并爬取同类子页面的场景,例如新闻站的“相关文章”、电商站的“同类商品”等。
方法一:定义rules元组,每条规则指定LinkExtractor匹配条件与回调函数。
方法二:用allow参数限定URL正则(如r'/article/\d+\.html'),用deny排除分页或广告链接,避免误入死循环。
方法三:设置follow=True让CrawlSpider自动对匹配到的链接递归发起请求;若只需爬一层,则设为follow=False。
【CrawlSpider默认启用去重机制,无需手动加dont_filter=True】滥用该参数会导致同一URL被反复抓取,输出重复记录且拖慢整体速度。
处理相对路径与跨域链接
当目标网站使用相对URL时,必须确保拼接正确,否则请求会失败或跳转到错误地址。
使用response.urljoin(href)替代手动字符串拼接,它能自动识别协议、域名、路径层级,兼容//example.com、/path、../up等各种写法。
遇到跨域链接(如https://cdn.example.com/img.jpg)且不需要爬取时,在allowed_domains中仅保留主站域名即可,Scrapy会自动过滤非允许域的请求。
若必须爬取跨域内容,需将对应域名加入allowed_domains列表,多个域名用逗号分隔,如["example.com", "cdn.example.com"]。


















