介绍
明天的社区自然观察活动需要一份在来源不可用时仍能阅读的指南。你会把五个页面、三幅插图、一份样式表和一张可打印的观察表放入独立目录。只保存首页无法完成这条阅读路线。
用 Source Guide 浏览原件,用 Workstation 下载文件,用 Field Copy 阅读自己的文件。你将只停止课程提供的来源服务,然后从移动后的副本打开此前未读的卡片和观察表。LabEx 连接仍然可用;这模拟的是内容来源不可访问,而非让整个平台断网。
只需具备基本终端操作经验。本实验会解释 URL、下载参数和相对链接。所有指南文字与插图均为原创合成教学材料,不是现实中的物种鉴定、采食或安全建议。无论教材语言是什么,网站与命令输出都保持英文。
保存一个页面并看清局限
本步骤中,你将走完真实的阅读路线,并只保存一个 HTML 页面作为受控对照。第一次保存是刻意不完整的,不是最终指南。
沿原始指南阅读
打开 Source Guide,选择 Woodland,再选择 Start the route。进入 Silver leaf,阅读正文和插图,再通过 Return to the route 返回。打开 Open observation sheet:这是真实的 SVG 文档,留有绘图与记录空白。用浏览器的后退按钮返回。暂时不要阅读 Amber cap 和 Reed fan,留待后面的断源测试。
指南首页、路线和三张卡片是五个不同的 HTML 文件。图片、CSS 样式和 SVG 观察表也各自独立。Harbor event — online only, outside this guide 是刻意排除的邻接活动,不属于离线阅读路线。
读懂 URL 并保存首页
切换到 Workstation。pwd 显示当前目录。准备好的终端起始位置是项目工作区:
pwd
/home/labex/project
如有需要,可用 cd 切换目录:
cd /home/labex/project
终端可通过 http://127.0.0.1:8081/woodland/index.html 访问来源。http:// 表示使用 HTTP;127.0.0.1 指本实验的同一台机器;8081 是来源端口;/woodland/index.html 是请求的文件路径。Source Guide 标签通过平台浏览器地址展示同一服务。不要把终端使用的回环地址输入你自己电脑的浏览器。
wget 获取一个 URL。它的 -O 参数使用大写字母 O,指定一个输出文件;重试时会覆盖这个文件。下面的命令只保存首页的 HTML:
wget -O first-save.html http://127.0.0.1:8081/woodland/index.html
留意 200 OK 与保存成功的信息。传输用时和字节数可能不同。ls 可列出文件,确认名称:
ls first-save.html
打开 Field Copy,进入 First single-page save。标题与文字存在,但插图和样式缺失。Start the route 返回本地的 404: File not found,因为路线页面并未下载。通过 Return to local files 回到阅读桌面。这是预期的局限,不是原始来源损坏。404 表示服务器已响应但没有这个路径;连接失败则表示服务本身无法连接。
本地阅读桌面通过端口 8082 提供 /home/labex/project 中的文件,绝不会从来源补取缺失文件。
在允许范围内收集指南
本步骤中,你将收集有链接的页面及其资源,同时避免下载旁边的活动。先分清来源的 URL 路径与电脑上的输出目录。
设置有用的边界
来源具有以下布局:
/woodland/ homepage, route, species cards
/shared/woodland/ CSS, three illustrations, observation sheet
/harbor/ a different activity: exclude it
三张卡片位于 /woodland/species/。观察表与样式位于 /woodland/ 之外,存放在明确允许的共享目录中。只允许起始目录的后代会过窄;下载整台主机又会过宽。
Wget 的 --recursive 沿链接继续下载,--level=inf 去掉通常的五层深度限制。本例站点很小且受控;无限深度仍受到允许路径的约束。--page-requisites 还会获取图片和样式表等显示依赖。递归收集发现的是有链接的文件,不是服务器上可能存在的所有无链接文件。
--include-directories=/woodland,/shared/woodland 允许这两个目录树。逗号把两个允许的 URL 前缀连接起来,中间不加空格。这样既包含更深的物种路径,又排除 /harbor/。无需添加 --no-parent:该参数会阻挡这里必需的共享同级目录。
--no-host-directories 不在输出中建立以主机名命名的目录。--directory-prefix=raw-guide 把保留的 URL 层级放在本地 raw-guide/ 下,目录会自动创建。执行下面这一条命令;终端显示时可能自动折行:
wget --recursive --level=inf --page-requisites --no-host-directories --directory-prefix=raw-guide --include-directories=/woodland,/shared/woodland http://127.0.0.1:8081/woodland/index.html
Wget 也会读取并保存来源的 robots.txt,其中允许本次教学下载。它是爬虫元数据,不是额外的指南页面。应得到五个 HTML 页面、五个共享资源文件和这份元数据,共 11 个文件。
find raw-guide -type f 列出整个目录树内的普通文件。-type f 选择文件而非目录:
find raw-guide -type f
确认存在两个指定目录树和 robots.txt,且没有 harbor/ 目录。列表顺序不重要。
文件完整仍不等于链接可用
在 Field Copy 中打开 Raw collected guide。HTML 仍使用 /shared/woodland/guide.css 这样的路径。开头的斜杠表示从阅读服务器的根目录出发,而不是从 raw-guide/ 出发。文件实际上位于 raw-guide/shared/woodland/,所以这些未转换的路径仍找不到目标。
这个区别很重要:收齐正确文件与让导航指向这些文件,是两件事。回到本地阅读桌面。保留 raw-guide/ 作为对照,下一步另建干净的便携副本。
如果 Wget 报连接失败,在 Workstation 运行 source-control start 后重试。这个预备命令只启动所提供的来源,不会下载或修改副本。若想从空目标重做收集,rm -r raw-guide 只删除这个可重建的对照目录及其内容;使用这一可选恢复命令前先检查拼写。
让导航跟随副本
本步骤中,你将创建便携的 field-guide/ 目录,并使用它的真实链接。Wget 能在收集结束后改写已下载的链接。
--convert-links 将指向已下载文件的链接改成相对路径。例如,副本首页会使用 ../shared/woodland/guide.css;.. 表示父目录。更深的卡片需要再经过一个 .. 才能到达相同的共享资源。这些路径会随目录移动,不再依赖阅读服务器的根目录。
来源仍在运行。换用新的目标目录重做范围收集,并加入链接转换:
wget --recursive --level=inf --page-requisites --convert-links --no-host-directories --directory-prefix=field-guide --include-directories=/woodland,/shared/woodland http://127.0.0.1:8081/woodland/index.html
等待末尾的 Converted links 信息。下载完成后,Wget 才知道哪些目标已保存,因此转换发生在下载之后。被排除的 Harbor 活动链接仍是在线引用;它的标签明确说明该活动不属于离线指南。
grep 显示匹配模式的文本行。在真实 HTML 中搜索样式表文件名,查看相对引用:
grep 'guide.css' field-guide/woodland/index.html
输出是一行很长的 HTML。从中找到 ../shared/woodland/guide.css 即可,无需理解或编辑 HTML。引号中的 'guide.css' 把模式作为一个参数传入。
在 Field Copy 中选择 Downloaded guide。此时应出现排版和三幅插图。依次打开 Start the route、Silver leaf、All field notes。观察浏览器地址:链接留在 Field Copy 服务的 /field-guide/ 内。暂时不要打开另外两张卡片,把它们留给下一步。
如果出现 404,将请求地址与 find field-guide -type f 的结果对照:缺文件需要重新收集,根路径错误需要链接转换。若要干净重试,可选命令 rm -r field-guide 只删除这个生成的便携目录,然后重新执行完整命令。Wget 直接复用已有目标时可能生成带编号的重复文件,因此不要把保存下来的 .1 文件当作预期结果。
停止来源并移动指南
本步骤中,你将检验制作副本的目的:来源停止、下载目录移动之后,另一个读者仍可使用指南。
去掉对来源的依赖
在 Workstation 中使用预备的停止命令。它只影响端口 8081,终端与 Field Copy 仍然可用:
source-control stop
Source stopped; Field Copy is still running.
重新加载 Source Guide。因为来源进程已经停止,出现连接错误或平台网关错误是预期现象。缓存中的来源页面不能证明来源仍在运行。回到 Workstation,curl 用来请求地址,--max-time 3 将等待限制为三秒。后缀 || true 让 shell 在这次刻意失败的请求后继续执行:
curl --max-time 3 http://127.0.0.1:8081/woodland/index.html || true
预期看到连接失败,而不是指南 HTML。这证明从实验机器内部也已无法访问来源。现在通过 Field Copy 打开 Downloaded guide、Start the route 和此前未读的 Amber cap。真实正文与图片都应加载。再打开其中的 Observation sheet,应显示真实可打印的 SVG。这些本地地址不同于原始来源 URL。

