2016-06-26 13 views
7

मैं उपयोगकर्ता नामों के संबंध में ट्विटर से उपयोगकर्ता के अक्षांश और देशांतर को स्क्रैप करने का प्रयास कर रहा हूं। उपयोगकर्ता नाम सूची एक इनपुट फ़ाइल में 50 से अधिक नामों वाली एक सीएसवी फ़ाइल है। नीचे दो परीक्षण हैं जिन्हें मैंने दूर तक बनाया है। उनमें से कोई भी काम नहीं कर रहा है। कार्यक्रम में से किसी एक में सुधार या पूरी तरह से नए दृष्टिकोण का स्वागत है।ट्विटर से स्क्रैप उपयोगकर्ता स्थान

मेरे पास User_names की सूची है और मैं उपयोगकर्ता प्रोफ़ाइल देखने और geolocation प्रोफ़ाइल या समयरेखा से खींचने की कोशिश कर रहा हूं। मुझे इंटरनेट पर कहीं भी नमूने नहीं मिल सका।

मैं ट्विटर से उपयोगकर्ताओं के भौगोलिक स्थान प्राप्त करने के लिए एक बेहतर दृष्टिकोण की तलाश में हूं। मुझे एक ऐसा उदाहरण भी नहीं मिला जो उपयोगकर्ता_नाम या user_id के संदर्भ में उपयोगकर्ता स्थान को कटाई दिखाता है। क्या यह पहली जगह में भी संभव है?

इनपुट: इनपुट फ़ाइलें में 50k पंक्तियों

AfsarTamannaah,6.80E+17,12/24/2015,#chennaifloods 
DEEPU_S_GIRI,6.80E+17,12/24/2015,#chennaifloods 
DEEPU_S_GIRI,6.80E+17,12/24/2015,#weneverletyoudownstr 
ndtv,6.80E+17,12/24/2015,#chennaifloods 
1andonlyharsha,6.79E+17,12/21/2015,#chennaifloods 
Shashkya,6.79E+17,12/21/2015,#moneyonmobile 
Shashkya,6.79E+17,12/21/2015,#chennaifloods 
timesofindia,6.79E+17,12/20/2015,#chennaifloods 
ANI_news,6.78E+17,12/20/2015,#chennaifloods 
DrAnbumaniPMK,6.78E+17,12/19/2015,#chennaifloods 
timesofindia,6.78E+17,12/18/2015,#chennaifloods 
SRKCHENNAIFC,6.78E+17,12/18/2015,#dilwalefdfs 
SRKCHENNAIFC,6.78E+17,12/18/2015,#chennaifloods 
AmeriCares,6.77E+17,12/16/2015,#india 
AmeriCares,6.77E+17,12/16/2015,#chennaifloods 
ChennaiRainsH,6.77E+17,12/15/2015,#chennairainshelp 
ChennaiRainsH,6.77E+17,12/15/2015,#chennaifloods 
AkkiPritam,6.77E+17,12/15/2015,#chennaifloods 

कोड:

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

CONSUMER_KEY = 'XYZ' 
CONSUMER_SECRET = 'XYZ' 
ACCESS_KEY = 'XYZ' 
ACCESS_SECRET = 'XYZ' 

auth = OAuthHandler(CONSUMER_KEY,CONSUMER_SECRET) 
api = tweepy.API(auth) 
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET) 

data = pd.read_csv('user_keyword.csv') 

df = ['user_name', 'user_id', 'date', 'keyword'] 

test = api.lookup_users(user_ids=['user_name']) 

for user in test: 
    print user.user_name 
    print user.user_id 
    print user.date 
    print user.keyword 
    print user.geolocation 

त्रुटि:

Traceback (most recent call last): 
    File "user_profile_location.py", line 24, in <module> 
    test = api.lookup_users(user_ids=['user_name']) 
    File "/usr/lib/python2.7/dist-packages/tweepy/api.py", line 150, in lookup_users 
    return self._lookup_users(list_to_csv(user_ids), list_to_csv(screen_names)) 
    File "/usr/lib/python2.7/dist-packages/tweepy/binder.py", line 197, in _call 
    return method.execute() 
    File "/usr/lib/python2.7/dist-packages/tweepy/binder.py", line 173, in execute 
    raise TweepError(error_msg, resp) 
