Python如何爬取同一URL下的多页表格数据 以CCIL官网为例
同URL多页表格爬取的data参数获取方案
核心原理
你要爬取的CCIL站点用的是ASP.NET Web Form架构,这类站点的分页逻辑完全基于POST表单提交,不会在URL中携带分页参数,你说的data参数就是POST请求需要提交的表单字段集合。
data参数各字段的获取方式
- 基础校验字段:
__VIEWSTATE、__VIEWSTATEGENERATOR、__EVENTVALIDATION三个是ASP.NET的固定校验字段,每次页面刷新都会更新。你第一次用GET请求访问初始页时,直接用BeautifulSoup从返回HTML的<input type="hidden" name="对应字段名">标签中提取value值即可。 - 分页触发字段:
__EVENTTARGET是控制分页的核心参数,你可以打开浏览器F12开发者工具,切换到「网络」面板,点击第二页分页按钮,抓取发送给OMMWSG.aspx的POST请求,在请求的「表单数据」板块就能看到对应页码的__EVENTTARGET取值,所有页码的对应值都可以通过这个方式获取。
爬取逻辑说明
每次请求下一页之前,都需要先从上一页返回的HTML中重新提取三个基础校验字段的最新值,和对应页码的__EVENTTARGET一起组装成data参数,发起POST请求就能拿到对应分页的页面内容,再解析表格即可。
注意:该网站仅会在特定时间段展示对应数据,爬取前需确认目标数据处于开放展示时段,否则请求返回的页面不会包含目标表格。
简化实现代码示例
import requests from bs4 import BeautifulSoup import pandas as pd target_url = "https://www.ccilindia.com/OMMWSG.aspx" # 替换为你自己的浏览器UA,避免被拦截 req_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } # 拉取初始页数据 page_resp = requests.get(target_url, headers=req_headers) page_soup = BeautifulSoup(page_resp.text, "html.parser") table_list = [] # 解析初始页表格,表格索引根据实际页面结构调整 init_table = pd.read_html(page_resp.text)[0] table_list.append(init_table) # 这里替换为你抓包拿到的所有分页对应的__EVENTTARGET值 page_event_list = [ "gvOMMWSG$ctl28$lnkPage2", "gvOMMWSG$ctl28$lnkPage3", "gvOMMWSG$ctl28$lnkPage4" ] for event_target_val in page_event_list: # 提取当前页最新的校验字段值 viewstate_val = page_soup.find("input", {"name": "__VIEWSTATE"})["value"] viewstate_gen_val = page_soup.find("input", {"name": "__VIEWSTATEGENERATOR"})["value"] event_validation_val = page_soup.find("input", {"name": "__EVENTVALIDATION"})["value"] # 组装POST请求的data参数 post_data = { "__VIEWSTATE": viewstate_val, "__VIEWSTATEGENERATOR": viewstate_gen_val, "__EVENTVALIDATION": event_validation_val, "__EVENTTARGET": event_target_val } # 请求下一页 page_resp = requests.post(target_url, headers=req_headers, data=post_data) page_soup = BeautifulSoup(page_resp.text, "html.parser") current_table = pd.read_html(page_resp.text)[0] table_list.append(current_table) # 合并全部分页表格数据 full_table = pd.concat(table_list, ignore_index=True)
内容的提问来源于stack exchange,提问作者Tech Bro
相关产品推荐
相关产品推荐

