php抓取网页标签(开发“快速行动和破除web陈规”的理念不相符)

优采云 发布时间: 2021-12-27 22:10

  php抓取网页标签(开发“快速行动和破除web陈规”的理念不相符)

  译者:福旺

  我最近在研究网站归档,因为有些朋友担心在系统管理不善或恶意删除的情况下会失去对放置在互联网上的内容的控制。这使得网站归档成为系统管理员工具箱中的重要工具。事实证明,有些网站比其他网站更难存档。本文介绍了归档传统网站的过程,并解释了它在面对最新流行的单页应用程序 (SPA) 现代网站时的缺点。

  转换为简单的网站

  手动编码 HTML 网站的日子早已一去不复返了。当今的网站是动态的,并且使用最新的 JavaScript、PHP 或 Python 框架即时构建。因此,这些站点更容易受到攻击:数据库崩溃、升级错误或未修复的漏洞都可能导致数据丢失。之前做网页开发的时候,不得不接受一个客户的想法:希望网站基本上可以长生不老。这种期望与Web开发“快速行动,打破陈规”的想法不谋而合。对此,Drupal 内容管理系统(CMS)的使用尤其具有挑战性,因为重大更新会破坏与第三方模块的兼容性,这意味着客户很少承担高昂的升级成本。解决办法是将这些网站归档:基于实时动态的网站,将它们转换为纯 HTML 文件,可以由任何 Web 服务器永久提供服务。此过程对您自己的动态网站非常有用,也适用于您想要保护但无法控制的第三方网站。

  对于简单的静态网站,旧的 Wget 程序可以完成这项工作。但是,镜像和保存完整网站的命令很复杂:

  $ nice wget --mirror --execute robots=off --no-verbose --convert-links \

  --backup-converted --page-requisites --adjust-extension \

  --base=./ --directory-prefix=./ --span-hosts \

  --域=,

  上述命令下载网页内容,同时抓取指定域名内的所有内容。在为您最喜欢的网站执行此操作之前,请考虑此类抓取可能对您的网站产生的影响。上面的命令故意忽略robots.txt规则,就像现在归档者的习惯做法一样,尽可能快地归档网站。大多数爬虫可以选择暂停和限制爬行之间的带宽使用,以避免站点瘫痪。

  上面的命令还会得到“页面所需(LCTT Annotation:单个页面所需的所有元素)”,比如样式表(CSS)、图片、脚本等。下载页面的内容将被修改,以便链接也指向本地副本。任何 Web 服务器都可以托管生成的文件集,从而生成原创

网站的静态副本。

  以上是一切顺利的时候。任何使用过计算机的人都知道,事情很少会按计划进行;各种各样的事情都会以有趣的方式使程序偏离轨道。例如,日历块在网站上流行了一段时间。内容管理系统会动态生成这些内容,这会使爬虫陷入死循环,试图检索所有页面。智能归档器可以使用正则表达式(例如,Wget 有一个 --reject-regex 选项)来忽略有问题的资源。如果可以访问站点的管理界面,另一种方法是禁用日历、登录表单、评论表单等动态区域。一旦网站变得静态,(那些动态区域)肯定会停止工作,因此从原创

网站中去除这些杂乱的内容并非完全没有意义。

  JavaScript 的噩梦

  不幸的是,有些网站不仅仅是用纯 HTML 文件构建的。例如,在单页网站中,Web 浏览器通过执行一个小的 JavaScript 程序来构建内容。像 Wget 这样的简单用户代理将很难重新创建这些站点的有意义的静态副本,因为它根本不支持 JavaScript。理论上,网站应该使用渐进增强技术来提供内容和实现功能,而无需使用 JavaScript,但使用 NoScript 或 uMatrix 等插件的人很少遵循这些准则。

  传统的归档方法有时会以最傻瓜式

方式失败。在尝试为本地报纸网站 (pamplemousse.ca) 创建备份时,我发现 WordPress 在收录

