it编程 > 编程语言 > Javascript

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

17人参与 2025-06-03 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执行完成后再提取数据。

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

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

方法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()

优缺点

方法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())

优缺点

方法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)

优缺点

总结与选择建议

方法适用场景速度复杂度
selenium需要兼容多种浏览器中等
playwright高性能、现代浏览器自动化
pyppeteer直接控制chrome中高
requests-html轻量级动态渲染

推荐选择:

结语

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

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

(0)

您想发表意见!!点此发布评论

推荐阅读

SQL解析工具JSQLParser及常见类

05-29

JavaScript调用Android接口常见的3种方式

05-28

javascript fetch 用法讲解

05-27

JSR-107缓存规范介绍

05-22

统一返回JsonResult踩坑的记录

06-10

解决JSONField、JsonProperty不生效的问题

06-10

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论