首页
学习
活动
专区
圈层
工具
发布

在Python代码中获取的HTML与显示的网页不同

在 Python 中获取的 HTML 与浏览器中显示的网页不同,通常是因为网页使用了 ​​动态加载技术​​(如 JavaScript 渲染、AJAX 请求、懒加载等)。浏览器会执行 JavaScript 动态生成内容,而 Python 的 requestsurllib 只能获取初始 HTML(静态内容),无法执行 JavaScript。


​常见原因及解决方案​

​1. 网页使用 JavaScript 动态加载内容​

​现象​

  • requests 获取的 HTML 缺少部分内容(如商品价格、评论、动态表格等)。
  • 浏览器中能看到完整内容,但 Python 获取的 HTML 不完整。

​解决方案​

​(1) 使用 Selenium 模拟浏览器​

Selenium 可以执行 JavaScript,获取动态加载后的 HTML:

代码语言:javascript
复制
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()

​优点​​:能获取完整动态内容。 ​​缺点​​:速度较慢,依赖浏览器驱动。

​(2) 使用 Playwright(推荐)​

Playwright 是比 Selenium 更现代的自动化工具,支持多种浏览器(Chromium、Firefox、WebKit):

代码语言:javascript
复制
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 和浏览器。

​(3) 分析 AJAX 请求​

如果动态内容是通过 AJAX 加载的,可以直接用 requests 获取 API 数据:

  1. 打开浏览器开发者工具(F12 → Network)。
  2. 过滤 XHRFetch 请求,找到数据接口。
  3. 用 Python 直接请求该 API:import requests url = "https://example.com/api/data" response = requests.get(url) data = response.json() # 如果是 JSON 数据 print(data)

​优点​​:比 Selenium/Playwright 更快。 ​​缺点​​:需要手动分析 API,可能受反爬限制。


​2. 网页使用了反爬机制​

​现象​

  • 直接 requests.get() 返回的 HTML 可能是登录页或错误页。
  • 可能返回空内容或验证码。

​解决方案​

​(1) 设置请求头(User-Agent)​
代码语言:javascript
复制
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)
​(2) 使用 Session 维持 Cookies​
代码语言:javascript
复制
session = requests.Session()
session.get("https://example.com/login")  # 先访问登录页
response = session.get("https://example.com/protected-page")
print(response.text)
​(3) 使用代理 IP​
代码语言:javascript
复制
proxies = {
    "http": "http://your_proxy_ip:port",
    "https": "https://your_proxy_ip:port"
}
response = requests.get("https://example.com", proxies=proxies)
​(4) 处理验证码​
  • 手动输入(适用于少量请求)。
  • 使用 OCR 工具(如 pytesseract)或打码平台(适用于大量请求)。

​3. 网页使用了懒加载(Lazy Load)​

​现象​

  • 滚动页面时才会加载更多内容(如无限滚动列表)。
  • requests 获取的 HTML 可能缺少部分数据。

​解决方案​

  • ​Selenium/Playwright​​:模拟滚动加载:# Selenium 示例 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2) # 等待加载 html = driver.page_source
  • ​分析 API​​:检查滚动时是否触发新的 AJAX 请求。

​4. 网页使用了前端框架(React/Vue/Angular)​

​现象​

  • 初始 HTML 很简单,实际内容由 JavaScript 渲染。

​解决方案​

  • ​Selenium/Playwright​​(推荐)。
  • ​分析 API​​(如果数据通过接口加载)。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券