的 JavaScript 的末尾添加了一个查询字符串(例如:?ver=1.12. 4)。这会使提供存档服务的web服务器无法正确检测内容类型,因为它依赖文件扩展名来发送正确的Content-Type头信息。当web浏览器加载此类存档时,这些脚本将无法加载,导致动态网站损坏。

  随着 Web 转变为使用浏览器作为执行任意代码的虚拟机,依赖于纯 HTML 文件解析的归档方法需要相应地进行调整。解决这个问题的方法是在爬取时记录(并重现)服务器提供的HTTP头信息。事实上,专业档案工作者使用这种方法。

  创建和显示 WARC 文件

  在 Internet Archive 网站上,布鲁斯特·卡勒 (Brewster Kahle) 和迈克·伯纳 (Mike Burner) 于 1996 年设计了 ARC(或“ARChive”)文件格式,以提供一种方法来聚合他们存档工作产生的数百万个小文件。该格式最终被标准化为 WARC(“Web ARChive”)规范,该规范于 2009 年作为 ISO 标准发布并于 2017 年修订。标准化工作由国际互联网保护联盟(IIPC)牵头。根据维基百科,这是一个“国际图书馆组织和其他组织,旨在协调保护未来互联网内容的努力”;它的成员包括美国国会图书馆(US Library of Congress)和互联网档案馆。后者在其基于 Java 的 Heritrix 爬虫中使用 WARC 格式(LCTT 翻译和注释:

  WARC 在单个压缩文件中聚合多个资源,例如 HTTP 标头信息、文件内容和其他元数据。方便的是,Wget 实际上提供了 --warc 参数来支持 WARC 格式。不幸的是,Web 浏览器无法直接显示 WARC 文件,因此为了访问存档文件,需要查看器或进行某种格式转换。我找到的最简单的查看器是 pywb,它以 Python 包的形式运行一个简单的 Web 服务器,并提供一个类似于“Wayback Machine”的界面来浏览 WARC 文件的内容。执行以下命令将显示地址为 8080/ 的 WARC 文件的内容:

  $ pip 安装 pywb

  $ wb-manager 初始化示例

  $ wb-manager 添加示例 crawl.warc.gz

  $回归

  顺便说一下,这个工具是由Webrecorder 服务提供商创建的,Webrecoder 服务可以使用Web 浏览器保存动态页面的内容。

  遗憾的是pywb无法加载Wget生成的WARC文件,因为它与1.0规范不一致,而1.1规范解决了这个问题。即使Wget或pywb修复了这些问题,Wget生成的WARC文件也不够可靠,我使用,所以我寻找其他替代方案。引起我注意的爬虫程序简称为crawl。这是它的调用方式:

  $爬行

  (它的README文件说“非常简单”。)该程序支持一些命令行参数选项,但大多数默认值是最好的:它会从其他域中获取所需的页面(除非-exclude相关参数使用) ,但肯定不会递归出域。默认情况下,它将与远程站点建立十个并发连接。可以使用 -c 参数更改此值。但是,最重要的是生成的WARC文件可以用pywb完美加载。

  未来的工作和替代方案

  有更多关于使用 WARC 文件的资源。特别是有一个直接替代 Wget 的工具,它专门用于归档网站,称为 Wpull。它在实验上支持 PhantomJS 和 youtube-dl 的集成,可以分别下载更复杂的 JavaScript 页面和流媒体。该程序是名为 ArchiveBot 的复杂归档工具的基础。ArchiveBot 被 ArchiveTeam 的“分散的档案员、程序员、作家和演讲者”使用,他们致力于“在历史永远丢失之前保存历史”。PhantomJS 的集成似乎没有团队预期的那么好,所以 ArchiveTeam 还使用了其他分散的工具来镜像和保存更复杂的网站。例如,snscrape 将抓取社交媒体配置文件以生成要发送给 ArchiveBot 的页面列表。

  如果没有提到被称为“网站复制器”的 HTTrack 项目,那么这篇文章是不完整的。它的工作原理与 Wget 类似。HTTrack 可以创建远程站点的本地副本,但遗憾的是它不支持导出 WRAC 文件。对于不熟悉命令行的新手用户来说,在人机交互方面更有价值。

  同样,在我的研究中,我发现了一个完全重制的 Wget 版本,称为 Wget2,它支持多线程操作,这可能使它比其前身更快。与 Wget 相比,它舍弃了一些功能,但最显着的是拒绝模式、WARC 输出和 FTP 支持,以及添加 RSS、DNS 缓存和改进的 TLS 支持。

  最后,我个人对这些工具的愿景是将它们与我现有的书签系统集成。我目前在 Wallabag 中有一些有趣的链接,这是一个自托管的“稍后阅读”服务,旨在成为 Pocket(现在由 Mozilla 拥有)的免费替代品。但是 Wallabag 旨在仅保留文章的“可读”副本,而不是完整的副本。在某些情况下,“可读版本”实际上是不可读的,Wallabag 有时无法解析文章。相反,其他工具如 bookmark-archiver 或 reminiscence 会保存页面的屏幕截图和完整的 HTML 文件,但遗憾的是,它没有 WRAC 文件,因此无法更可信地再现网页内容。

  我所经历的关于镜像保存和归档的悲剧是死数据。幸运的是,业余档案工作者可以使用工具在线保存有趣的内容。对于那些不想打扰的人来说,“Internet Archive”似乎仍然存在,而且 ArchiveTeam 显然是在为 Internet Archive 本身进行备份。

  通过:

  作者:Anarcat 主题:lujun9972 译者:fuowang 校对:wxy

  本文由 LCTT 原创,Linux China 获此殊荣

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线