批量保存网站HTML需据需求选方法:原始响应用curl/wget,动态渲染用Selenium,编码复杂用requests;务必处理反爬、URL编码、文件名非法字符、UTF-8无BOM保存及Chrome驱动匹配。

批量保存网站 HTML 源码不是“点一下就完事”的操作,关键看你要的是原始响应(GET 返回的静态 HTML),还是渲染后的真实 DOM 结构,以及是否要连带 CSS/JS/图片一起存。选错方法会导致文件打不开、样式丢失、脚本报错——尤其是现代 SPA 页面。
用 curl 或 wget 抓取原始 HTML 响应
这是最轻量、最可控的批量方式,适合目标页面不依赖 JS 渲染、且服务器允许直接访问的场景。它拿到的是服务端返回的原始字节流,不含浏览器执行后的修改。
-
curl -o page1.html https://example.com:保存单页,-o 指定文件名 -
wget -O page2.html https://example.com:效果类似,但wget默认会尝试解析并下载同域资源(加--no-parent可禁用) - 批量时建议加
-s(静默)和--max-time 10(超时控制),避免卡死 - 注意:如果页面有反爬(如 403、验证码、User-Agent 拦截),需加
-H "User-Agent: Mozilla/5.0" - 中文 URL 要先
urlencode,否则curl会失败,错误信息类似URL using bad/illegal format or missing URL
用 requests + Python 脚本控制请求与编码
当需要处理重定向、Cookie、Session、动态 Header 或统一转码时,requests 比命令行工具更可靠。尤其遇到 GBK 编码网页却没声明 charset,curl 会乱码,而 Python 可显式解码。
- 务必检查
response.encoding,很多网站不设Content-Type: text/html; charset=utf-8,requests会误判为 ISO-8859-1 - 推荐写法:
response = requests.get(url); response.encoding = response.apparent_encoding or "utf-8" - 保存时用
open(... , encoding="utf-8"),避免 Windows 记事本打开乱码 - 若需并发,别直接上
threading,用concurrent.futures.ThreadPoolExecutor控制数量,防止触发风控 - 示例片段:
import requests<br>url = "https://example.com"<br>r = requests.get(url)<br>r.encoding = r.apparent_encoding or "utf-8"<br>with open("output.html", "w", encoding="utf-8") as f:<br> f.write(r.text)
用 Selenium 获取渲染后 DOM(适合 Vue/React 页面)
如果你右键“查看源代码”看到的是一堆 <div id="app"></div>,而 Elements 面板里才有真实内容,那就必须走浏览器自动化。但代价是慢、占内存、易被检测。
立即学习“前端免费学习笔记(深入)”;
- 不要用
driver.page_source直接保存——它有时包含未清理的调试注释或临时节点 - 推荐用
driver.find_element("tag name", "html").get_attribute("outerHTML"),更接近人工复制 outerHTML 的效果 - 启动 Chrome 时加
--headless=new和--disable-gpu,减少资源占用 - 每个页面加载后加
time.sleep(2)或等某个元素出现(WebDriverWait),否则可能截到空白页 - chromedriver 版本必须和本地 Chrome 严格匹配,否则报
session not created
别忽略路径、编码与文件名的细节
批量保存后打不开,十次有八次栽在这三处:路径含非法字符、文件名被截断、编码不一致导致中文变问号。这些不是“小问题”,而是阻断后续所有分析的硬伤。
- URL 中的
/、?、=等必须替换为下划线或哈希,否则 Windows 下无法创建文件,错误如OSError: [Errno 22] Invalid argument - 文件名长度超过 255 字符?Windows 会静默失败,建议用
hashlib.md5(url.encode()).hexdigest()[:12]生成简短标识 - 所有 HTML 文件统一用 UTF-8 无 BOM 保存;若原始页面是 GB2312,转存时也应 decode 再 encode 成 UTF-8,而非直接二进制写入
- 保存后快速用
file output.html(Linux/macOS)或 PowerShellGet-Content output.html -Encoding UTF8验证头几行是否可读



















