2017-09-04 83 views
9

我想下載推文使用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

+1

您是否認爲座標可能是'None'? https://dev.twitter.com/overview/api/tweets#obj-coordinates –

+0

@OluwafemiSule'None'不能在這裏解決..需要插入座標外部如果需要.. –

+1

是你的問題,我如何插入來自不同於Twitter的位置數據,當它未包含在推文中時? – Jonas

回答

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'] 
5

如果tweet.coordinates不是沒有,那麼它是由聽衆返回的GeoJSON的對象。如果csv作者不知道如何處理該對象,csv作家似乎有可能爲該行寫一個空白。

您可以嘗試將對象解析爲緯度&經度並將每一個保存在不同的列中。或者將對象轉換爲其他方式來表示它,以便您的DataFrame可以將其寫入csv。

這樣的事情也許是:

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

感謝您的回答,但您提供的解決方案僅適用於具有地理座標的數據。我發佈了一個解決了我的問題的答案。 –

+0

在以下問題中的任何幫助也不勝感激.. https://stackoverflow.com/questions/46252591/how-to-use-load-more-option-with--non-head-web-scraper-instagram –

2

座標字段可以爲空,這取決於在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的限制使用 - 你可以查詢谷歌,必應,GEONAMES多。看看文檔:http://geocoder.readthedocs.io/

+0

謝謝你的答案和建議但在給定的代碼中添加了一些模型爲我工作..我已經發布了它自己的答案。 –

+0

任何幫助在下面的問題也不勝感激.. https:// stackoverflow。COM /問題/ 46252591 /如何使用的負載,更多的選項上帶有一個-非頭網絡刮刀的Instagram –