Python编写嵌套循环爬取多用户推文时如何避免数据覆盖
我遇到了难以解决的问题
大家好:
我正在尝试获取多个用户的近期推文,为此编写了嵌套循环,但目前遇到了变量berlintweet被覆盖的问题。循环本身可以正常运行,但我需要实现数据追加存储,而非每次循环都覆盖原有数据。
我是纯编程新手,好不容易把代码写到当前进度,现在却卡在这个问题上,完全不知道该如何调整修改,任何帮助或建议我都不胜感激。
提前感谢大家的帮助!
原代码如下:
import tweepy import config import pandas as pd client = tweepy.Client(bearer_token=config.BEARER_TOKEN) Liste_Namen = pd.read_csv('Namen.csv', delimiter=',') tweet_id_list = [""] tweet_text_list = [""] tweet_created_list = [""] berlintweet = [""] for user_name in Liste_Namen['ids']: berlintweet = tweepy.Paginator(client.get_users_tweets, id=user_name, exclude= ["replies", "retweets"], tweet_fields=["created_at"], max_results=100).flatten(limit=200) for tweet in berlintweet: tweet_id_list.append(tweet.id) tweet_text_list.append(tweet) tweet_created_list.append(tweet.created_at) df = pd.DataFrame({ 'name': config.USER_ID, 'tweet_id': tweet_id_list, 'tweet_text': tweet_text_list, 'tweet_created': tweet_created_list, }) df.to_csv('BerlinTest2.csv', sep=',', index=False, encoding='utf-8-sig')
解答
首先纠正一个误解:berlintweet被覆盖根本不是问题。这个变量是循环内的临时变量,只用来暂存当前用户的分页推文结果,内层循环已经把当前批次的推文数据追加到全局列表后,外层循环给它赋下一个用户的推文结果是完全正常的逻辑,不会弄丢之前已经存入列表的数据。
你的代码实际有3个会导致结果错误/运行报错的问题:
- 初始化存储列表时提前放入了空字符串,导出的CSV第一行会是无效脏数据
- 构造DataFrame时
name字段直接传入固定值config.USER_ID,和其他列的长度不匹配会直接报错,也无法对应每条推文所属的用户 - 存储推文内容时直接传入了tweet对象,没有取
.text属性,导出的CSV里不会显示实际推文内容,只会显示对象的内存标识
修正后的可运行代码如下:
import tweepy import config import pandas as pd client = tweepy.Client(bearer_token=config.BEARER_TOKEN) Liste_Namen = pd.read_csv('Namen.csv', delimiter=',') # 初始化为空列表,不提前存入无效值 tweet_id_list = [] tweet_text_list = [] tweet_created_list = [] user_name_list = [] for user_name in Liste_Namen['ids']: berlintweet = tweepy.Paginator( client.get_users_tweets, id=user_name, exclude=["replies", "retweets"], tweet_fields=["created_at"], max_results=100 ).flatten(limit=200) for tweet in berlintweet: # 同步追加当前推文所属的用户名 user_name_list.append(user_name) tweet_id_list.append(tweet.id) # 取tweet.text获取实际推文内容 tweet_text_list.append(tweet.text) tweet_created_list.append(tweet.created_at) df = pd.DataFrame({ 'name': user_name_list, 'tweet_id': tweet_id_list, 'tweet_text': tweet_text_list, 'tweet_created': tweet_created_list, }) df.to_csv('BerlinTest2.csv', sep=',', index=False, encoding='utf-8-sig')
修改后所有用户的推文会按顺序追加到对应列表中,不会出现数据覆盖的问题,导出的CSV每一行都能对应到正确的用户和推文内容。
内容的提问来源于stack exchange,提问作者Max Mastermann
相关产品推荐
相关产品推荐