交出能移动的目录
空的 handover/ 目录已经准备好。mv 会移动完整目录及其所有子项。handover/ 末尾的斜杠明确指定目标是目录:
mv field-guide handover/
原下载位置已经不再存在。列出移动后的目录:
ls handover/field-guide
robots.txt shared woodland
在新的浏览器隐私窗口中打开 Field Copy,或新建标签页,从阅读桌面进入 Moved handover guide。隐私窗口可能需要正常登录平台;学员操作使用新的 Field Copy 标签页即可。移动后的 URL 是 /handover/field-guide/woodland/index.html,由本地阅读服务提供。不要通过旧书签返回已失效的位置。
依次进入 Start the route,打开此前未读的 Reed fan,经 All field notes 返回,再打开 Observation sheet。可以通过浏览器菜单保存或打印观察表。这里使用的是真实文件,不是成功动画。Harbor event 链接属于离线范围之外,来源停止后不要求它可用。
如果必要页面此时失败,先用 source-control start 恢复来源,按上一阶段的方法修复一份干净下载,检查路径后再替换不完整的交接目录。随后停止来源,重走移动后的阅读路线。无需重置整个实验。最后保留完整的交接结果。
最终产物是 handover/field-guide/,包含正文与共享资源。本实验验证通过普通静态文件服务器在浏览器中阅读;不承诺所有浏览器都有相同的 file:// 体验,也不承诺平台可以一键将目录下载到你的电脑。
总结
你比较了单个已保存 HTML 页面和限定范围的递归收集,包含共享依赖,并将链接转换为相对路径。随后你亲手停止来源,从独立本地副本阅读此前未读的内容,并把完整目录移到交接位置。
真正有用的结果是指南本身:五个可阅读页面、三幅插图、一份样式表、真实观察表,以及爬虫元数据。来源是否可访问、下载范围是否正确、本地导航是否可用是不同的属性;你分别检验了它们。



