如何修改Scrapy爬虫用Rule和LinkExtractor处理商品链接与分页
使用Scrapy Rule和LinkExtractor重构爬虫
要重构你的爬虫,核心是将类继承从Spider改为CrawlSpider(它原生支持Rule和LinkExtractor),并通过规则替代手动的链接提取与分页逻辑。以下是完整的重构方案:
重构后的代码示例
from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor from scrapy import Request class JosephCrawlSpider(CrawlSpider): name = "joseph_crawl" allowed_domains = ["joseph-fashion.com"] parse_spider = JosephParseSpider() # 定义规则:同时处理商品链接与分页 rules = ( # 规则1:提取商品详情页链接,处理商品数据 Rule( LinkExtractor( css=".product-name a.name-link", restrict_css=".product-list" # 限定提取范围,避免无关链接 ), callback="parse_product", process_request="pass_request_meta", follow=False ), # 规则2:提取分页链接,跟进下一页列表 Rule( LinkExtractor( allow=r"start=\d+", # 匹配带start参数的分页URL # 如果页面有下一页按钮,用下面的限制更精准: # restrict_xpaths="//a[contains(@class, 'next-page')]" ), process_request="pass_request_meta", follow=True ), ) def start_requests(self): for url in self.start_urls: category = self.extract_category_from_url(url) yield Request( url, cookies=self.cookies, meta={'category': category} ) def pass_request_meta(self, request, response): # 传递父请求的分类元数据与cookies到新请求 request.meta['category'] = response.meta.get('category', 'unknown') request.cookies = self.cookies return request def parse_product(self, response): response.meta['raw_product'] = response yield from self.parse_item(response) def parse_item(self, response): return self.parse_spider.parse(response) def extract_category_from_url(self, url): parts = url.split('/') try: start_index = parts.index("womens") return parts[start_index:start_index + 3] except ValueError: return []
关键逻辑说明
类继承变更
必须继承CrawlSpider而非Spider,因为Rule和LinkExtractor是CrawlSpider的核心特性,它会自动根据规则处理链接的提取与跟进。双规则配置
- 商品链接规则:通过
LinkExtractor的css参数定位商品链接,restrict_css缩小提取范围避免无效链接;process_request用于传递父请求的分类元数据和cookies,确保商品请求能拿到分类信息。 - 分页规则:如果页面有下一页按钮,优先用
restrict_xpaths/restrict_css精准定位;如果是无按钮的构造式分页,用allow匹配包含start=\d+的URL,通过follow=True自动跟进下一页。
- 商品链接规则:通过
元数据传递
Rule生成的请求不会自动继承父请求的meta和cookies,因此通过自定义pass_request_meta函数手动传递这些关键信息,保证分类数据在整个爬取流程中不丢失。保留原有业务逻辑
原有的分类提取、商品解析逻辑(extract_category_from_url、parse_product、parse_item)完全保留,只替换链接处理的方式。
注意事项
- 如果网站分页没有可见的下一页按钮(完全靠URL构造
start参数),可以在start_requests中手动构造前几页URL,再通过Rule匹配后续分页链接。 - 不要重写
CrawlSpider的parse方法,它是内部用来处理规则调度的核心方法,重写会导致规则失效。
内容的提问来源于stack exchange,提问作者NoOne
相关产品推荐
相关产品推荐

