使用Python Twitter包采集Twitter坐标数据时返回coordinates: None的问题
解决Twitter流采集地理数据返回coordinates: None的问题
我来帮你梳理下这个问题,主要涉及Twitter Stream API的参数使用和推文地理信息的获取条件:
1. 你用的geo=True参数是无效的
Twitter Stream API的statuses.filter端点并不支持geo这个参数,这是你没拿到地理数据的核心原因之一。要过滤带地理信息的推文,你需要用以下两个有效参数之一:
locations:指定一个经纬度边界框,格式为min_longitude,min_latitude,max_longitude,max_latitude。只有推文中的精确坐标落在这个范围内的才会被返回。比如要获取全球范围的带地理信息的推文,可以设置locations="-180,-90,180,90"。- 地点关键词组合:可以在
track参数中结合关键词和地点过滤,比如track="candy place:US",这样会返回提及"candy"且关联美国地点的推文,但这种方式返回的是place字段(大致位置),不一定有精确的coordinates。
2. 即使参数正确,coordinates仍可能为None的原因
就算你用对了参数,也不是所有符合条件的推文都会有精确坐标,因为:
- 用户发推时必须主动开启并共享精确位置(很多用户会关闭位置服务,或者只选择共享大致的地点而非精确坐标)
- 用户的Twitter账号设置中允许共享位置信息
- 推文的位置信息如果是大致的地点(比如城市),只会填充
place字段,而coordinates字段会是None
3. 修正后的代码示例
先修复你代码里的语法错误(多了个多余的stream关键字),再加上正确的地理过滤参数:
from twitter import TwitterStream from email.utils import parsedate # 假设你已经正确初始化了auth认证对象 stream = TwitterStream(auth=auth, secure=True) search_term = "candy" # 使用locations参数指定全球范围,过滤带精确坐标的推文 tweet_stream = stream.statuses.filter(track=search_term, language='en', locations="-180,-90,180,90") collected_tweets = [] for tweet in tweet_stream: # 可以先判断精确坐标是否存在再收集 if tweet.get('coordinates') is not None: collected_tweets.append(tweet) # 也可以同时收集带大致地点的推文,即使没有精确坐标 # elif tweet.get('place') is not None: # collected_tweets.append(tweet)
额外提示
- 如果你需要更精准的地理范围,可以缩小
locations的边界框,比如美国本土的范围大概是-125,24,-66,49 - 可以同时监听
coordinates和place字段,前者是精确经纬度,后者是结构化的地点信息(比如城市、国家)
内容的提问来源于stack exchange,提问作者Homesand
相关产品推荐
相关产品推荐

