Python读取CSV中URL发起请求时出现编码报错的问题排查
问题根因与解决方案
你遇到的两类报错中,带\ufeff前缀导致的无匹配连接适配器问题,已经通过将CSV读取编码改为utf-8-sig解决,这是UTF-8 BOM格式文件的标准问题,无需额外调整。
剩余未解决的utf-8编解码器无法解码字节:无效起始字节报错和CSV读取编码无关,是网页请求、解码环节的逻辑问题,具体原因和修复方式如下:
报错核心原因
1688、淘宝等国内站点不会统一使用UTF-8编码,部分页面采用GBK、GB2312编码,硬编码用utf-8解码响应内容必然触发报错;另外默认配置的requests请求这类站点很容易触发反爬机制,返回的拦截响应本身是乱码、压缩二进制内容,也会导致解码失败。
分步修复方案
- 第一步:补全基础请求头,避免被反爬拦截
裸requests默认的请求特征会被站点直接识别为爬虫,返回非正常页面内容。请求时必须带上模拟浏览器的User-Agent,建议同时加超时配置避免程序卡死:import requests import lxml.html as html # 提前定义全局请求头和存储结果的列表 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } img_links = [] def scraper(): for i in range(len(rows)): try: # 带上请求头,设置10秒超时 article = requests.get(rows[i][0], headers=headers, timeout=10) if article.status_code == 200: # 删除原硬编码utf-8解码逻辑,替换为自动探测编码 article.encoding = article.apparent_encoding parsed = html.fromstring(article.text) img_url = parsed.xpath(URL_1) # 修正原写反的列表追加逻辑,用extend合并避免列表嵌套 img_links.extend(img_url) else: raise ValueError(f"Error: {article.status_code!r}") except ValueError as ve: print(ve) except Exception as e: # 增加通用异常捕获,打印出错URL方便定位 print(f"处理URL {rows[i][0]} 出错: {str(e)}") - 第二步:编码自动识别逻辑说明
不要手动指定解码格式,requests自带的apparent_encoding属性是基于响应二进制内容,通过字符集检测算法计算出的页面真实编码,对GBK/GB2312/UTF-8的识别准确率远高于从响应头读取的编码值,可覆盖国内绝大多数主流站点的编码场景。 - 第三步:残留问题定位方法
如果改完后仍有个别URL报错,直接打印对应URL的响应内容前200个字节:
如果返回内容包含“验证码”“访问过于频繁”“滑块验证”类字样,说明触发了站点反爬,需要补充cookie、降低请求频率、增加代理才能正常获取内容,和编码逻辑无关。print(article.content[:200])
额外注意
原代码中img_url.append(img_links)逻辑写反,xpath返回的是当前页匹配到的图片链接列表,正确逻辑是把当前页的结果追加到全局存储的img_links列表中,需用extend而非append,否则会出现列表嵌套问题。
内容的提问来源于stack exchange,提问作者Rothman Mariño
相关产品推荐
相关产品推荐

