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

Scrapy爬取无URL变化分页页面遇到问题求助

解决Scrapy爬取动态分页(URL无变化)的问题

问题分析

你遇到的分页无效问题,核心原因有两点:

  • 下一页按钮的XPath定位错误,导致无法检测到分页按钮
  • ASP.NET(DNN)网站分页需要提交页面隐藏的状态字段(如__VIEWSTATE),当前提交的表单数据不完整

修正后的代码

import scrapy

class LegonSpider(scrapy.Spider):
    name = "legon"

    def start_requests(self):
        yield scrapy.Request(
            url="https://mylegion.org/PersonifyEbusiness/Find-a-Post",
            callback=self.parse
        )

    def parse(self, response):
        # 提交筛选条件(距离、国家)
        yield scrapy.FormRequest.from_response(
            response,
            formid='aspnetForm',
            formdata={
                'dnn$ctr2802$DNNWebControlContainer$ctl00$DistanceList': '100',
                '@IP_COUNTRY': 'USA',
                '@IP_DEPARTMENT': '00000000001L'
            },
            callback=self.parse_post_page
        )

    def parse_post_page(self, response):
        # 提取详情页链接并请求
        post_elements = response.xpath("//div[@class='membership-dir-result-item']")
        for post_element in post_elements:
            post_num = post_element.xpath(".//div[contains(@class,'POST_NAME')]/text()").get().strip()
            post_link = post_element.xpath("./a/@href").get()
            yield response.follow(post_link, callback=self.parse_post_detail, meta={'post_num': post_num})

        # 修正下一页按钮的XPath定位(添加//前缀)
        next_page_button = response.xpath("//input[@id='dnn_ctr2802_DNNWebControlContainer_ctl00_Next']")
        if next_page_button:
            # 使用from_response自动提取页面所有隐藏状态字段,只补充分页触发参数
            yield scrapy.FormRequest.from_response(
                response,
                formid='aspnetForm',
                formdata={
                    '__EVENTTARGET': 'dnn$ctr2802$DNNWebControlContainer$ctl00$Next',
                    '__EVENTARGUMENT': ''
                },
                callback=self.parse_post_page
            )

    def parse_post_detail(self, response):
        leader1 = response.xpath("(//div[contains(@class,'Leadership')]/div[2]/text())[1]").get()
        leader2 = response.xpath("(//div[contains(@class,'Leadership')]/div[2]/text())[2]").get()
        address = response.xpath("//div[contains(@class,'Address')]/div[2]/text()").get()
        typ = response.xpath("//div[contains(@class,'Type')]/div[2]/text()").get()

        yield {
            "post_num": response.meta['post_num'],
            "leader1": leader1.strip() if leader1 else None,
            "leader2": leader2.strip() if leader2 else None,
            "address": address.strip() if address else None,
            "type": typ.strip() if typ else None
        }

关键修改点

  1. 修复XPath定位:将下一页按钮的XPath从/input[@id='...']改为//input[@id='...'],确保能正确找到页面中的分页按钮元素。
  2. 完整提交表单状态:在提交分页请求时,保留formid='aspnetForm'参数,让FormRequest.from_response自动提取页面中的__VIEWSTATE、__EVENTVALIDATION等ASP.NET必需的隐藏字段,这些字段是维持页面状态、实现分页跳转的核心。
  3. 数据处理优化:在详情页提取数据时,对空值做了判断并去除多余空格,避免输出无效数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:08:16