无法使用推文刮取地理坐标[Lat-Lon]

时间:2017-09-04 21:54:58

标签: python csv twitter geolocation latitude-longitude

我正在尝试使用Tweepy API下载推文但我无法在输出中获取地理坐标。

我正在寻找在输出数据中包含纬度和经度的方法。

任何帮助表示赞赏..提前致谢。代码在python 3.x中开发,输出打印屏幕附在代码下方。

我已经看到一些用户没有共享位置详细信息,但我能够从该地理位置抓取数据,所以即使我能够通过程序在输出中包含lat-lon,它也会太棒了

代码

import tweepy
from tweepy import Stream
from tweepy import OAuthHandler
from tweepy.streaming import StreamListener
import pandas as pd
import json
import csv
import sys
import time

#reload(sys)
#sys.setdefaultencoding('utf8')

ckey = 'XXXXX'
csecret = 'XXXXXXX'
atoken = 'XXXXXX'
asecret = 'XXXXXX'

def toDataFrame(tweets):
    # COnvert to data frame
    DataSet = pd.DataFrame()

    DataSet['tweetID'] = [tweet.id for tweet in tweets]
    DataSet['tweetText'] = [tweet.text.encode('utf-8') for tweet in tweets]
    DataSet['tweetRetweetCt'] = [tweet.retweet_count for tweet in tweets]
    DataSet['tweetFavoriteCt'] = [tweet.favorite_count for tweet in tweets]
    DataSet['tweetSource'] = [tweet.source for tweet in tweets]
    DataSet['tweetCreated'] = [tweet.created_at for tweet in tweets]
    DataSet['userID'] = [tweet.user.id for tweet in tweets]
    DataSet['userScreen'] = [tweet.user.screen_name for tweet in tweets]
    DataSet['userName'] = [tweet.user.name for tweet in tweets]
    DataSet['userCreateDt'] = [tweet.user.created_at for tweet in tweets]
    DataSet['userDesc'] = [tweet.user.description for tweet in tweets]
    DataSet['userFollowerCt'] = [tweet.user.followers_count for tweet in tweets]
    DataSet['userFriendsCt'] = [tweet.user.friends_count for tweet in tweets]
    DataSet['userLocation'] = [tweet.user.location for tweet in tweets]
    DataSet['userTimezone'] = [tweet.user.time_zone for tweet in tweets]
    DataSet['Coordinates'] = [tweet.coordinates for tweet in tweets]
    DataSet['GeoEnabled'] = [tweet.user.geo_enabled for tweet in tweets]
    DataSet['Language'] = [tweet.user.lang for tweet in tweets]
    tweets_place= []
    #users_retweeted = []
    for tweet in tweets:
        if tweet.place:
            tweets_place.append(tweet.place.full_name)
        else:
            tweets_place.append('null')
    DataSet['TweetPlace'] = [i for i in tweets_place]
    #DataSet['UserWhoRetweeted'] = [i for i in users_retweeted]

    return DataSet

OAUTH_KEYS = {'consumer_key':ckey, 'consumer_secret':csecret,'access_token_key':atoken, 'access_token_secret':asecret}
#auth = tweepy.OAuthHandler(OAUTH_KEYS['consumer_key'], OAUTH_KEYS['consumer_secret'])
auth = tweepy.AppAuthHandler('XXXXXXXX', 'XXXXX')

api = tweepy.API(auth, wait_on_rate_limit=True,wait_on_rate_limit_notify=True)
if (not api):
    print ("Can't Authenticate")
    sys.exit(-1)
else:
    print ("Scraping data now") # Enter lat and long and radius in Kms  q='ganesh'
    cursor = tweepy.Cursor(api.search,geocode="23.50000,91.16000,50km",since='2017-09-01',until='2017-09-05',lang='en',count=10000)
    results=[]
    for item in cursor.items(1000): # Remove the limit to 1000
            results.append(item)


    DataSet = toDataFrame(results)
    DataSet.to_csv('Agartala_sep_1_4.csv',index=False)
    print ("Completed.. !!")

输出:

enter image description here

3 个答案:

答案 0 :(得分:5)

如果你的tweet.coordinates不是None,那么它就是监听器返回的geoJSON对象。如果csv编写器不知道如何处理该对象,那么它似乎可能只为该行写入空白。

您可以尝试将对象解析为纬度和范围。经度并将每个保存在不同的列中。或者以其他方式转换对象以表示它,以便您的DataFrame可以将其写入csv。

或许这样的事情:

longitude, latitude = tweet.coordinates["coordinates"]["coordinates"]

答案 1 :(得分:2)

coordinates字段可以为null,它取决于用户在twitter上给出的权限。您可以查询输入名称位置的服务,并在输出中为您提供该位置的坐标。通常我使用地理编码器:

import geocoder

for tweet in tweets:
    if tweet.coordinates is None:
        result = geocoder.arcgis(tweet.place)
        tweet.place = (result.x, result.y)

如果您不喜欢arcgis服务 - 没有api使用限制 - 您可以查询google,bing,geonames等。查看文档:{​​{3}}

答案 2 :(得分:1)

在给定的代码中,这个额外的块对我有用。

for i in range(0,len(df)):
        x="%s,%s,50km"%(df['latitude'][i],df['longitude'][i])
        cursor = tweepy.Cursor(api.search,geocode=x,since='2017-09-14',until='2017-09-15',lang='en',count=1000)
        results=[]
        print (i)
        for item in cursor.items(1000): # Remove the limit to 1000
            results.append(item)
        DataSet = toDataFrame(results)
        DataSet['latitude']=df['latitude'][i]
        DataSet['longitude']=df['longitude'][i]
        DataSet['radius']=100
        del DataSet['Coordinates']
相关问题