使用requests与openpyxl时数据被写入三次而非一次的问题
解决requests+openpyxl数据重复写入三次的问题
嘿,我之前也踩过类似的坑!你遇到的每个数据被写入三次的问题,大概率是代码里的重复执行逻辑或者数据结构处理不当导致的,我来帮你梳理下常见原因和修复方案:
常见问题原因及修复方法
1. 不小心遍历了多层重复的数据结构
很多接口返回的JSON会有嵌套数组(比如分组数据),如果没注意只取第一组,而是遍历了所有分组,就会导致数据重复写入。比如接口返回是这样的:
{ "result": [ {"items": [{"id":1, "name":"A"}, {"id":2, "name":"B"}]}, {"items": [{"id":1, "name":"A"}, {"id":2, "name":"B"}]}, {"items": [{"id":1, "name":"A"}, {"id":2, "name":"B"}]} ] }
如果写了这样的代码:
for group in data["result"]: for item in group["items"]: ws.append([item["id"], item["name"]])
自然会写入三次相同数据。修复方法:直接取第一组数据,跳过多余的遍历:
# 只取第一个分组的内容 first_group = data["result"][0] for item in first_group["items"]: ws.append([item["id"], item["name"]])
2. 写入逻辑被重复调用
检查代码是否把写入Excel的代码放在了循环里,或者不小心调用了三次ws.append()相关逻辑。比如:
# 错误示例:重复调用三次写入 row = ["1", "A"] ws.append(row) ws.append(row) ws.append(row)
这种低级错误也很容易犯,仔细检查代码里的写入语句次数,确保只执行一次。
3. 网页爬取时选中了多个表格
如果是爬取网页表格(用requests获取HTML后解析),可能页面里有三个结构相同的表格,你用了find_all()获取所有表格后全部写入了。修复方法:用find()只取第一个表格:
from bs4 import BeautifulSoup soup = BeautifulSoup(response.text, "html.parser") # 只取第一个表格,而不是所有表格 table = soup.find("table")
快速排查小技巧
- 先打印你要写入的数据,看看是不是本身就有三份重复内容,确认是数据来源问题还是代码逻辑问题;
- 在写入Excel的代码前加个计数器,比如
count = 0,每次写入count +=1,最后打印count,看是不是执行了三次; - 检查请求是否被发送了三次,比如打印
response.url或者看控制台的请求日志。
如果能把你的具体代码贴出来,我可以帮你更精准地定位问题哦!
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

