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

作者:

文章目录
  • 在现代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解析库) 并提供详细的代码实现,帮助开发者高效抓取动态渲染的网页内容。
  • 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()
  • Playwright是微软推出的新一代浏览器自动化工具,比Selenium更快且更稳定。
  • 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())
  • 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 轻量级动态渲染 中 低 推荐选择: 优先使用 Playwright(速度快,API友好)。 如果需要兼容旧项目,可选择 Selenium。 小型爬虫可尝试 Requests-HTML。
  • 本文介绍了4种Python爬取JavaScript动态渲染内容的方法,并提供了完整代码示例。动态网页抓取的关键在于模拟浏览器行为,开发者可根据需求选择合适方案。未来,随着前端技术的发展,爬虫可能需要更智能的反反爬策略(如模拟用户行为、破解加密API等)。 到此这篇关于Python爬虫获取JavaScript动态渲染后的网页内容四种方法的文章就介绍到这了,更多相关Python爬虫获取JS动态渲染后网页内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
  • 目录
    • 1. 引言
    • 方法1:使用Selenium获取动态内容
      • 优缺点
    • 方法2:使用Playwright(推荐)
      • 示例代码
      • 优缺点
    • 方法3:使用Pyppeteer(Python版Puppeteer)
      • 优缺点
    • 方法4:使用Requests-HTML(轻量级方案)
      • 优缺点
    • 总结与选择建议
      • 结语

        在现代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解析库)

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

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

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

        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。

        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,异步编程可能增加复杂度。

        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动态渲染后网页内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

        站内搜索