开发者

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

目录
  • 1. 引言
  • 方法1:使用Selenium获取动态内容
    • 优缺点
  • 方法2:使用Playwright(推荐)
    • 示例代码
    • 优缺点
  • 方法3:使用Pyppeteer(python版Puppeteer)
    • 优缺点
  • 方法4:使用Requests-html(轻量级方案)
    • 优缺点
  • 总结与选择建议
    • 结语

      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 = pagjse.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://exampleandroid.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", e编程客栈lement)
          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
      reandroidndered_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爬虫获取JajsvaScript动态渲染后的网页内容四种方法的文章就介绍到这了,更多相关Python爬虫获取JS动态渲染后网页内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