2017-09-04 18 views
9

मैं ट्वीपी एपीआई का उपयोग करके ट्वीट डाउनलोड करने की कोशिश कर रहा हूं लेकिन मैं अपने आउटपुट में भू समन्वय प्राप्त करने में सक्षम नहीं हूं।ट्वीट्स के साथ भू समन्वय को स्क्रैप करने में सक्षम नहीं है [लेट-लॉन]

मैं आउटपुट डेटा में अक्षांश और देशांतर शामिल करने के लिए रास्ता तलाश रहा हूं।

किसी भी मदद की सराहना की जाती है .. अग्रिम धन्यवाद। कोड पायथन 3.x में विकसित किया गया है और आउटपुट प्रिंट स्क्रीन कोड के नीचे संलग्न है।

मैंने देखा है कि कुछ उपयोगकर्ता स्थान के विवरण साझा नहीं करते हैं, लेकिन फिर भी मैं उस भौगोलिक स्थान से डेटा को स्क्रैप करने में सक्षम हूं, भले ही मैं आउटपुट में प्रोग्राम के माध्यम से लैट-लॉन शामिल कर सकूं महान।

कोड

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

आउटपुट: अपने tweet.coordinates कोई भी नहीं है

enter image description here

+1

क्या आप मानते हैं कि निर्देशांक 'कोई नहीं' हो सकता है? https://dev.twitter.com/overview/api/tweets#obj-coordinates –

+0

@OluwafemiSule 'none' यहां समाधान नहीं हो सकता है .. आवश्यकता होने पर बाहरी रूप से निर्देशांक डालने की आवश्यकता है .. –

+1

क्या आपका प्रश्न है, मैं कैसे कर सकता हूं ट्विटर से किसी भिन्न स्रोत से स्थान डेटा डालें जब इसे किसी ट्वीट में शामिल नहीं किया जाता है? – 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

है, तो यह GeoJSON वस्तु श्रोता द्वारा दिया जा रहा है। ऐसा लगता है कि सीएसवी लेखक सिर्फ लाइन के लिए एक खाली लिखता है अगर यह नहीं जानता कि वस्तु के साथ क्या करना है।

आप ऑब्जेक्ट को अक्षांश & देशांतर में पार्स करने और प्रत्येक को एक अलग कॉलम में सहेजने का प्रयास कर सकते हैं। या ऑब्जेक्ट को इसका प्रतिनिधित्व करने के लिए किसी अन्य तरीके से कास्ट करें ताकि आपका डेटाफ्रेम इसे सीएसवी पर लिख सके।

कुछ इस तरह शायद:

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

निर्देशांक फ़ील्ड रिक्त हो सकता है, यह चहचहाना पर उपयोगकर्ता द्वारा दिए गए अनुमतियों पर निर्भर करता है। आप ऐसी सेवा से पूछ सकते हैं जो एक नाम स्थान इनपुट करता है, और आपको उस स्थान के निर्देशांक आउटपुट में देता है। आम तौर पर मैं जियोकोडर का उपयोग करें:

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 –

संबंधित मुद्दे