如何使用snscrape实现每个用户仅抓取一条Twitter推文?
实现每个用户仅抓取一条Twitter推文的解决方案
你的原始代码会抓取到同一用户的多条推文,要实现每个用户仅保留一条,核心思路是通过记录已抓取的用户ID来做去重——因为用户ID是唯一标识,不会重复。
原始代码
loc ='40.4165, -3.70256, 10km' query = 'geocode:"{}" since:2020-03-15 until:2020-05-01'.format(loc) tweets_list = [] for tweet in sntwitter.TwitterSearchScraper(query).get_items(): if i==100: break tweets_list.append([tweet.date, tweet.user.username, tweet.user.id, tweet.coordinates, tweet.rawContent])
修改后的代码
import snscrape.modules.twitter as sntwitter loc = '40.4165, -3.70256, 10km' query = 'geocode:"{}" since:2020-03-15 until:2020-05-01'.format(loc) tweets_list = [] seen_user_ids = set() # 用集合存储已抓取的用户ID,保证唯一性 i = 0 # 初始化计数变量 for tweet in sntwitter.TwitterSearchScraper(query).get_items(): if i == 100: break # 仅处理未抓取过的用户的推文 if tweet.user.id not in seen_user_ids: seen_user_ids.add(tweet.user.id) tweets_list.append([tweet.date, tweet.user.username, tweet.user.id, tweet.coordinates, tweet.rawContent]) i += 1 # 只有添加新用户的推文时才递增计数
关键说明
- 使用
seen_user_ids集合来跟踪已抓取的用户ID,集合的成员查询操作效率极高(O(1)),不会拖慢遍历速度 - 只有当用户ID不在集合中时,才将对应推文加入结果列表,同时把ID存入集合做标记
- 计数变量
i仅在成功添加新用户推文时递增,确保最终能收集到最多100个不同用户的推文(如果符合条件的用户数量足够)
内容的提问来源于stack exchange,提问作者AlejandroDGR
相关产品推荐
相关产品推荐

