Scrapy分页爬取异常求助:无法适配非标准分页结构
解决Scrapy针对非标准分页的爬取问题
别担心,这种没有明确next按钮的分页我也踩过坑,咱们一步步来搞定它。
首先得摸清楚这个网站的分页逻辑:既然当前页码是用带current类的span标记的,那我们可以先定位到这个当前页元素,然后找到它的下一个兄弟li——那里面大概率就是下一页的链接。如果下一个兄弟不存在,说明已经爬完最后一页了。
具体实现步骤
定位当前页元素
在你的Spider里,用CSS选择器或者XPath定位当前页码的元素都可以:# CSS选择器写法 current_page = response.css('span.page-numbers.current') # XPath写法 current_page = response.xpath('//span[contains(@class, "page-numbers current")]')获取并跳转下一页
先回到当前页元素的父节点li,再选取它的下一个兄弟li,最后提取里面的链接:next_li = current_page.xpath('../following-sibling::li[1]') if next_li: next_page_url = next_li.css('a.page-numbers::attr(href)').get() if next_page_url: # 用response.follow自动处理相对路径,不用手动拼接 yield response.follow(next_page_url, self.parse)
要注意的边界情况
- 如果到了最后一页,当前页的下一个兄弟
li可能不存在,或者是「上一页」按钮,所以一定要加if next_li的判断,避免报错 - 要是网站分页是动态加载的,那可能得换思路,但从你给出的静态结构来看,上面的方法完全适用
给你一个完整的Spider代码片段参考:
import scrapy class YourSpider(scrapy.Spider): name = 'your_spider' start_urls = ['https://target-website.com'] def parse(self, response): # 先处理当前页的数据提取逻辑 for item in response.css('your-target-item-selector'): yield { 'title': item.css('.title::text').get().strip(), # 这里添加你需要提取的其他字段 } # 处理分页逻辑 current_page = response.css('span.page-numbers.current') next_li = current_page.xpath('../following-sibling::li[1]') if next_li: next_page_url = next_li.css('a.page-numbers::attr(href)').get() if next_page_url: yield response.follow(next_page_url, self.parse)
你可以先跑一下这个代码,看看是不是能正确遍历所有分页~
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

