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

如何使用Selenium Python下载由JavaScript函数链接的所有子页面

下载JavaScript函数跳转页面的最优方法

针对你给出的这类JS跳转页面,最优方法分两种场景选择:

一、静态提取法(适合当前简单场景)

因为你的JS函数都是直接通过document.location跳转到固定HTML文件,没有复杂逻辑,完全不需要运行JS就能提取所有目标链接:

操作步骤:

  1. 提取所有跳转目标:
    • 逐个查看每个HTML文件里的<script>标签,找出所有类似document.location = 'xxx.html'的代码,把单引号里的URL全部收集起来——比如从index.html里拿到a.html、b.html、c.html,从a.html拿到d.html、e.html,从e.html拿到d.html、b.html。
    • 同时核对页面里的<a href="javascript:xxx()">,确保所有函数对应的URL都被覆盖(不过这里函数和URL是一一对应的,直接提取JS里的URL更高效)。
  2. 去重并批量下载:
    • 把收集到的URL去重,得到index.html、a.html、b.html、c.html、d.html、e.html这几个文件。
    • 用命令行工具批量下载,比如用wget:
      wget index.html a.html b.html c.html d.html e.html
      
      如果是本地文件直接复制即可;如果是远程服务器,把URL换成完整地址就行。

进阶:用脚本自动提取

如果文件数量多,写个简单的Python脚本自动提取所有目标URL:

import re
import os
import subprocess

# 初始文件列表
files_to_process = ['index.html']
visited_files = set(files_to_process)
target_urls = set(files_to_process)

# 匹配document.location中的URL
url_pattern = re.compile(r"document\.location\s*=\s*'([^']+)'")

while files_to_process:
    current_file = files_to_process.pop()
    if not os.path.exists(current_file):
        continue
    with open(current_file, 'r', encoding='utf-8') as f:
        content = f.read()
        matches = url_pattern.findall(content)
        for url in matches:
            if url not in visited_files:
                visited_files.add(url)
                target_urls.add(url)
                files_to_process.append(url)

# 输出并下载
print("需要下载的页面:")
for url in target_urls:
    print(url)

subprocess.run(['wget'] + list(target_urls))

二、动态爬取法(适合复杂JS场景)

如果JS函数里有复杂逻辑(比如根据变量跳转、异步加载链接),静态提取就失效了,这时候用浏览器自动化工具模拟真实访问:

操作步骤(以Playwright为例):

  1. 安装依赖:
    pip install playwright
    playwright install chromium
    
  2. 编写爬取脚本:
    from playwright.sync_api import sync_playwright
    import os
    
    visited_urls = set()
    # 替换为你的本地文件路径或远程网站地址
    base_path = "file:///your/local/html/folder/"
    
    def crawl(url):
        if url in visited_urls:
            return
        visited_urls.add(url)
        file_name = url.split('/')[-1]
        
        with sync_playwright() as p:
            browser = p.chromium.launch(headless=True)
            page = browser.new_page()
            page.goto(url)
            # 保存页面HTML
            with open(file_name, 'w', encoding='utf-8') as f:
                f.write(page.content())
            # 处理所有javascript链接
            links = page.locator('a[href^="javascript:"]')
            for i in range(links.count()):
                link = links.nth(i)
                func_name = link.get_attribute('href').replace('javascript:', '').replace('()', '')
                # 执行跳转函数
                page.evaluate(f"{func_name}()")
                new_url = page.url
                crawl(new_url)
            browser.close()
    
    # 开始爬取入口页面
    crawl(base_path + "index.html")
    print("所有页面下载完成")
    

方法选择建议

当前你的场景里,JS逻辑极其简单,静态提取法是最优的——不需要依赖浏览器,速度快,资源占用少。只有当JS跳转逻辑复杂到静态分析无法处理时,再用动态爬取法。

内容的提问来源于stack exchange,提问作者bcExpt1123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:00:52