You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用Python爬取部分网站无法获取与页面一致的HTML?

为何Python无法获取部分网站的完整HTML?

核心原因

  • 动态内容渲染:现代网站大量使用JavaScript动态加载、生成内容。requests库只能获取服务器返回的初始静态HTML,而浏览器会执行页面中的JS代码,动态渲染出最终的页面内容。你遇到的Naver词典页面就是这种情况,实际显示的内容是JS加载后生成的,requests拿到的只是页面骨架。
  • 请求头不规范:你的请求中User-Agent为空,网站服务器可能将其识别为非浏览器请求(爬虫),返回精简内容或直接限制访问。

解决办法

1. 抓取数据接口(推荐)

很多动态网站会通过API接口获取数据,直接请求接口能拿到结构化的JSON数据,比解析HTML更高效。先通过浏览器开发者工具的「网络」面板找到对应的数据接口,再修改代码请求:

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
# 示例接口(实际需通过抓包确认)
api_url = "https://dict.naver.com/linedict/zhendict/api/search?query=降&st=100&r_lt=000&q_enc=UTF-8&r_format=json&e_enc=UTF-8"
response = requests.get(api_url, headers=headers)

if response.status_code == 200:
    data = response.json()
    print(data)

2. 使用无头浏览器渲染页面

如果必须获取渲染后的完整HTML,可以用Selenium或Playwright这类工具模拟浏览器执行JS:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

# 配置无头浏览器
chrome_options = Options()
chrome_options.add_argument("--headless=new")
chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")

driver = webdriver.Chrome(options=chrome_options)
driver.get("https://dict.naver.com/linedict/zhendict/?q=%E9%99%8D&st=100&r_lt=000&q_enc=UTF-8&r_format=json&e_enc=UTF-8#/cnen/entry/f7d019715a9149fe909e56b52dd072ad")

# 获取渲染后的页面源码
soup = BeautifulSoup(driver.page_source, 'html.parser')
print(soup)

driver.quit()

总结

你当前用requests拿到的是未经过JS渲染的初始HTML,和浏览器显示的最终DOM结构自然不一致。补全合法的User-Agent能避免被服务器拦截,但解决动态内容问题的核心是要么直接抓取数据接口,要么用浏览器工具渲染页面。

内容的提问来源于stack exchange,提问作者Elabram Worst cell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:37:23