tweepy.error.TweepError: [{'message': 'No user matches for specified terms.', 'code': 17}] 

मैं हर उपयोगकर्ता को समझने जियोलोकेशन का हिस्सा नहीं है, लेकिन जो लोग भौगोलिक स्थान प्राप्त कर सकते हैं, वे प्रोफ़ाइल को सार्वजनिक रूप से खोलते रहेंगे।

उपयोगकर्ता के नाम और/या लैट लॉन के रूप में उपयोगकर्ता स्थान मैं देख रहा हूं।

यदि यह दृष्टिकोण सही नहीं है तो मैं विकल्पों के लिए भी खुला हूं।

अद्यतन एक: कुछ गहरी खोज के बाद मुझे यह website मिला जो बहुत करीबी समाधान प्रदान करता है, लेकिन मुझे इनपुट फ़ाइल से userName पढ़ने की कोशिश करते समय त्रुटि मिल रही है।

यह कहता है कि केवल 100 उपयोगकर्ता की जानकारी को पकड़ लिया जा सकता है कि उस सीमा को उठाने का बेहतर तरीका क्या है?

कोड:

import sys 
import string 
import simplejson 
from twython import Twython 
import csv 
import pandas as pd 

#WE WILL USE THE VARIABLES DAY, MONTH, AND YEAR FOR OUR OUTPUT FILE NAME 
import datetime 
now = datetime.datetime.now() 
day=int(now.day) 
month=int(now.month) 
year=int(now.year) 


#FOR OAUTH AUTHENTICATION -- NEEDED TO ACCESS THE TWITTER API 
t = Twython(app_key='ABC', 
    app_secret='ABC', 
    oauth_token='ABC', 
    oauth_token_secret='ABC') 

#INPUT HAS NO HEADER NO INDEX 
ids = pd.read_csv('user_keyword.csv', header=['userName', 'userID', 'Date', 'Keyword'], usecols=['userName']) 

#ACCESS THE LOOKUP_USER METHOD OF THE TWITTER API -- GRAB INFO ON UP TO 100 IDS WITH EACH API CALL 

users = t.lookup_user(user_id = ids) 

#NAME OUR OUTPUT FILE - %i WILL BE REPLACED BY CURRENT MONTH, DAY, AND YEAR 
outfn = "twitter_user_data_%i.%i.%i.csv" % (now.month, now.day, now.year) 

#NAMES FOR HEADER ROW IN OUTPUT FILE 
fields = "id, screen_name, name, created_at, url, followers_count, friends_count, statuses_count, \ 
    favourites_count, listed_count, \ 
    contributors_enabled, description, protected, location, lang, expanded_url".split() 

#INITIALIZE OUTPUT FILE AND WRITE HEADER ROW 
outfp = open(outfn, "w") 
outfp.write(string.join(fields, "\t") + "\n") # header 

#THE VARIABLE 'USERS' CONTAINS INFORMATION OF THE 32 TWITTER USER IDS LISTED ABOVE 
#THIS BLOCK WILL LOOP OVER EACH OF THESE IDS, CREATE VARIABLES, AND OUTPUT TO FILE 
for entry in users: 
    #CREATE EMPTY DICTIONARY 
    r = {} 
    for f in fields: 
     r[f] = "" 
    #ASSIGN VALUE OF 'ID' FIELD IN JSON TO 'ID' FIELD IN OUR DICTIONARY 
    r['id'] = entry['id'] 
    #SAME WITH 'SCREEN_NAME' HERE, AND FOR REST OF THE VARIABLES 
    r['screen_name'] = entry['screen_name'] 
    r['name'] = entry['name'] 
    r['created_at'] = entry['created_at'] 
    r['url'] = entry['url'] 
    r['followers_count'] = entry['followers_count'] 
    r['friends_count'] = entry['friends_count'] 
    r['statuses_count'] = entry['statuses_count'] 
    r['favourites_count'] = entry['favourites_count'] 
    r['listed_count'] = entry['listed_count'] 
    r['contributors_enabled'] = entry['contributors_enabled'] 
    r['description'] = entry['description'] 
    r['protected'] = entry['protected'] 
    r['location'] = entry['location'] 
    r['lang'] = entry['lang'] 
    #NOT EVERY ID WILL HAVE A 'URL' KEY, SO CHECK FOR ITS EXISTENCE WITH IF CLAUSE 
    if 'url' in entry['entities']: 
     r['expanded_url'] = entry['entities']['url']['urls'][0]['expanded_url'] 
    else: 
     r['expanded_url'] = '' 
    print r 
    #CREATE EMPTY LIST 
    lst = [] 
    #ADD DATA FOR EACH VARIABLE 
    for f in fields: 
     lst.append(unicode(r[f]).replace("\/", "/")) 
    #WRITE ROW WITH DATA IN LIST 
    outfp.write(string.join(lst, "\t").encode("utf-8") + "\n") 

