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 }
关键修改点
- 修复XPath定位:将下一页按钮的XPath从
/input[@id='...']改为//input[@id='...'],确保能正确找到页面中的分页按钮元素。 - 完整提交表单状态:在提交分页请求时,保留
formid='aspnetForm'参数,让FormRequest.from_response自动提取页面中的__VIEWSTATE、__EVENTVALIDATION等ASP.NET必需的隐藏字段,这些字段是维持页面状态、实现分页跳转的核心。 - 数据处理优化:在详情页提取数据时,对空值做了判断并去除多余空格,避免输出无效数据。
内容的提问来源于stack exchange,提问作者mohamed agnaby
相关产品推荐
相关产品推荐

