使用requests.get()请求URL时出现内容解码错误的问题排查
解决requests.get()的gzip解码错误(网页字数统计程序)
问题描述
我正在开发一个从.csv文件读取URL并统计网页字数的程序。URL来自pandas DataFrame中"Article"列的各行,将其传入requests.get(url)时触发了解码错误。
相关代码
读取CSV并调用统计函数的代码
def file_input(file): # 读取用户传入的.csv文件 df = pd.read_csv(file, sep='[;,]', engine='python') for i in range(len(df)): df.at[i, "Word Count"] = word_counter(df.at[i, "Article"])
字数统计函数
def word_counter(url): # 统计网页字数 count = 0 # 通过URL获取网页内容 page = requests.get(url)
报错信息(翻译后)
回溯(最近的调用最后): 文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/urllib3/response.py", 第406行, 在 _decode中 data = self._decoder.decompress(data) 文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/urllib3/response.py", 第93行, 在 decompress中 ret += self._obj.decompress(data) zlib.error: 解压缩数据时出错 -3: 不正确的头部校验 在处理上述异常期间,发生了另一个异常: 回溯(最近的调用最后): 文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/requests/models.py", 第816行, 在 generate中 yield from self.raw.stream(chunk_size, decode_content=True) 文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/urllib3/response.py", 第627行, 在 stream中 data = self.read(amt=amt, decode_content=decode_content) 文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/urllib3/response.py", 第599行, 在 read中 data = self._decode(data, decode_content, flush_decoder) 文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/urllib3/response.py", 第409行, 在 _decode中 raise DecodeError( urllib3.exceptions.DecodeError: ('收到带有content-encoding: gzip的响应,但解码失败。', error('解压缩数据时出错 -3: 不正确的头部校验')) 在处理上述异常期间,发生了另一个异常: 回溯(最近的调用最后): 文件 "main.py", 第59行, 在 <module>中 main() 文件 "main.py", 第44行, 在 main中 file_input(file) 文件 "main.py", 第35行, 在 file_input中 df.at[i, "Word Count"] = word_counter(df.at[i, "Article"]) 文件 "main.py", 第13行, 在 word_counter中 page = requests.get(anything) 文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/requests/api.py", 第73行, 在 get中 return request("get", url, params=params, **kwargs) 文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/requests/api.py", 第59行, 在 request中 return session.request(method=method, url=url, **kwargs) 文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/requests/sessions.py", 第587行, 在 request中 resp = self.send(prep, **send_kwargs) 文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/requests/sessions.py", 第745行, 在 send中 r.content 文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/requests/models.py", 第899行, 在 content中 self._content = b"".join(self.iter_content(CONTENT_CHUNK_SIZE)) or b"" 文件 "/home/runner/Article-Word-counter/venv/lib/python3.8/site-packages/requests/models.py", 第820行, 在 generate中 raise ContentDecodingError(e) requests.exceptions.ContentDecodingError: ('收到带有content-encoding: gzip的响应,但解码失败。', error('解压缩数据时出错 -3: 不正确的头部校验'))
解决方案
1. 禁用gzip自动解码
服务器返回的gzip内容可能存在格式问题,或者请求头的编码协商导致冲突。直接在请求中指定不接受gzip编码:
def word_counter(url): count = 0 # 设置请求头,禁用gzip压缩 headers = {"Accept-Encoding": "identity"} page = requests.get(url, headers=headers) # 解析网页文本并统计字数(示例使用BeautifulSoup提取纯文本) from bs4 import BeautifulSoup soup = BeautifulSoup(page.text, "html.parser") raw_text = soup.get_text(strip=True) # 按空格分割统计字数,可根据需求调整规则 count = len(raw_text.split()) return count
2. 校验URL有效性
确保DataFrame中的URL格式正确,避免传入无效地址导致异常:
import validators def file_input(file): df = pd.read_csv(file, sep='[;,]', engine='python') for i in range(len(df)): url = df.at[i, "Article"] # 校验URL格式 if validators.url(url): df.at[i, "Word Count"] = word_counter(url) else: df.at[i, "Word Count"] = "无效URL"
3. 更新依赖库版本
旧版本的requests或urllib3可能存在解码bug,执行以下命令更新:
pip install --upgrade requests urllib3
内容的提问来源于stack exchange,提问作者Developer35
相关产品推荐
相关产品推荐

