如何使用Selenium Python下载由JavaScript函数链接的所有子页面
下载JavaScript函数跳转页面的最优方法
针对你给出的这类JS跳转页面,最优方法分两种场景选择:
一、静态提取法(适合当前简单场景)
因为你的JS函数都是直接通过document.location跳转到固定HTML文件,没有复杂逻辑,完全不需要运行JS就能提取所有目标链接:
操作步骤:
- 提取所有跳转目标:
- 逐个查看每个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更高效)。
- 逐个查看每个HTML文件里的
- 去重并批量下载:
- 把收集到的URL去重,得到
index.html、a.html、b.html、c.html、d.html、e.html这几个文件。 - 用命令行工具批量下载,比如用
wget:
如果是本地文件直接复制即可;如果是远程服务器,把URL换成完整地址就行。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为例):
- 安装依赖:
pip install playwright playwright install chromium - 编写爬取脚本:
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
相关产品推荐
相关产品推荐

