Python爬虫获取JavaScript动态渲染后的网页内容四种方法

 更新时间:2025年06月03日 09:29:00   作者:小白学大数据  
在爬取动态网页数据时我们需要模拟客户端浏览器环境,让JavaScript能够正常地执行,并获取渲染后的页面数据,这篇文章主要介绍了Python爬虫获取JavaScript动态渲染后的网页内容四种方法,需要的朋友可以参考下

1. 引言

在现代Web开发中,许多网站采用JavaScript动态渲染技术(如React、Vue、Angular等框架)来加载数据,传统的HTTP请求(如Python的**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">requests</font>**库)只能获取初始HTML,而无法捕获JS执行后的内容。因此,爬取这类动态网页需要模拟浏览器行为,等待JavaScript执行完成后再提取数据。

本文将介绍几种主流方法,包括:

  • Selenium(自动化浏览器操作)
  • Playwright(新一代浏览器自动化工具)
  • Pyppeteer(Python版Puppeteer)
  • Requests-HTML(轻量级HTML解析库)

并提供详细的代码实现,帮助开发者高效抓取动态渲染的网页内容。

方法1:使用Selenium获取动态内容

Selenium是一个自动化测试工具,可控制浏览器(如Chrome、Firefox)加载完整页面。

示例代码

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time

# 配置Chrome无头模式
chrome_options = Options()
chrome_options.add_argument("--headless")  # 无界面运行
chrome_options.add_argument("--disable-gpu")

# 指定ChromeDriver路径
service = Service(executable_path="/path/to/chromedriver")
driver = webdriver.Chrome(service=service, options=chrome_options)

# 访问目标网页
url = "https://example.com"
driver.get(url)

# 等待JS执行(可替换为显式等待)
time.sleep(3)  # 简单等待,实际建议使用WebDriverWait

# 获取渲染后的HTML
rendered_html = driver.page_source
print(rendered_html)  # 包含JS动态加载的内容

# 提取特定元素
element = driver.find_element(By.CSS_SELECTOR, "div.dynamic-content")
print(element.text)

# 关闭浏览器
driver.quit()

优缺点

  • 优点:支持所有主流浏览器,适合复杂交互(如点击、滚动)。
  • 缺点:速度较慢,占用资源多。

方法2:使用Playwright(推荐)

Playwright是微软推出的新一代浏览器自动化工具,比Selenium更快且更稳定。

示例代码

from playwright.sync_api import sync_playwright

# 代理配置
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"

with sync_playwright() as p:
    # 启动Chromium浏览器并配置代理
    browser = p.chromium.launch(
        headless=True,  # 无头模式
        proxy={
            "server": f"http://{proxyHost}:{proxyPort}",
            "username": proxyUser,
            "password": proxyPass,
        }
    )
    
    # 创建新页面
    page = browser.new_page()
    
    try:
        # 访问网页并等待加载
        page.goto("https://example.com", timeout=10000)  # 增加超时设置
        page.wait_for_selector("div.dynamic-content")  # 等待目标元素出现
        
        # 获取渲染后的HTML
        rendered_html = page.content()
        print(rendered_html)
        
        # 提取数据
        element = page.query_selector("div.dynamic-content")
        if element:
            print(element.inner_text())
        else:
            print("目标元素未找到")
            
    except Exception as e:
        print(f"发生错误: {e}")
        
    finally:
        # 确保浏览器关闭
        browser.close()

优缺点

  • 优点:速度快,支持多浏览器(Chromium、Firefox、WebKit),API更现代化。
  • 缺点:较新,社区资源略少于Selenium。

方法3:使用Pyppeteer(Python版Puppeteer)

Pyppeteer是基于Chrome DevTools Protocol的Python库,适合高效抓取动态内容。

示例代码

import asyncio
from pyppeteer import launch

async def fetch_rendered_html():
    # 启动浏览器
    browser = await launch(headless=True)
    page = await browser.newPage()
    
    # 访问网页
    await page.goto("https://example.com")
    await page.waitForSelector("div.dynamic-content")  # 等待元素加载
    
    # 获取HTML
    rendered_html = await page.content()
    print(rendered_html)
    
    # 提取数据
    element = await page.querySelector("div.dynamic-content")
    text = await page.evaluate("(element) => element.textContent", element)
    print(text)
    
    # 关闭浏览器
    await browser.close()

# 运行异步任务
asyncio.get_event_loop().run_until_complete(fetch_rendered_html())

优缺点

  • 优点:轻量级,直接控制Chrome,适合高性能爬取。
  • 缺点:仅支持Chromium,异步编程可能增加复杂度。

方法4:使用Requests-HTML(轻量级方案)

Requests-HTML结合了**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">requests</font>****<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">pyppeteer</font>**,适合简单动态页面。

示例代码

from requests_html import HTMLSession

session = HTMLSession()
url = "https://example.com"

# 渲染JS
response = session.get(url)
response.html.render(timeout=20)  # 等待JS执行

# 获取渲染后的HTML
rendered_html = response.html.html
print(rendered_html)

# 提取数据
element = response.html.find("div.dynamic-content", first=True)
print(element.text)

优缺点

  • 优点:API简单,适合小型爬虫。
  • 缺点:功能有限,不适合复杂页面。

总结与选择建议

方法适用场景速度复杂度
Selenium需要兼容多种浏览器中等
Playwright高性能、现代浏览器自动化
Pyppeteer直接控制Chrome中高
Requests-HTML轻量级动态渲染

推荐选择:

  • 优先使用 Playwright(速度快,API友好)。
  • 如果需要兼容旧项目,可选择 Selenium
  • 小型爬虫可尝试 Requests-HTML

结语

本文介绍了4种Python爬取JavaScript动态渲染内容的方法,并提供了完整代码示例。动态网页抓取的关键在于模拟浏览器行为,开发者可根据需求选择合适方案。未来,随着前端技术的发展,爬虫可能需要更智能的反反爬策略(如模拟用户行为、破解加密API等)。

到此这篇关于Python爬虫获取JavaScript动态渲染后的网页内容四种方法的文章就介绍到这了,更多相关Python爬虫获取JS动态渲染后网页内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python使用BeautifulSoup库解析网页

    Python使用BeautifulSoup库解析网页

    在Python的网络爬虫中,网页解析是一项重要的技术。而在众多的网页解析库中,BeautifulSoup库凭借其简单易用而广受欢迎,在本篇文章中,我们将学习BeautifulSoup库的基本用法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2023-08-08
  • 微信跳一跳辅助python代码实现

    微信跳一跳辅助python代码实现

    这篇文章主要为大家详细介绍了微信跳一跳辅助的python代码实现资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • python实现Floyd算法

    python实现Floyd算法

    这篇文章主要为大家详细介绍了python实现Floyd算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • python实现Mysql数据库批量新增数据的场景分析

    python实现Mysql数据库批量新增数据的场景分析

    这篇文章主要介绍了python实现Mysql数据库批量新增数据,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Python中的两个列表数值加法

    Python中的两个列表数值加法

    这篇文章主要介绍了Python中的两个列表数值加法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • python基础教程之lambda表达式使用方法

    python基础教程之lambda表达式使用方法

    lambda表达式相当于函数体为单个return语句的普通函数的匿名函数,本文主要介绍lambda表达式使用方法
    2014-02-02
  • Python调用飞书发送消息的示例

    Python调用飞书发送消息的示例

    这篇文章主要介绍了Python调用飞书发送消息的示例,帮助大家更好的理解和学习python编程语言的用法,感兴趣的朋友可以了解下
    2020-11-11
  • python制作机器人的实现方法

    python制作机器人的实现方法

    机器人自动回复在很多场景中都可以用的上,本文主要介绍了python制作机器人的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • Python学习pygal绘制线图代码分享

    Python学习pygal绘制线图代码分享

    这篇文章主要介绍了Python学习pygal绘制线图代码分享,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 详解Django中 render() 函数的使用方法

    详解Django中 render() 函数的使用方法

    这篇文章主要介绍了Django中 render() 函数的使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04

最新评论