跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

如何绕过JavaScript渲染直接抓取NIC招生动态表格数据

本文介绍如何通过分析网站网络请求,定位后端api接口,使用requests直接获取json格式的动态生成表格数据,并导出为csv,避免selenium因页面加载、反爬或dom结构异常导致的空结果问题。 本文介绍如何通过分析网站网络请求,定位后端api接口,使用requests直接获取json格式的动态生成表格数据,并导出为csv,避免selenium因页面加载、反爬或dom结构异常导致的空结果问题。 对于以JavaScript动态渲染内容的网页(如NIC招生系统 https://admissions.nic.in/admiss/admissions/orcrjacd/105012321),盲目依赖Selenium等待元素出现往往失败——并非因为等待时间不足,而是目标表格根本 不通过常规HTML 标签渲染 ,而是由前端JS调用API获取JSON数据后动态拼接生成。此时,真正的数据源藏在浏览器开发者工具的 Network → XHR/Fetch 请求中。 经实际抓包分析,该页面在加载时发起了一次关键API请求:
GET https://admissions.nic.in/aisheapi/apisaishe/api/cmsservice.asmx/getConfiguredORCRInfo
该接口返回结构化JSON,其中嵌套字段 data_dict["CounsellingData"] 即为待抓取的完整表格数据(含多页内容,无需模拟点击“Next”按钮)。 以下是稳定、高效、免浏览器的解决方案: Eclipse导入Android或其他的JAVA项目的正确方法 WORD版 本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看 下载 立即学习 “ Java免费学习笔记(深入) ”;
import requests import json import pandas as pd # 伪造合理请求头,绕过基础反爬校验 headers = { 'accept': 'application/json, text/plain, */*', 'accept-language': 'en-GB,en-US;q=0.9,en;q=0.8', 'authtoken': '1111', # 注意:此值为示例占位符,实际需从页面JS或响应中提取 'clientid': '2222', # 同上,需动态获取或固定合法值(部分接口可能校验宽松) 'content-type': 'application/json', 'sec-ch-ua': '"Chromium";v="123", "Not:A-Brand";v="8"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Linux"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36', } params = { 'boardId': '105012321', # 对应URL中的ID,即目标招生批次编号 } response = requests.get( 'https://admissions.nic.in/aisheapi/apisaishe/api/cmsservice.asmx/getConfiguredORCRInfo', params=params, headers=headers, timeout=30 ) # 检查HTTP状态码与响应完整性 response.raise_for_status() data = response.json() # 解析嵌套JSON:注意.NET WebMethod常将真实数据包裹在'd'字段中 if 'd' not in data: raise ValueError("API响应结构异常:未找到'd'字段") json_str = data['d'] inner_data = json.loads(json_str) # 提取核心表格数据(已含全部分页记录) counselling_data = inner_data.get("CounsellingData", []) if not counselling_data: raise ValueError("CounsellingData为空,请检查boardId或接口权限") df = pd.DataFrame(counselling_data) df.to_csv("counselling_data.csv", index=False, encoding='utf-8-sig') # Windows Excel友好编码 print(f"✅ 成功导出 {len(df)} 条记录至 counselling_data.csv")
关键注意事项: ✅ authtoken 与 clientid 并非固定值 :本例中 '1111' 和 '2222' 仅为示意。实践中需在浏览器Network面板中筛选该API请求,复制其真实请求头中的对应值;若页面JS动态生成,可搜索 authtoken 或 clientid 字符串定位初始化逻辑。 ✅ 无需分页处理 :CounsellingData 是服务端一次性返回的全量数据数组,天然规避了“Next按钮”自动化难题。 ⚠️ 错误处理不可省略 :务必添加 response.raise_for_status() 和字段存在性校验,避免静默失败。 ? 遵守Robots协议与网站条款 :该数据属政府公开招生信息,但批量高频请求仍建议添加合理延时(如 time.sleep(1)),并确认用途合规。 相比Selenium方案,此方法执行更快(毫秒级响应)、资源占用极低、稳定性高,是处理AJAX驱动型政务/教育类网站的理想实践。核心思路始终不变: 优先溯源数据源头,而非渲染表象。

相关文章