如何用Python下载需启用JavaScript的网页?附现有代码
解决Python下载URL时的JavaScript启用提示问题
问题描述
请求目标URL时返回拦截提示:
We're sorry but jfrog webapp doesn't work properly without JavaScript enabled. Please enable it to continue当前使用的代码:
import requests def download(url,username,apikey): filename = "dump.txt" s = requests.session() resp = s.get(url,auth=(username, apikey)) file_size = int(resp.headers.get('content-length', 0)) length = 1024*1024*5 total = 0 if resp.status_code == 200: with open(filename, 'wb') as out: for chunk in resp.iter_content(length): total += length if file_size > 0: print("[%.2f]\r"%(total/file_size),end="",flush=True) out.write(chunk) else: print(url) print("[*] download error:" + str(r.status_code)) # 注意:此处变量r未定义,应改为resp exit(0) print("save file to:",filename) return def main(): url = "https://artifactory.sample.com/sample" username="xxxx" apikey="yyyy" download(url,username,apikey) return main()
核心原因
requests是纯HTTP请求库,不会执行JavaScript。目标网站通过检测请求的客户端环境,发现没有JS执行能力,因此返回拦截页面。要解决这个问题,必须使用能模拟浏览器行为、执行JS的工具。
解决方案:使用Playwright实现带JS支持的下载
Playwright是一款轻量化的浏览器自动化工具,能模拟真实浏览器的JS执行环境,配置简单。
1. 安装依赖
pip install playwright playwright install chromium
2. 修改后的代码
from playwright.sync_api import sync_playwright def download(url, username, apikey): filename = "dump.txt" with sync_playwright() as p: # 启动无头浏览器(headless=True为无界面模式,False可显示浏览器窗口) browser = p.chromium.launch(headless=True) # 设置HTTP基础认证 context = browser.new_context( http_credentials={"username": username, "password": apikey} ) page = context.new_page() # 访问目标URL,等待页面加载完成(包括JS执行) page.goto(url, wait_until="networkidle") # 监听并获取下载文件 download_obj = page.wait_for_download() download_obj.save_as(filename) browser.close() print("save file to:", filename) def main(): url = "https://artifactory.sample.com/sample" username="xxxx" apikey="yyyy" download(url, username, apikey) if __name__ == "__main__": main()
代码说明
sync_playwright():启动Playwright同步执行上下文http_credentials:替代原代码中的auth参数,设置HTTP基础认证page.goto(..., wait_until="networkidle"):等待页面所有网络请求完成,确保JS渲染完毕wait_for_download():监听页面的下载事件,获取下载文件对象save_as():将下载文件保存到指定路径
额外提示
- 如果目标URL是展示页面而非直接下载文件,可改用
page.content()获取JS渲染后的HTML内容,再写入文件 - 原代码中的错误:else分支里的
r.status_code需改为resp.status_code,否则会抛出未定义变量异常
内容的提问来源于stack exchange,提问作者lucky1928
相关产品推荐
相关产品推荐

