2017-02-02 5 views
0

Это сводит меня с ума. Как вы можете видеть ниже, я использую простой цикл while, чтобы выполнить пару tweepy-запросов и добавить их в фрейм данных. По какой-то причине, однако, вытащив первый набор из 100 твитов, он просто повторяет этот набор вместо того, чтобы выполнять новый поиск. Любые советы будут очень признательны.Tweepy Search w/While Loop

import sys 
import csv 
import pandas as pd 
import tweepy 
from tweepy import OAuthHandler 

consumer_key = '' 
consumer_secret = '' 
access_token = '' 
access_secret = '' 

auth = OAuthHandler(consumer_key, consumer_secret) 
auth.set_access_token(access_token, access_secret) 

api = tweepy.API(auth) 

num_results = 200 
result_count = 0 
last_id = None 
df = pd.DataFrame(columns=['Name', 'Location', 'Followers', 'Text', 'Coorinates']) 

while result_count < num_results: 
    result = api.search(q='',count=100, geocode= "38.996918,-104.995826,190mi", since_id = last_id) 
    for tweet in result: 
     user = tweet.user 
     last_id = tweet.id_str 
     name = user.name 
     friends = user.friends_count 
     followers = user.followers_count 
     text = tweet.text.encode('utf-8') 
     location = user.location 
     coordinates = tweet.coordinates 
     df.loc[result_count] = pd.Series({'Name':name, 'Location':location, 'Followers':followers, 'Text':text, 'Coordinates':coordinates}) 
     print(text) 
     result_count += 1 

# Save to Excel 
print("Writing all tables to Excel...") 
df.to_csv('out.csv') 
print("Excel Export Complete.") 

ответ

0

Метод API.search возвращает твиты, соответствующие указанному запросу. Это не потоковый APi, поэтому он сразу возвращает все данные.
Кроме того, в ваших параметрах запроса вы добавили count, в котором указано количество статусов для извлечения.

Таким образом, проблема заключается в том, что по вашему запросу вы возвращаете первые 100 данных полного набора для каждого, пока итерация.

Я предлагаю вам изменить код во что-то вроде этого

result = api.search(q='', geocode= "38.996918,-104.995826,190mi", since_id = last_id) 
for tweet in result: 
    user = tweet.user 
    last_id = tweet.id_str 
    name = user.name 
    friends = user.friends_count 
    followers = user.followers_count 
    text = tweet.text.encode('utf-8') 
    location = user.location 
    coordinates = tweet.coordinates 
    df.loc[result_count] = pd.Series({'Name':name, 'Location':location, 'Followers':followers, 'Text':text, 'Coordinates':coordinates}) 
    print(text) 

Позвольте мне знать.

+0

Я попытался исключить параметр «count» из моего поискового запроса, но это вернет только 15 результатов. Мое понимание из tweepy docs заключается в том, что, включив параметр «count», я могу принять до 100, а затем сделать 15 запросов для компиляции большего количества результатов. Я считаю, что оба эти ограничения соблюдаются API Twitter, да? Я также думал, что параметр «from_id» был там, чтобы не допустить, чтобы я снова и снова возвращал одни и те же 100 лучших результатов? Я рассматриваю возможность перехода к потоку, чтобы вывести результаты, но моя цель - собрать «случайный» выбор твитов, и это приведет к некоторому смещению времени. – bengen343

+0

Извините за поздний ответ, кстати, где вы прочитали около 15 запросов с параметром count? Возможно, вы можете попытаться удалить параметр from_id, поскольку возвращает только статусы с идентификатором, большим (более поздним, чем) указанным ID. – Giordano

 Смежные вопросы

  • Нет связанных вопросов^_^