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
相关产品推荐
相关产品推荐

