如何使用 WGET 保存此网页

如何使用 WGET 保存此网页

举个例子,下面是我想要保存的页面之一:

https://www.oculus.com/experiences/rift/1233145293403213

当我使用 WGET 时,它会将其下载为 html,这通常没有问题。但是当我在文本编辑器中打开 html 时,网站上显示的一大堆文本不见了。就像该页面上“其他详细信息”部分中关于 html 缺失的所有内容一样。

以下是在 Windows 中使用的命令:

wget --no-check-certificate -O test.html https://www.oculus.com/experiences/rift/1233145293403213/

我的命令行是否缺少了某些东西,或者 WGET 不是适合此网站的正确工具?

谢谢。

答案1

我的命令行是否缺少了某些东西,或者 WGET 不是适合此网站的正确工具?

查看网页的源代码,似乎“其他详细信息”部分是用 JavaScript 呈现的。不幸的是,wget不支持 JavaScript。

一个可能的解决方案是使用浏览器完全呈现页面并保存呈现的源代码。从技术上讲,可以使用任何可以与浏览器交互的自动化工具自动完成此操作,包括通用工具,例如自动热键专门设计用来与它们交互的,例如

警惕无头模式

具体来说,就 Selenium 而言,可以使用它在“无头”模式下与现代版本的 Chrome 和 Firefox 进行交互,此时不会显示浏览器窗口。

但是,窗口可见性会影响最终“呈现”的 HTML。对于您原始问题中的示例 Oculus 链接,这似乎确实如此。也就是说,page_source当浏览器窗口可见时,“其他详细信息”部分显然仅包含在标准 Selenium 属性中。


Python 和 Selenium

Selenium 带有多种语言绑定,但其 Python 绑定相对容易使用。

下面是一个简单示例,说明如何使用以下命令检索示例页面的源 HTMLPython未在 Google 上搜索过的 Chromium

安装

  1. 安装适用于 Windows 的 Python。如果您在使用 3.8.x 分支时遇到问题,那么 3.7.x 分支肯定可以解决这个问题。

    在安装过程中,您可能需要选择将 Python 安装到 Windows 路径中的选项(以便从命令行使用)以及选择安装 Pythonpy启动器的选项。

    您还可能希望将 Python 安装到不包含空格或特殊字符的路径中,并且该路径不是 Windows 中的“特殊”文件夹(因此请避免使用Program FilesProgram Files (x86)您的User文件夹)。

  2. 安装 Ungoogled Chromium 的 Windows 版本。在本例中,使用来自伍莉斯(32 位或 64 位)。该页面上有多个 Chromium 版本可用,因此请查找未在 Google 上搜索到的“Marmaduke”版本并下载相应的版本7-zip使用“存档”链接存档:

    未在 Google 上搜索过的 Chromium - Woolyss

    下载完成后,只需将档案提取到您希望 Ungoogled Chromium 驻留的任何位置即可。

  3. 安装Selenium 的 Python 语言绑定。假设您从步骤 1 安装的 Python 副本可从命令行获得(例如,您将其添加到 Windows 路径中),只需运行python -m pip install selenium即可下载并安装必要的文件。

使用 Python 创建自动化脚本

下面是一个简单的示例脚本,可以下载您原始问题中的链接的 HTML,包括“其他详细信息”部分:

# --- Imports ---

# Python Standard Library
import time

# Selenium Python Bindings
from selenium import webdriver
from selenium.webdriver.chrome.options import Options


# --- Main ---

# Necessary Options for Selenium/Ungoogled Chromium.
options = Options()

options.binary_location = "C:/path/to/Ungoogled Chromium/chrome.exe"
chromedriver_path = 'C:/path/to/Ungoogled Chromium/chromedriver.exe'

# Create a Selenium webdriver object so we can issue commands to ex. Chromium.
driver = webdriver.Chrome(options=options, executable_path=chromedriver_path)

# Open Ungoogled Chromium to this web page.
driver.get('https://www.oculus.com/experiences/rift/1233145293403213/')

# Wait for 10 seconds.
time.sleep(10)

# Any page retrieved with get() has a page_source attribute. Running the code
# below with the example page above in non-headless mode should (generally)
# yield the same code as using "Save As" in the browser.
html_source = driver.page_source

# Write the returned page_source to a file. "encoding" should match the web
# page encoding of the original page to avoid write issues.
with open('page_source.html', 'w', encoding='UTF-8') as web_page_source:
    web_page_source.write(html_source)

# Wait for 10 seconds.
time.sleep(10)

# Shutdown (including closing Chrome)
driver.quit()

答案2

以下是我在命令行上使用 Google Chrome 转储完整呈现的网页的方法:

/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
  --headless \
  --virtual-time-budget=10000 \
  --timeout=10000 \
  --run-all-compositor-stages-before-draw \
  --user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36" \
  --disable-gpu \
  --dump-dom "https://example.com/" >file.html

相关内容