使用 Python 抓取动态网页:Selenium、Playwright、requests-html 和 Pyppeteer 的对比与应用
                           
天天向上
发布: 2024-12-26 23:04:17

原创
69 人浏览过

抓取动态网页(即通过 JavaScript 渲染内容的网页)在 Python 中的传统抓取方法(如 requestsBeautifulSoup)通常无法抓取通过 JavaScript 动态生成的内容。为了处理这类网页,可以使用一些工具和库,它们可以模拟浏览器的行为并抓取最终渲染的网页内容。

以下是常见的几种方法来使用 Python 抓取动态网页:


1. 使用 Selenium + WebDriver

Selenium 是一个可以自动化网页浏览器操作的工具,支持与网页中的 JavaScript 交互。你可以通过 Selenium 模拟浏览器行为,加载 JavaScript 渲染的内容,并提取网页中的数据。

安装 Selenium 和 WebDriver:

首先需要安装 Selenium 和一个浏览器驱动(如 ChromeDriver)。

pip install selenium

然后下载与浏览器版本匹配的 WebDriver(如 ChromeDriver)。

示例:使用 Selenium 抓取动态网页

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 设置 Chrome 浏览器驱动
driver = webdriver.Chrome(executable_path='/path/to/chromedriver')  # 替换为实际路径

# 打开网页
driver.get('https://example.com')  # 替换为实际目标网页

# 等待页面加载完毕,时间可以根据需要调整
time.sleep(3)

# 获取网页中动态渲染的元素
element = driver.find_element(By.XPATH, '//div[@class="example-class"]')
print(element.text)

# 关闭浏览器
driver.quit()

在这个例子中,driver.get() 会加载网页,time.sleep(3) 会等待页面加载完成,之后你可以像操作普通网页一样抓取元素。

使用 JavaScript 渲染后的页面

有时候,页面内容是通过 JavaScript 动态渲染的。使用 Selenium,你可以获取加载完成后的完整 HTML 内容:

# 获取页面渲染后的 HTML 内容
html_content = driver.page_source

2. 使用 Playwright

Playwright 是另一个强大的浏览器自动化工具,它支持 Chromium、Firefox 和 WebKit 的浏览器,可以与 JavaScript 动态加载的网页进行交互,并获取渲染后的内容。Playwright 比 Selenium 更加高效和稳定。

安装 Playwright

pip install playwright

Playwright 会自动安装所需的浏览器驱动程序。

示例:使用 Playwright 抓取动态网页

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    # 启动浏览器
    browser = p.chromium.launch(headless=True)  # 设置为 False 可以显示浏览器
    page = browser.new_page()

    # 打开目标网页
    page.goto('https://example.com')

    # 等待页面加载完成
    page.wait_for_selector('div.example-class')

    # 获取动态渲染的内容
    content = page.text_content('div.example-class')
    print(content)

    # 关闭浏览器
    browser.close()

在这个例子中,Playwright 用 page.goto() 打开网页,page.wait_for_selector() 等待特定元素加载完成。你可以用 page.text_content() 或其他方法提取网页内容。


3. 使用 Requests-HTML

requests-html 是一个功能强大的库,它基于 PyQuery 和 Chromium(通过 Pyppeteer)实现了类似浏览器的功能,可以直接渲染 JavaScript 内容。

安装 requests-html

pip install requests-html

示例:使用 requests-html 抓取动态网页

from requests_html import HTMLSession

# 创建一个会话
session = HTMLSession()

# 发送请求并获取网页
response = session.get('https://example.com')

# 渲染 JavaScript 内容
response.html.render()

# 获取渲染后的 HTML 内容
html_content = response.html.html
print(html_content)

# 获取某个特定元素的文本内容
element = response.html.find('.example-class', first=True)
print(element.text)

在这个例子中,response.html.render() 会使用 Chromium 渲染 JavaScript 动态内容。然后,你可以像处理普通 HTML 一样提取渲染后的内容。


4. 使用 Pyppeteer

Pyppeteer 是 Python 中对 Puppeteer 的封装,Puppeteer 是一个基于 Chromium 的自动化工具,可以完全模拟浏览器的行为,适合抓取动态网页。

安装 Pyppeteer

pip install pyppeteer

示例:使用 Pyppeteer 抓取动态网页

import asyncio
from pyppeteer import launch

async def main():
    # 启动 Chromium 浏览器
    browser = await launch(headless=True)
    page = await browser.newPage()

    # 打开目标网页
    await page.goto('https://example.com')

    # 等待页面加载
    await page.waitForSelector('div.example-class')

    # 获取网页内容
    content = await page.evaluate('document.querySelector("div.example-class").innerText')
    print(content)

    # 关闭浏览器
    await browser.close()

# 运行异步事件
asyncio.get_event_loop().run_until_complete(main())

在这个例子中,Pyppeteer 通过 launch() 启动 Chromium 浏览器,page.evaluate() 可以执行 JavaScript 代码获取网页中的元素。


总结

  1. Selenium:适合自动化浏览器,模拟用户操作,抓取动态加载的内容。可以与 JavaScript 进行交互,支持多种浏览器。
  2. Playwright:更现代、高效的浏览器自动化工具,支持 Chromium、Firefox 和 WebKit,性能更好,适用于动态网页抓取。
  3. requests-html:简单且高效,使用内置的浏览器引擎来渲染动态网页,适合抓取基于 JavaScript 渲染的内容。
  4. Pyppeteer:基于 Puppeteer 的 Python 封装,适用于需要高精度浏览器控制的任务。

选择工具时,可以根据任务的复杂性和对性能的要求来决定使用哪种方案。

发表回复 0

Your email address will not be published. Required fields are marked *