2017-09-04 1 views
9

Tweepy APIを使用してツイートをダウンロードしようとしていますが、出力にジオ座標を取得できません。つぶやきでジオ座標を削ることができません[Lat-Lon]

出力データに緯度と経度を含める方法を探しています。

何か助けていただければ幸いです。ありがとうございます。コードは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

座標は「なし」と考えられましたか? 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がNoneでない場合、それはリスナーによって返されるにGeoJSONオブジェクトです。 csvライターは、オブジェクトの処理方法がわからなければ、行の空白を書き込む可能性があります。

オブジェクトを緯度&経度に解析し、それぞれを別の列に保存してみることができます。または、オブジェクトを他の方法でキャストして、DataFrameがcsvに書き込めるようにします。おそらく、このような

何か:

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

ありがとうございました。しかし、あなたが提供したソリューションは、データのジオ座標だけが使用可能です。私は自分の問題を解決する答えを掲示しました。 –

+0

次の質問の助けもありがとうございます.. https://stackoverflow.com/questions/46252591/how-to-use-load-more-option-with-a-non-head-web-scraper-instagram –

2

座標フィールドは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の使用制限がありません - あなたはグーグル、ビング、geonamesなどを照会することができます。ドキュメントを見てみましょう:http://geocoder.readthedocs.io/

+0

答えと提案をありがとうしかし、与えられたコード内のモデルの少しの追加が私のために働いた..私はそれを自分自身を投稿しました.. –

+0

以下の質問の助けもありがとう.. https:// stackoverflow。com/questions/46252591/head-web-scraper-instagram以外の方法での使用方法ロードオプション –

関連する問題