2017-09-04 66 views
9

Tweepy API kullanarak tweet indirmeye çalışıyorum Ama çıkışımda geo koordinatları alamıyorum.Tweets ile geo koordinatını kazıyın [Lat-Lon]

Çıktı verisinde enlem ve boylamı dahil etmenin yolunu arıyorum.

Herhangi bir yardım için teşekkür ederiz .. Teşekkürler şimdiden. Kod, python 3.x'te geliştirilmiştir ve çıktı yazdırma ekranı, kodun altına eklenmiştir.

Bazı Kullanıcıların konum ayrıntılarını paylaşmadığını gördüm, ancak veriyi bu coğrafi konumdan kazıyorum, böylece çıktıda program aracılığıyla lat-lon ekleyebilseydim bile harika.

Kod

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.. !!") 

Çıktı: En tweet.coordinates Yok değil

enter image description here

+1

Bu koordinatların "Yok" olabileceğini düşündünüz mü? https://dev.twitter.com/overview/api/tweets#obj-coordinates –

+0

@OluwafemiSule 'Hiçbiri' burada çözüm olamaz .. Gerekirse harici olarak koordinat eklemek gerekiyor .. –

+1

Sorunuz mu var? Bir tweet'e dahil olmadığında, konum verilerini Twitter'dan farklı bir kaynaktan mı ekleyin? – Jonas

cevap

1

Verilen kod içinde bu ek blok benim için çalıştı.

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

, o zaman dinleyici tarafından iade edilen GeoJSON nesnesidir. Csv yazıcısı, nesne ile ne yapacağını bilmiyorsa, satır için bir boşluk yazması mümkün görünüyor. Nesneyi enlem & boylamında ayrıştırıp her birini farklı bir sütuna kaydedebilirsiniz. Veya nesneyi temsil etmek için başka bir şekilde yayınlayın, böylece DataFrame'inizi csv'ye yazabilirsiniz. belki böyle

şey:

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

Cevabınız için teşekkür ederiz, Ama sağladığınız çözüm sadece verilerin coğrafi koordinatları vardır. Sorunumu çözen bir cevap gönderdim. –

+0

Aşağıdaki sorudan yardım alabilirsiniz: https://stackoverflow.com/questions/46252591/how-to-use-load-more-option-with-a-non-head-web-scraper-instagram –

2

koordinatlar alan boş olabilir, bu heyecan kullanıcı tarafından verilen izinlerine bağlıdır. Girdiyi bir giriş yeri olarak alan bir servis sorgulayabilir ve o yerin koordinatlarını size verebilirsiniz. Hiçbir API kullanım kısıtlaması var - - google, bing geonames ve daha sorgulamak olabilir Eğer arcgis hizmeti beğenmediğiniz

import geocoder 

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

: Genellikle i geocoder kullanın. Belgelere bir göz atıyor: http://geocoder.readthedocs.io/

+0

Cevap ve öneri için teşekkür ederiz. Ama verilen kod içinde benim için modelin biraz eklenmesi .. Ben kendime bir cevap gönderdim .. –

+0

Aşağıdaki soruya herhangi bir yardım da takdir edilecektir .. https: // stackoverflow.com/sorular/46252591/nasıl kullanımlı-yük daha-seçenek-ile-a-olmayan kafa web kazıyıcı-instagram –

İlgili konular