使用Tweepy调用Twitter v1流API跟踪@UN返回错误提及如何解决
问题原因
Twitter v1 流式API的track参数默认执行子串匹配规则,你传入@UN作为关键词时,只要推文文本中任意位置出现连续的@UN字符就会命中,因此包含@UN_Women这类前缀为@UN的提及内容也会被返回。
另外补充你现有代码的一个小问题:你已经实例化了myStreamListener = MyStreamListener(),传参时不需要再加括号重复实例化,否则会导致监听逻辑不生效。
解决方案
有两种可选方案,优先推荐第一种,性能损耗可忽略,实现简单:
方案1:利用推文实体字段做轻量过滤(效率远高于全文本后处理)
Twitter API已经自动把推文中所有提及的账号信息解析到status.entities['user_mentions']数组中,你只需要判断该数组中是否存在screen_name为UN的元素即可,不需要做全文本字符串匹配,性能几乎没有损失,是当前v1 API下最实用的方案。
修改后的代码如下:
class MyStreamListener(tweepy.StreamListener): def on_status(self, status): # 直接判断已解析好的提及列表,无需匹配全文 for mention in status.entities['user_mentions']: if mention['screen_name'] == 'UN': print(status.text) break myStreamListener = MyStreamListener() # 修正了重复实例化listener的错误 myStream = tweepy.Stream(auth = api.auth, listener=myStreamListener) myStream.filter(track=['@UN'])
方案2:使用follow参数在API层面精准匹配账号
如果你需要尽量减少API返回的冗余内容,可以先获取@UN的官方账号ID,用follow参数替代track参数:
- 首先获取@UN的用户ID:
un_account = api.get_user(screen_name='UN') un_user_id = un_account.id_str
- 修改流式过滤参数:
myStream.filter(follow=[un_user_id])
注意:follow参数会返回所有和该账号相关的推文,包括@UN自己发布的推文、其他用户回复@UN的推文、转发@UN的推文,如果你只需要提及@UN的内容,还是需要结合方案1的实体判断做简单过滤。
说明
Twitter v1 流式API本身没有提供原生的精准提及匹配能力,不存在完全不用任何后端判断就能只返回精准提及@UN的参数配置,方案1的轻量判断已经是当前场景下效率最高的实现方式,远好于全文本匹配的后处理。
内容的提问来源于stack exchange,提问作者Laila Sprejer
相关产品推荐
相关产品推荐

