如何防止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
相关产品推荐
相关产品推荐

