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

Scrapy框架start_urls配置多站点时如何实现独立分页功能

问题原因分析
  • 全局类属性count被两个站点共享,导致两个站点的页码计数互相干扰,无法独立统计各自的分页进度
  • 分页逻辑遍历全部start_urls生成下一页请求,会触发跨站点的错误分页请求,比如请求PageDucky的返回结果同时生成PageDucky和PageHorse的下一页请求
  • 全局类属性categories同样会被两个站点的返回结果互相覆盖,导致分类数据错误
修复方案

直接通过scrapy.Request的meta参数传递当前页码,每个站点的分页请求独立维护自己的页码,分页时仅基于当前响应的站点域名生成下一页地址,不要遍历所有起始地址。

修改后可运行代码
import math
import scrapy

class QuotesSpider(scrapy.Spider):
    name = 'QuotesSpider'
    start_urls = ['https://PageDucky.com', 'https://PageHorse.com']

    def parse(self, response):
        # 从meta中取当前页码,首次访问默认是第1页
        current_page = response.meta.get('page', 1)
        # 分类改为局部变量,避免全局覆盖
        urli = response.url
        categories = urli[urli.find('/browse')+7:].split('/')
        categories.pop(0)
        
        # 计算总页数,向上取整避免遗漏最后一页
        items = int(response.xpath(
                '*//div[@id="body"]/div/label[@class="item-count"]/text()').get().replace(' items', ''))
        total_pages = math.ceil(items / 10)
        
        # 提取当前页的item链接
        for i in response.css('div#body div a::attr(href)').getall():
            if i[:5] == '/item':
                yield scrapy.Request('http://mainpage' + i, callback=self.parseobj)
        
        # 仅当前页码小于总页数时生成下一页请求,基于当前响应的域名生成
        if current_page < total_pages:
            next_page_num = current_page + 1
            # 从当前响应中取根地址,自动过滤已有的page参数
            base_url = response.url.split('?')[0]
            next_page = f"{base_url}?page={next_page_num}"
            # 下一页请求携带新的页码参数
            yield scrapy.Request(next_page, callback=self.parse, meta={'page': next_page_num})

    def parseobj(self, response):
        # 原有item解析逻辑保持不变即可
        pass

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:45:03