抓取NMPA进口医疗器械数据遇API通信失败及动态参数获取问题
解决方案
核心思路:你提到的GBK-开头的动态参数是服务器下发的会话绑定参数,没有前端加密逻辑,直接从初始列表页的响应内容中提取即可,参数和当前请求会话的Cookie绑定,需要保持同一会话发起请求。
具体实现步骤
- 用
requests.Session()创建会话,保持Cookie同步,避免参数失效 - 先请求目标站点的初始入口页,从返回的HTML中用正则匹配提取完整的
6SQk6G2z参数值 - 拼接成完整的POST请求URL后,即可正常发起翻页请求
- 若请求过程中出现参数失效的情况,重新请求一次初始页提取新的参数即可
可运行完整代码
import requests import re # 创建会话保持cookie同步 session = requests.Session() # 初始入口页地址 base_url = "http://app1.nmpa.gov.cn/data_nmpa/face3/base.jsp?tableId=27&tableName=TABLE27&title=%E8%BF%9B%E5%8F%A3%E5%8C%BB%E7%96%97%E5%99%A8%E6%A2%B0%E4%BA%A7%E5%93%81%EF%BC%88%E6%B3%A8%E5%86%8C&bcId=152904442584853439006654836900" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0", "Accept": "*/*", "Accept-Language": "en-US,en;q=0.5", "cache-control": "no-cache", "Content-Type": "application/x-www-form-urlencoded", "Pragma": "no-cache" } # 请求初始页提取动态参数 base_resp = session.get(base_url, headers=headers) # 调整编码为GBK避免乱码 base_resp.encoding = "GBK" # 正则匹配6SQk6G2z参数的完整值 param_match = re.search(r'search\.jsp\?6SQk6G2z=(GBK-[^"]+)', base_resp.text) if not param_match: raise Exception("动态参数提取失败,请检查入口页是否可正常访问") dynamic_param = param_match.group(1) # 拼接完整请求URL url = f"http://app1.nmpa.gov.cn/data_nmpa/face3/search.jsp?6SQk6G2z={dynamic_param}" data = { "tableId": "27", "State": [ "1", "1", "1", "1", "1", "1", "1" ], "bcId": "152904442584853439006654836900", "tableName": "TABLE27", "viewtitleName": "COLUMN200", "viewsubTitleName": "COLUMN192,COLUMN199", "curstart": "2", # 此处修改为目标页码 "tableView": "进口医疗器械产品(注册" } r = session.post(url, headers=headers, data=data) # 调整响应编码 r.encoding = "GBK" print(r.text)
注意事项
- 单次提取的动态参数仅在当前会话有效期内可用,会话过期后重新请求初始页提取即可
- 不要频繁发起请求,避免触发站点的反爬限制
- 抓取数据请遵守站点相关使用规范,仅用于合法用途
内容的提问来源于stack exchange,提问作者αԋɱҽԃ αмєяιcαη
相关产品推荐
相关产品推荐

