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

如何使用Scrapy抓取多页面数据?代码问题排查求助

Scrapy多页面数据抓取指南与常见问题排查

一、如何用Scrapy实现多页面数据抓取

Scrapy实现多页面抓取主要有几种常见场景,下面分别说明具体实现方式:

1. 从列表页跟进详情页链接

这是最常见的场景:先爬取列表页,提取每个条目的详情页链接,再逐个请求详情页抓取数据。示例代码如下:

import scrapy

class MultiPageSpider(scrapy.Spider):
    name = "multi_page_spider"
    start_urls = ["https://example.com/article-list"]

    def parse(self, response):
        # 提取列表页中所有详情页的相对链接
        detail_links = response.css("article a.title-link::attr(href)").getall()
        for link in detail_links:
            # 将相对链接转为绝对URL,指定回调函数处理详情页
            yield scrapy.Request(
                url=response.urljoin(link),
                callback=self.parse_detail_page
            )

        # 处理分页,抓取下一页列表
        next_page_link = response.css("a.next-page-btn::attr(href)").get()
        if next_page_link:
            yield scrapy.Request(
                url=response.urljoin(next_page_link),
                callback=self.parse
            )

    def parse_detail_page(self, response):
        # 解析详情页数据并返回
        yield {
            "article_title": response.css("h1.article-title::text").get().strip(),
            "publish_date": response.css("span.publish-date::text").get(),
            "content": "\n".join([p.strip() for p in response.css("div.article-content p::text").getall()])
        }

2. 按规则构造分页URL

如果目标网站的分页URL有明显规律(比如?page=1、?page=2),可以直接批量生成所有分页请求:

def start_requests(self):
    # 抓取前15页数据
    for page_num in range(1, 16):
        page_url = f"https://example.com/article-list?page={page_num}"
        yield scrapy.Request(url=page_url, callback=self.parse)

3. 处理动态加载的分页/内容

如果页面数据是通过AJAX或JS动态渲染的,常规Scrapy请求无法获取到数据,这时候可以配合scrapy_splash(渲染JS页面)或者selenium(模拟浏览器)来实现抓取,核心思路是先渲染出完整页面,再进行数据提取。

二、多页面抓取代码常见问题排查

结合日常开发中遇到的情况,以下是最容易导致抓取失败的问题点:

  • 回调函数指定错误:生成Request时如果拼写错回调函数名、忘记加self.,Scrapy会默认用parse处理请求,导致数据逻辑混乱。
  • 相对链接未转绝对URL:提取的链接如果是相对路径(比如/article/123),直接作为请求URL会导致无效请求,必须用response.urljoin(link)拼接成完整URL。
  • 分页逻辑漏洞:比如下一页链接的选择器写错导致无法获取、没有判断下一页是否存在导致循环请求无效链接、分页需要携带特定Cookie/参数但未添加。
  • 选择器失效:列表页或详情页的XPath/CSS选择器写得不准确,导致提取不到链接或数据,建议用scrapy shell "目标URL"命令测试选择器是否有效。
  • 反爬机制拦截:部分网站会对频繁请求做限制,比如需要携带User-Agent、Cookie,或者有验证码,这时候需要在settings.py中配置请求头,或添加反爬处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:49:15