如何使用 Python 3.x 从支持 JavaScript 的网页下载 URL

JavaScript

克服从 JavaScript 相关页面下载内容的挑战

当使用 Python 自动从网页下载时,您可能会遇到网页需要启用 JavaScript 才能正常运行的情况。这可能会令人沮丧,因为图书馆喜欢 不是为处理 JavaScript 执行而设计的。 JFrog Artifactory 就是这样的一个例子,它需要 JavaScript 来显示内容或允许下载。

在传统的网页抓取中,您可以使用 或者 来获取网页内容。然而,对于严重依赖 JavaScript 的页面,这些库存在不足,因为它们无法处理动态内容呈现。因此,您将需要更先进的工具来克服此限制。

幸运的是,Python 提供了处理启用 JavaScript 的页面的替代方法。类似的工具 或者 启用完整的浏览器模拟,允许您与此类页面交互并下载内容。这些库可以模拟完全支持 JavaScript 的真实浏览器环境。

本文将探讨如何从使用切换 功能更强大的库,用于从支持 JavaScript 的网页访问和下载内容,确保您的自动化任务顺利运行。

命令 使用示例
webdriver.Chrome() 在 Selenium 中初始化 Chrome 浏览器实例。该命令对于模拟浏览器环境加载 JavaScript 密集型页面至关重要。
options.add_argument('--headless') 将 Selenium 浏览器配置为在无头模式下运行,这意味着浏览器在没有 GUI 的情况下运行。这对于运行自动化脚本而不显示浏览器窗口非常有用。
time.sleep() 将脚本的执行暂停指定的时间。在这种情况下,它允许网页上的 JavaScript 有时间完全加载,然后再继续下一步操作。
page.content() 在 Pyppeteer 中,此命令检索网页的全部内容,包括动态渲染的 JavaScript 内容,这对于保存最终的 HTML 输出至关重要。
await page.waitForSelector() 等待特定 HTML 元素加载,然后再继续。在处理大量 JavaScript 页面时,这一点至关重要,以确保在提取内容之前呈现所需的元素。
session.get() Requests-HTML 中的此命令将 GET 请求发送到提供的 URL。它在这里用于在渲染任何 JavaScript 组件之前获取网页。
response.html.render() 在 Requests-HTML 库中的网页上执行 JavaScript。此命令对于处理支持 JavaScript 的页面至关重要,而无需完整的浏览器。
launch(headless=True) 在 Pyppeteer 中启动无头浏览器,类似于 Selenium。这允许脚本访问大量 JavaScript 网页并与之交互,而无需打开图形浏览器窗口。
with open() 打开一个文件以用 Python 进行写入。在这种情况下,它用于将从网页检索到的 HTML 内容保存到文件中以供进一步处理或分析。

使用 Python 从支持 JavaScript 的页面下载

在传统的 Python 网络抓取中,类似的库 通常用于直接从网页下载内容。然而,在处理大量使用 JavaScript 的网站(例如 JFrog Artifactory)时,这些库就显得不足了。主要原因是网页需要JavaScript来动态加载内容,这 要求 无法处理。为了克服这个问题,我们推出了诸如 , , 和 请求-HTML,允许 JavaScript 执行。这些工具模拟浏览器环境,使 Python 脚本能够从依赖 JavaScript 的网页访问和下载内容。

使用 Selenium 的第一种方法涉及启动一个可以呈现 JavaScript 的浏览器实例。它允许我们在提取页面的源代码之前等待页面完全加载。当页面内容是动态生成时,这特别有用。例如,使用 命令初始化浏览器,然后访问目标 URL。通过使用 ,我们确保为 JavaScript 加载提供足够的时间。最后,将提取的页面内容保存到文件中,以静态形式为我们提供所需的网页。

在第二种方法中,我们使用了 Pyppeteer,它是 Puppeteer 的 Python 包装器。 Pyppeteer 是另一个强大的工具,旨在处理 JavaScript 执行。与 Selenium 一样,Pyppeteer 启动一个无头浏览器,导航到网页,等待 JavaScript 执行,然后检索内容。使用 Pyppeteer 的一个关键优势是它提供了对浏览会话的更多控制,例如使用以下命令等待特定元素加载 。这可确保在脚本尝试下载所需的页面内容之前已完全呈现该内容。

第三种解决方案利用 Requests-HTML 库,该库简化了渲染 JavaScript 的过程,而无需像 Selenium 或 Pyppeteer 这样的完整浏览器。通过 Requests-HTML,我们可以使用以下命令发起 HTTP 会话 获取网页,然后执行 JavaScript 方法。与完整浏览器模拟方法相比,此解决方案更轻,并且当您不需要完整浏览器的开销时通常更合适。它对于更简单的 JavaScript 操作特别有用,使其成为特定用例的最佳选择。

在 Python 中下载支持 JavaScript 的页面的 URL

该解决方案使用 Selenium(一个 Python 库)来处理 JavaScript 密集型页面。 Selenium 允许您控制 Web 浏览器,使您能够模拟 JavaScript 执行并检索动态内容。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
def download_using_selenium(url, username, apikey):
    # Setup Selenium WebDriver
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    driver.get(url)
    time.sleep(3)  # Wait for JavaScript to load
    
    # Assuming basic authentication via URL for this example
    auth_url = f'{url}?username={username}&password={apikey}'
    driver.get(auth_url)
    
    # Extract content
    page_content = driver.page_source
    
    # Save to file
    with open("download_selenium.html", "w") as file:
        file.write(page_content)
    
    driver.quit()
    print("Download complete using Selenium.")

