完全渲染后的页面内容
在 Flask 或 Tornado 中,当使用 requests
库获取其他服务的响应时,若要获取完全渲染后的页面内容(包括 JavaScript 执行后的 DOM),需要使用无头浏览器技术。这是因为 requests
只能获取原始 HTML,无法执行其中的 JavaScript 代码。
以下是两种解决方案:
方案 1:使用无头浏览器(推荐)
使用 requests-html
或 Selenium
等工具模拟浏览器行为,执行 JavaScript 并获取最终渲染结果。
示例:使用 requests-html
from requests_html import HTMLSessiondef get_rendered_page(url):session = HTMLSession()response = session.get(url)# 执行页面中的 JavaScript(最多等待 10 秒)response.html.render(timeout=10)# 返回渲染后的 HTMLreturn response.html.html# 使用示例
rendered_html = get_rendered_page("https://example.com")
print(rendered_html) # 包含 JS 执行后的完整 HTML
示例:使用 Selenium
from selenium import webdriver
from selenium.webdriver.chrome.options import Optionsdef get_rendered_page(url):chrome_options = Options()chrome_options.add_argument("--headless") # 无头模式driver = webdriver.Chrome(options=chrome_options)driver.get(url)# 等待页面完全加载(根据需要调整等待条件)driver.implicitly_wait(10) # 隐式等待# 获取渲染后的 HTMLrendered_html = driver.page_sourcedriver.quit()return rendered_html# 使用示例
print(get_rendered_page("https://example.com"))
方案 2:在服务端渲染(适用于 Flask/Tornado)
如果目标页面是你自己控制的服务,可在服务端完成渲染:
Flask 示例(使用 render_template
)
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/render-demo')
def render_demo():# 服务端渲染页面return render_template('dynamic_page.html', data=get_dynamic_data())# 在另一个路由中获取渲染结果
@app.route('/get-rendered')
def get_rendered():with app.test_request_context():# 模拟渲染过程rendered = render_template('dynamic_page.html', data=get_dynamic_data())return rendered # 返回渲染后的 HTML 字符串
Tornado 示例(使用 render_string
)
import tornado.webclass RenderHandler(tornado.web.RequestHandler):def get(self):# 直接渲染并返回给客户端self.render("dynamic_page.html", data=get_dynamic_data())class GetRenderedHandler(tornado.web.RequestHandler):def get(self):# 获取渲染后的 HTML 字符串html = self.render_string("dynamic_page.html", data=get_dynamic_data())self.write(html) # 可作为字符串使用
关键区别说明:
方法 | 适用场景 | JavaScript 执行 | 额外依赖 |
---|---|---|---|
requests 库 | 获取静态 HTML/API 数据 | ❌ 不执行 JS | 无 |
无头浏览器 (requests-html /Selenium ) | 获取动态渲染页面 | ✅ 执行所有 JS | 需要安装浏览器 |
服务端渲染 (Flask/Tornado) | 自己控制的服务 | ❌ 服务端不执行 JS | 无 |
如何选择?
- 获取第三方网站内容 → 使用无头浏览器方案
- 获取自己服务的渲染结果 → 使用服务端渲染方案
- 仅需静态 HTML → 使用普通
requests
库
# 普通 requests 示例(仅获取原始 HTML)
import requestsresponse = requests.get("https://example.com")
print(response.text) # 不包含 JS 执行结果
重要提示:使用无头浏览器抓取第三方网站时,请遵守目标网站的
robots.txt
和版权规定,避免高频请求导致 IP 被封禁。