如何通过Python requests.get调用JavaScript函数实现PDF下载
结论
仅使用requests库无法实现你预期的需求。
报错原因
你遇到的requests.exceptions.InvalidSchema异常根源是两点:
- requests是纯HTTP客户端库,仅支持处理
http://、https://、ftp://这类标准网络协议的请求,javascript:属于浏览器端的伪协议,专门用于触发浏览器执行JS代码,不在requests的支持范围内,所以直接抛出“找不到对应连接适配器”的错误。 - requests没有内置JavaScript运行环境,只能获取网页的静态文本内容,无法解析、执行页面内嵌的JS函数,你预期的调用
submitForm("pdf")的操作用requests根本无法完成。
可行解决方案
方案1:抓包模拟请求(优先推荐)
打开浏览器F12开发者工具的「网络」面板,手动点击页面上触发submitForm("pdf")的按钮,观察浏览器实际发出的HTTP请求详情:
- 确认请求的目标URL、请求方法(GET/POST)
- 确认请求携带的参数、请求头、Cookie信息
拿到以上信息后,直接用requests模拟这个真实的HTTP请求,就能直接获取到PDF的二进制内容,你原有的保存文件逻辑不需要改动。
方案2:使用带JS执行能力的自动化工具
如果页面请求加密逻辑复杂,抓包模拟成本高,可以使用Selenium、Playwright这类浏览器自动化工具,这类工具会启动真实的浏览器内核,支持加载完整页面、执行页面内置JS函数,可以直接调用submitForm("pdf")后拦截返回的PDF内容完成下载。
# 方案1的简化示例逻辑(替换为你抓包得到的真实参数即可) import requests import shutil import os main_dir = os.path.dirname(__file__) headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36'} with requests.Session() as s: # 先请求原页面保持会话状态 page_resp = s.get(url, verify=False, headers=headers) if page_resp.status_code == 200: # 替换为你抓包得到的PDF请求地址、请求参数 pdf_resp = s.post( "https://example.com/gen_pdf", data={"type": "pdf"}, verify=False, stream=True, headers=headers ) if pdf_resp.status_code == 200: with open(os.path.join(main_dir, 'nfe.pdf'), 'wb') as f: shutil.copyfileobj(pdf_resp.raw, f)
内容的提问来源于stack exchange,提问作者Julio S.
相关产品推荐
相关产品推荐