outfp.close()  

त्रुटि:

File "user_profile_location.py", line 35, in <module> 
    ids = pd.read_csv('user_keyword.csv', header=['userName', 'userID', 'Date', 'Keyword'], usecols=['userName']) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 562, in parser_f 
    return _read(filepath_or_buffer, kwds) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 315, in _read 
    parser = TextFileReader(filepath_or_buffer, **kwds) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 645, in __init__ 
    self._make_engine(self.engine) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 799, in _make_engine 
    self._engine = CParserWrapper(self.f, **self.options) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 1202, in __init__ 
    ParserBase.__init__(self, kwds) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 918, in __init__ 
    raise ValueError("cannot specify usecols when " 
ValueError: cannot specify usecols when specifying a multi-index header 
+1

आप क्या पूछ रहे हैं? क्या आप 'ट्वीपी' से प्राप्त त्रुटि को नहीं समझते हैं? क्या आपको नहीं पता कि [त्रुटियों को कैसे संभालें] (https://docs.python.org/2/tutorial/errors.html#handling-exceptions)? – jonrsharpe

+1

कृपया अपना कोड पढ़ें, आप 'user_ids = ['user_name'] 'के लिए पूछ रहे हैं, जो संभवतः विफल रहता है क्योंकि' user_name' नामक कोई ट्विटर उपयोगकर्ता नहीं है। – oystein

+0

@oystein गंभीरता से उपयोगकर्ता नाम के साथ स्थान प्राप्त करने के लिए कोड के साथ कुछ मदद की सराहना करेगा। –

उत्तर

5

यह मानते हुए कि तुम सिर्फ उपयोगकर्ता है कि उसकी/उसके प्रोफाइल पेज में प्रस्तुत है के स्थान प्राप्त करना चाहते हैं, तो आप सिर्फ उपयोग कर सकते हैं Tweepy से API.get_user। नीचे काम कोड है।

#!/usr/bin/env python 
from __future__ import print_function 

#Import the necessary methods from tweepy library 
import tweepy 
from tweepy import OAuthHandler 


#user credentials to access Twitter API 
access_token = "your access token here" 
access_token_secret = "your access token secret key here" 
consumer_key = "your consumer key here" 
consumer_secret = "your consumer secret key here" 


def get_user_details(username): 
     userobj = api.get_user(username) 
     return userobj 


if __name__ == '__main__': 
    #authenticating the app (https://apps.twitter.com/) 
    auth = tweepy.auth.OAuthHandler(consumer_key, consumer_secret) 
    auth.set_access_token(access_token, access_token_secret) 
    api = tweepy.API(auth) 

    #for list of usernames, put them in iterable and call the function 
    username = 'thinkgeek' 
    userOBJ = get_user_details(username) 
    print(userOBJ.location) 

नोट: यह एक कच्चे कार्यान्वयन है। ट्विटर एपीआई एक्सेस सीमाओं का पालन करने के लिए एक उचित स्लीपर फ़ंक्शन लिखें।

+0

सभी इनपुट कॉलम के साथ बिल्कुल वही आउटपुट .. मुझे पूर्ण डेटा के साथ जांचने दें। उपयोगकर्ता इनपुट की सूची एक इनपुट में 50k से अधिक है। मुझे उम्मीद है कि यह इसके लिए काम करता है। जैसे ही मैं जांचता हूं, उत्तर दूंगा .. –

+0

प्रश्न में लिखे गए उपर्युक्त दो कार्यक्रमों में समस्या उन उपयोगकर्ताओं को पढ़ने के बारे में है जिनमें लगभग 50 के उपयोगकर्ता नाम हैं। क्या मैं आपको उस भाग के साथ मेरी मदद करने के लिए अनुरोध कर सकता हूं। –

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