You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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 []

关键逻辑说明

  1. 类继承变更
    必须继承CrawlSpider而非Spider,因为Rule和LinkExtractor是CrawlSpider的核心特性,它会自动根据规则处理链接的提取与跟进。

  2. 双规则配置

    • 商品链接规则:通过LinkExtractor的css参数定位商品链接,restrict_css缩小提取范围避免无效链接;process_request用于传递父请求的分类元数据和cookies,确保商品请求能拿到分类信息。
    • 分页规则:如果页面有下一页按钮,优先用restrict_xpaths/restrict_css精准定位;如果是无按钮的构造式分页,用allow匹配包含start=\d+的URL,通过follow=True自动跟进下一页。
  3. 元数据传递
    Rule生成的请求不会自动继承父请求的meta和cookies,因此通过自定义pass_request_meta函数手动传递这些关键信息,保证分类数据在整个爬取流程中不丢失。

  4. 保留原有业务逻辑
    原有的分类提取、商品解析逻辑(extract_category_from_url、parse_product、parse_item)完全保留,只替换链接处理的方式。

注意事项

  • 如果网站分页没有可见的下一页按钮(完全靠URL构造start参数),可以在start_requests中手动构造前几页URL,再通过Rule匹配后续分页链接。
  • 不要重写CrawlSpider的parse方法,它是内部用来处理规则调度的核心方法,重写会导致规则失效。

内容的提问来源于stack exchange,提问作者NoOne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 10:57:21