使用 Pyppeteer 下载支持 JavaScript 的页面

该解决方案使用 Pyppeteer,Puppeteer(无头浏览器)的 Python 端口,它可以执行 JavaScript 并动态检索页面内容。

import asyncio
from pyppeteer import launch
async def download_using_pyppeteer(url, username, apikey):
    # Launch headless browser
    browser = await launch(headless=True)
    page = await browser.newPage()
    
    # Basic auth and URL loading
    auth_url = f'{url}?username={username}&password={apikey}'
    await page.goto(auth_url)
    
    # Wait for the JavaScript to load
    await page.waitForSelector('body')
    
    # Extract page content
    content = await page.content()
    
    # Save to file
    with open("download_pyppeteer.html", "w") as file:
        file.write(content)
    
    await browser.close()
    print("Download complete using Pyppeteer.")
# Run the async function
asyncio.get_event_loop().run_until_complete(download_using_pyppeteer("https://example.com", "user", "key"))

使用 Requests-HTML 处理 JavaScript 渲染

这种方法利用了 Requests-HTML 库,无需整个浏览器即可轻松渲染 JavaScript。

from requests_html import HTMLSession
def download_using_requests_html(url, username, apikey):
    session = HTMLSession()
    
    # Make the request
    auth_url = f'{url}?username={username}&password={apikey}'
    response = session.get(auth_url)
    
    # Render the JavaScript
    response.html.render()
    
    # Save the page content
    with open("download_requests_html.html", "w") as file:
        file.write(response.html.html)
    
    print("Download complete using Requests-HTML.")
download_using_requests_html("https://example.com", "user", "key")

增强支持 JavaScript 的页面的 Python Web 抓取

在抓取大量 JavaScript 网页时,一个常见的挑战是绕过身份验证或 API 密钥限制,尤其是在 JFrog Artifactory 等应用程序中。虽然我们之前使用 Selenium 和 Pyppeteer 等工具探索了浏览器自动化,但还有其他解决方案更专注于处理 HTTP 响应。例如,集成 API 和利用标头可以帮助绕过身份验证提示或检索更具体的内容,而无需完整浏览器模拟的开销。

另一个关键方面是这些库如何处理复杂的表单,例如登录或 API 令牌输入所需的表单。典型的解决方案涉及使用 Python 库模拟表单提交,例如 。这允许与服务器端身份验证无缝交互,无需执行 JavaScript,从而节省资源。此外,对于更安全的页面,在脚本中添加会话管理和基于令牌的身份验证等功能可以显着提高性能。

讨论验证码挑战等潜在问题也很重要,这可能成为抓取或自动化任务时的障碍。为了处理验证码,一些开发人员选择自动解决验证码的第三方服务。其他人集成了机器学习算法,尽管这可能更复杂。了解这些额外的安全措施有助于您准备脚本以应对更广泛的挑战,确保您的 Python 脚本在与基于 JavaScript 的平台交互时高效运行。

  1. 如何使用 Python 抓取 JavaScript 渲染的内容?
  2. 使用类似的工具 , , 或者 从网页获取内容时处理 JavaScript 执行。
  3. 处理 JavaScript 密集型网站的最佳工具是什么?
  4. 对于复杂的 JavaScript 密集型网站来说通常是最佳选择,因为它模仿了真实的浏览器交互。 也非常有效。
  5. 如何处理网页抓取中的身份验证?
  6. 您可以使用 通过在 HTTP 标头中发送 API 密钥和令牌来处理基本和基于令牌的身份验证的库。
  7. 抓取时可以绕过验证码吗?
  8. 是的,通过使用验证码解决服务或集成机器学习算法。然而,这增加了复杂性,并且可能不适用于所有用例。
  9. 是否可以避免浏览器自动化来执行简单的抓取任务?
  10. 是的,对于更简单的任务, 图书馆或 可以处理数据的获取,而不需要完全的浏览器自动化。

从 JavaScript 密集型网页访问内容需要的不仅仅是基本的 HTTP 请求。通过利用 Selenium 和 Pyppeteer 等工具,我们可以模拟执行 JavaScript 并检索网页完整内容的浏览器环境。这些工具为自动化任务提供了灵活性。

尽管浏览器自动化更加耗费资源,但它是处理复杂页面的可靠解决方案。对于更简单的情况,Requests-HTML 可以是一个轻量级的替代方案。选择正确的工具取决于站点的复杂性和项目的具体需求。

  1. 有关使用 Selenium 对 JavaScript 密集型页面进行网页抓取的信息参考了 Selenium 官方文档。在这里访问它: 硒文档
  2. Pyppeteer 用于处理动态 JavaScript 内容的实现基于 Pyppeteer 的 GitHub 页面的详细信息。您可以在这里找到更多信息: Pyppeteer GitHub
  3. 对于 requests 和 Requests-HTML 库,我们从 Requests-HTML 文档中获取见解,该文档提供了对在 Python 中处理 JavaScript 渲染的更深入的理解: 请求-HTML 文档
  4. 管理身份验证和 API 使用的最佳实践受到 Real Python 上有关 Python 网络抓取技术的文章的启发: 真正的Python