本文目录导读:

**
《从零到一:用脚本完整镜像整个网站的实战指南(含代码与避坑)》
目录导读
- 为什么要“下载整个网站”?——适用场景与伦理边界
- 核心工具盘点:wget、HTTrack、Scrapy 怎么选?
- 手把手实操:wget 递归下载全站(附参数详解)
- 进阶:Python + Scrapy 动态渲染页面抓取方案
- 常见问题与破解策略(反爬、链接失效、资源缺失)
- 合规红线:哪些网站不能动?
- 从“搬运”到“理解”的转变
为什么要“下载整个网站”?
你可能需要离线阅读文档、备份个人博客、或分析竞品结构,但请注意:未经授权的整站下载可能违反服务条款,本文仅用于技术学习与合法备份场景,如抓取自己的网站或公开的公有领域资源。
工具三选一:各有千秋
- wget:Linux/Mac 自带,轻量高效,适合静态站。
- HTTrack:图形界面,镜像“音容笑貌”,自动修正链接。
- Scrapy:Python 框架,能处理 JS 渲染,但需写脚本。
回答者视角:如果你追求“一条命令搞定”,选 wget;如果对方网站是单页应用(Vue/React),则必须用 Scrapy。
实操:wget 递归下载全站
假设你要镜像 https://example.com/docs/,在终端执行:
wget --mirror \
--convert-links \
--adjust-extension \
--page-requisites \
--no-parent \
--wait=2 \
--limit-rate=200k \
https://example.com/docs/
参数解密:
--mirror:开启递归且保留时间戳。--convert-links:将绝对链接转为相对路径,便于本地浏览。--page-requisites:下载图片、CSS、JS 等页面必需资源。--no-parent:不上级目录,防止“黑洞”抓取。--wait=2:每请求间隔 2 秒,礼貌防封。
问答:
Q:抓下来全是 .html 后缀?
A:加 --adjust-extension 能让 .php?id=1 变为 .php?id=1.html,浏览器可正常打开。
进阶:Scrapy 处理动态网站
很多现代站点用 Ajax 加载内容,wget 只能拿到空壳,参考以下思路:
import scrapy
from scrapy.crawler import CrawlerProcess
class FullSiteSpider(scrapy.Spider):
name = "mirror"
start_urls = ["https://example.com/login"]
def start_requests(self):
# 先登录获取 Cookie
yield scrapy.Request(self.start_urls, callback=self.login)
def login(self, response):
yield scrapy.FormRequest.from_response(
response,
formdata={'username': 'user', 'password': 'pass'},
callback=self.after_login
)
def after_login(self, response):
# 爬取所有内部链接
for url in response.css('a::attr(href)').getall():
if url.startswith('https://example.com/internal'):
yield scrapy.Request(url, callback=self.parse_page)
def parse_page(self, response):
# 利用 Splash 或 Playwright 渲染 JS
# 保存 HTML 及静态资源
pass
陷阱提示:Scrapy 默认不执行 JS,需结合 scrapy-splash 或 selenium 中间件。
常见坑与解决方案
- 链接失效:下载后
grep -r "404"检查,并用xargs -n1修补。 - 资源缺失:
--page-requisites仍缺字体?需手动抓取@font-face指向的 woff 文件。 - 反爬虫:遇到 403,修改 User-Agent 为浏览器,或增加
--user-agent参数。 - 无限循环:
--no-parent配合--exclude-directories排除日历、搜索页。
问答:
Q:下载一半中断,能续传吗?
A:wget 用 --continue;Scrapy 则用 JOBDIR 保存状态。
合规红线:别碰这些网站
- 明确禁止爬取的
robots.txt(Facebook、Instagram)。 - 需登录会员才能访问的付费内容(如 Coursera 课程)。
- 涉及个人隐私的社交平台动态。
- 含版权图片、音频的资源站。
安全提醒:即使技术上可行,也要尊重版权,合法用途包括:自己的网站、明确授权镜像的文档站。
从“搬运”到“理解”的转变
脚本下载是“手段”,但真正有价值的不是你硬盘里的副本,而是你在分析网站结构中锻炼出的信息架构思维,下次看到喜欢的网站,不妨先问一句:“我该用 wget 还是 scrapy 来实现这个目标?” 当你开始思考这个问题时,你已经从“使用者”变成了“构造者”。
最后问答汇总
- Q:哪个工具最不容易被封?
A:没有绝对,--wait=3且限制速率,模仿人更稳。 - Q:网站有 CDN 缓存,下载会乱码?
A:添加--header="Cache-Control: no-cache"绕过缓存。 - Q:能直接转成 PDF 吗?
A:先wget再用wkhtmltopdf批量转换,但排版需二次适配。
希望这篇指南能帮你合规、高效地完成“网站镜像”任务,技术无对错,用法有边界。