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

如何防止for循环每次运行时覆盖之前的输出,仅保留最后一次结果

问题根因

你代码中的>是Shell的覆盖写入重定向符,每次执行snscrape命令时都会清空user-tweets.json原有内容后写入本次抓取结果,嵌套循环执行到最后一次(最后一个用户、最后一个关键词)时,之前所有的抓取结果都会被覆盖,所以最终导出的csv只有最后一个用户的结果。

修复方案

方案1:修改重定向模式(快速修复)

把>改为追加模式的>>,每次抓取的结果会追加到json文件末尾,不会覆盖之前的内容。修改后的代码如下:

import os
import pandas as pd

tweet_count = 500
username = ["SenShelby", "Ttuberville", "SenDanSullivan"]
text_query = ["cybersecurity", "cyber security", "internet privacy", "online privacy", "computer security", "health privacy", "privacy", "security breach", "firewall", "data"]
since_date = "2016-01-01"
until_date = "2021-10-14"

# 运行前先删除旧的json文件,避免重复写入旧数据
if os.path.exists('user-tweets.json'):
    os.remove('user-tweets.json')

for person in username:
  for word in text_query:
      # 把>替换为>> 开启追加写入
      os.system("snscrape --jsonl --progress --max-results {} --since {} twitter-search '{} from:{} until:{}'>> user-tweets.json".format(tweet_count, since_date, word, person, until_date))

tweets_framework = pd.read_json('user-tweets.json', lines=True)
# 去重:避免同一条推文命中多个关键词被重复存储
tweets_framework = tweets_framework.drop_duplicates(subset='id')
tweets_framework.to_csv('user-tweets.csv', sep=',', index=False)

方案2:合并查询语句优化(更高效)

不需要嵌套循环关键词,可以直接把所有关键词用OR拼接成单次查询,每个用户仅请求一次,既减少请求次数,也避免重复爬取同一条命中多个关键词的推文:

import os
import pandas as pd

tweet_count = 500
username = ["SenShelby", "Ttuberville", "SenDanSullivan"]
# 拼接关键词为OR查询格式,带空格的关键词加双引号
text_query = ' OR '.join([f'"{word}"' if ' ' in word else word for word in ["cybersecurity", "cyber security", "internet privacy", "online privacy", "computer security", "health privacy", "privacy", "security breach", "firewall", "data"]])
since_date = "2016-01-01"
until_date = "2021-10-14"

if os.path.exists('user-tweets.json'):
    os.remove('user-tweets.json')

for person in username:
    os.system(f"snscrape --jsonl --progress --max-results {tweet_count} --since {since_date} twitter-search '{text_query} from:{person} until:{until_date}' >> user-tweets.json")

tweets_framework = pd.read_json('user-tweets.json', lines=True)
tweets_framework.to_csv('user-tweets.csv', sep=',', index=False)
注意事项
  • 若某一次请求无匹配结果,pd.read_json会报错,可以加异常捕获跳过空结果的读取逻辑
  • 可按用户名+日期命名存储json文件,避免单次请求失败丢失全部已爬取数据

内容的提问来源于stack exchange,提问作者briggs23stoner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:45:04