2016-06-26 6 views
7

Я пытаюсь очистить широту и долготу пользователя от Twitter в отношении имен пользователей. Список имен пользователей - это файл csv с более чем 50 именами в одном входном файле. Ниже приведены два испытания, которые я сделал на сегодняшний день. Ни один из них, похоже, не работает. Поправки в любой из программ или совершенно новый подход приветствуются.Scrape User Location from Twitter

У меня есть список User_names, и я пытаюсь найти профиль пользователя и вытащить geolocation из профиля или временной шкалы. Я не мог найти много образцов в Интернете.

Я ищу лучший подход для получения геолокации пользователей из Twitter. Я даже не смог найти ни одного примера, который показывает сбор данных о местоположении пользователя со ссылкой на User_name или 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}] 

Я понимаю, что каждый пользователь не разделяет геолокации, но те, кто открыто публикуют профиль, если я смогу получить геолокацию, будут большими.

Расположение пользователей как имя и/или lat lon - это то, что я ищу.

Если этот подход неверен, я также открыт для альтернатив.

Обновление: после некоторого углубленного поиска я нашел это 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

Что вы спрашиваете? Вы не понимаете ошибку, которую вы получаете от «Tweepy»? Вы не знаете, как [обрабатывать ошибки] (https://docs.python.org/2/tutorial/errors.html#handling-exceptions)? – jonrsharpe

+1

Пожалуйста, прочтите ваш код, вы запрашиваете 'user_ids = ['user_name']', что, скорее всего, не удастся, так как пользователь Twitter не имеет имени 'user_name'. – oystein

+0

@ yystein серьезно оценил бы некоторую помощь с кодом, чтобы получить места с именем пользователя. –

ответ

5

Предполагая, что вы просто хотите, чтобы получить местоположение пользователя, который кладется в его своей странице/профиля, вы можете просто использовать API.get_user от Tweepy. Ниже приведен рабочий код.

#!/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) 

Примечание: Это грубые реализации. Напишите правильную функцию спящего режима, чтобы подчиняться ограничениям доступа к API Twitter.

+0

Точно такой же вывод вместе со всеми входными столбцами. Позвольте мне проверить с полными данными. Список имен пользователей составляет более 50 тыс. На одном входе. Надеюсь, это сработает. Ответит, как только я проверю .. –

+0

Проблема с вышеупомянутыми двумя программами, о которых я писал, - это чтение пользователей из файла, который содержит около 50K имен пользователей. Позвольте мне просить вас помочь мне в этой части. –