2016-06-26 16 views
7

Tôi đang cố gắng để đánh lừa vĩ độ và kinh độ của người dùng từ Twitter đối với tên người dùng. Danh sách tên người dùng là một tệp csv với hơn 50 tên trong một tệp đầu vào. Dưới đây là hai thử nghiệm mà tôi đã thực hiện cho đến nay. Không ai trong số họ có vẻ đang làm việc. Sửa chữa trong bất kỳ một trong những chương trình hoặc một cách tiếp cận hoàn toàn mới được chào đón.Cạo vị trí của người dùng từ Twitter

Tôi có danh sách User_names và tôi đang cố gắng tra cứu hồ sơ người dùng và kéo geolocation từ tiểu sử hoặc dòng thời gian. Tôi không thể tìm thấy nhiều mẫu ở bất cứ đâu trên Internet.

Tôi đang tìm cách tiếp cận tốt hơn để có được vị trí địa lý của người dùng từ Twitter. Tôi thậm chí không thể tìm thấy một ví dụ duy nhất cho thấy thu hoạch vị trí người dùng với tham chiếu đến User_name hoặc user_id. Nó thậm chí có thể ở vị trí đầu tiên?

Input: Các tập tin đầu vào có hơn 50k hàng

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 

Code:

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 

Lỗi:

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}] 

Tôi hiểu mọi người sử dụng không chia sẻ geolocation, nhưng những người giữ hồ sơ công khai mở từ nếu tôi có thể nhận được vị trí địa lý sẽ là tuyệt vời.

Vị trí của người dùng dưới dạng tên và/hoặc lat lon là những gì tôi đang tìm kiếm.

Nếu cách tiếp cận này không chính xác thì tôi cũng sẽ mở để lựa chọn thay thế.

Cập nhật một: Sau khi tìm kiếm sâu, tôi tìm thấy số website cung cấp giải pháp rất gần, nhưng tôi gặp lỗi khi cố gắng đọc userName từ tệp đầu vào.

Điều này cho biết chỉ có 100 thông tin của người dùng có thể nắm được cách tốt nhất để nâng giới hạn đó là gì?

Code:

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()  

Lỗi:

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

Bạn đang hỏi gì? Bạn không hiểu lỗi bạn đang nhận được từ 'Tweepy'? Bạn không biết cách xử lý lỗi (https://docs.python.org/2/tutorial/errors.html#handling-exceptions)? – jonrsharpe

+1

Vui lòng đọc mã của bạn, bạn đang yêu cầu 'user_ids = ['user_name']', rất có thể thất bại vì không có người dùng twitter có tên 'user_name'. – oystein

+0

@oystein nghiêm túc sẽ đánh giá cao một số trợ giúp với mã để có được vị trí với tên người dùng. –

Trả lời

5

Giả sử rằng bạn chỉ muốn để có được vị trí của người dùng được đưa lên trên trang hồ sơ của mình/cô ấy, bạn có thể chỉ cần sử dụng API.get_user từ Tweepy. Dưới đây là mã làm việc.

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

Lưu ý: Đây là triển khai thô. Viết một chức năng ngủ thích hợp để tuân theo giới hạn truy cập API của Twitter.

+0

Chính xác cùng một đầu ra cùng với tất cả các cột đầu vào .. Hãy để tôi kiểm tra với đầy đủ dữ liệu. Danh sách tên người dùng lớn hơn 50k trong một đầu vào. Tôi hy vọng nó hoạt động cho điều đó. Sẽ trả lời ngay sau khi tôi kiểm tra .. –

+0

Vấn đề với hai chương trình trên tôi đã viết trong câu hỏi là về việc đọc người dùng từ tệp có khoảng 50 nghìn tên người dùng. Tôi có thể yêu cầu bạn giúp tôi với phần đó không. –

Các vấn đề liên quan