在 Python 中获取的 HTML 与浏览器中显示的网页不同,通常是因为网页使用了 动态加载技术(如 JavaScript 渲染、AJAX 请求、懒加载等)。浏览器会执行 JavaScript 动态生成内容,而 Python 的 requests
或 urllib
只能获取初始 HTML(静态内容),无法执行 JavaScript。
requests
获取的 HTML 缺少部分内容(如商品价格、评论、动态表格等)。Selenium 可以执行 JavaScript,获取动态加载后的 HTML:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 设置 ChromeDriver 路径(需下载对应版本的 chromedriver)
service = Service("path/to/chromedriver")
driver = webdriver.Chrome(service=service)
# 访问网页
driver.get("https://example.com")
# 等待页面加载(可加显式等待)
# from selenium.webdriver.support.ui import WebDriverWait
# from selenium.webdriver.support import expected_conditions as EC
# WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "dynamic-content")))
# 获取渲染后的 HTML
html = driver.page_source
print(html)
# 关闭浏览器
driver.quit()
优点:能获取完整动态内容。 缺点:速度较慢,依赖浏览器驱动。
Playwright 是比 Selenium 更现代的自动化工具,支持多种浏览器(Chromium、Firefox、WebKit):
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True) # headless=False 可看到浏览器操作
page = browser.new_page()
page.goto("https://example.com")
# 等待特定元素加载(可选)
# page.wait_for_selector("#dynamic-content")
html = page.content()
print(html)
browser.close()
优点:比 Selenium 更快,支持无头模式。
缺点:需要额外安装 playwright
和浏览器。
如果动态内容是通过 AJAX 加载的,可以直接用 requests
获取 API 数据:
XHR
或 Fetch
请求,找到数据接口。优点:比 Selenium/Playwright 更快。 缺点:需要手动分析 API,可能受反爬限制。
requests.get()
返回的 HTML 可能是登录页或错误页。headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
response = requests.get("https://example.com", headers=headers)
print(response.text)
session = requests.Session()
session.get("https://example.com/login") # 先访问登录页
response = session.get("https://example.com/protected-page")
print(response.text)
proxies = {
"http": "http://your_proxy_ip:port",
"https": "https://your_proxy_ip:port"
}
response = requests.get("https://example.com", proxies=proxies)
pytesseract
)或打码平台(适用于大量请求)。requests
获取的 HTML 可能缺少部分数据。没有搜到相关的文章