17人参与 • 2025-06-03 • 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是一个自动化测试工具,可控制浏览器(如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()
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 | 轻量级动态渲染 | 中 | 低 |
推荐选择:
本文介绍了4种python爬取javascript动态渲染内容的方法,并提供了完整代码示例。动态网页抓取的关键在于模拟浏览器行为,开发者可根据需求选择合适方案。未来,随着前端技术的发展,爬虫可能需要更智能的反反爬策略(如模拟用户行为、破解加密api等)。
到此这篇关于python爬虫获取javascript动态渲染后的网页内容四种方法的文章就介绍到这了,更多相关python爬虫获取js动态渲染后网页内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论