使用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,提问作者김건웅
相关产品推荐
相关产品推荐

