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

使用Python urllib.request.urlopen获取HTML时内容遭遗漏篡改的解决咨询

解决urllib获取HTML时图片src被篡改/遗漏的问题

我来帮你捋捋这个问题!你遇到的情况大概率是网站的反爬机制或者请求头不完整导致的——很多网站会识别出urllib默认的爬虫请求,返回经过处理的精简版HTML,甚至篡改图片的src属性。下面给你几个针对性的解决办法:

1. 模拟真实浏览器的请求头

urllib默认的请求头(比如User-Agent是Python-urllib/3.x)很容易被网站识别为爬虫。你需要构造更贴近真实浏览器的请求头,尤其是User-Agent、Referer这些关键字段。

示例代码:

from urllib import request

target_url = "你的目标建筑图片网站URL"
# 模拟Chrome浏览器的请求头,你可以换成自己浏览器的UA
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    'Referer': target_url,  # 有些网站会检查请求来源页面
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6'
}

# 构造带请求头的Request对象
req = request.Request(target_url, headers=headers)
response = request.urlopen(req)
# 注意:要根据网站实际编码调整解码方式,这里先默认utf-8
html_content = response.read().decode('utf-8')

2. 处理动态渲染的内容

如果网站是用JavaScript动态加载图片(比如懒加载、JS生成src属性),那urllib直接请求只能拿到初始的静态HTML,看不到JS执行后的完整内容。这种情况下需要用浏览器自动化工具模拟页面加载:

比如用Selenium(需要先安装Selenium和对应浏览器的驱动):

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

# 配置无头模式,不弹出浏览器窗口
chrome_options = Options()
chrome_options.add_argument('--headless=new')
chrome_options.add_argument('--disable-gpu')

driver = webdriver.Chrome(options=chrome_options)
driver.get(target_url)
# 获取JS渲染完成后的完整HTML
full_html = driver.page_source

driver.quit()

3. 携带必要的Cookie

有些网站需要会话Cookie(比如登录状态、会话标识)才能返回完整内容。你可以先在浏览器中打开目标网站,复制浏览器的Cookie字符串,加到请求头里:

headers['Cookie'] = '这里粘贴你从浏览器开发者工具中复制的Cookie'

4. 确保解码编码正确

有时候内容“被篡改”只是因为解码时用错了编码格式。你可以从响应头中获取网站指定的编码:

charset = response.headers.get_content_charset() or 'utf-8'
html_content = response.read().decode(charset)

先从完善请求头开始尝试,这是最常见的解决方式。如果还是不行,再检查是否是动态渲染的问题~

内容的提问来源于stack exchange,提问作者김건웅

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:44:28