You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:36:03