2016-09-04 8 views
0
#!/usr/bin/python 
from TwitterSearch import * 

import sys 
import csv 

tso = TwitterSearchOrder() # create a TwitterSearchOrder object 
tso.set_keywords(['gmo']) # let's define all words we would like to have a look for 
tso.set_language('en') # we want to see English tweets only 
tso.set_include_entities(False) # and don't give us all those entity information 

max_range = 1   # search range in kilometres 
num_results = 500  # minimum results to obtain 
outfile = "output.csv" 


# create twitter API object 
twitter = TwitterSearch(
         access_token = "764537836884242432-GzJmUSL4hcC2DOJD71TiQXwCA0aGosz", 
         access_token_secret = "zDGYDeigRqDkmdqTgBOltcfNcNnfLwRZPkPLlnFyY3xqQ", 
         consumer_key = "Kr9ThiJWvPa1uTXZoj4O0YaSG", 
         consumer_secret = "ozGCkXtTCyCdOcL7ZFO4PJs85IaijjEuhl6iIdZU0AdH9CCoxS" 
         ) 

# Create an array of USA states 
ustates = [ 
      "AL", 
      "AK", 
      "AS", 
      "AZ", 
      "AR", 
      "CA", 
      "CO", 
      "CT", 
      "DE", 
      "DC", 
      "FM", 
      "FL", 
      "GA", 
      "GU", 
      "HI", 
      "ID", 
      "IL", 
      "IN", 
      "IA", 
      "KS", 
      "KY", 
      "LA", 
      "ME", 
      "MH", 
      "MD", 
      "MA", 
      "MI", 
      "MN", 
      "MS", 
      "MO", 
      "MT", 
      "NE", 
      "NV", 
      "NH", 
      "NJ", 
      "NM", 
      "NY", 
      "NC", 
      "ND", 
      "MP", 
      "OH", 
      "OK", 
      "OR", 
      "PW", 
      "PA", 
      "PR", 
      "RI", 
      "SC", 
      "SD", 
      "TN", 
      "TX", 
      "UT", 
      "VT", 
      "VI", 
      "VA", 
      "WA", 
      "WV", 
      "WI", 
      "WY", 
      "USA" 
      ] 

def linearSearch(item, obj, start=0): 
    for i in range(start, len(obj)): 
     if item == obj[i]: 
      return True 
    return False 
# open a file to write (mode "w"), and create a CSV writer object 
csvfile = file(outfile, "w") 
csvwriter = csv.writer(csvfile) 

# add headings to our CSV file 
row = [ "user", "text", "place"] 
csvwriter.writerow(row) 

#----------------------------------------------------------------------- 
# the twitter API only allows us to query up to 100 tweets at a time. 
# to search for more, we will break our search up into 10 "pages", each 
# of which will include 100 matching tweets. 
#----------------------------------------------------------------------- 
result_count = 0 
last_id = None 

while result_count < num_results: 
    # perform a search based on latitude and longitude 
    # twitter API docs: https://dev.twitter.com/docs/api/1/get/search 
    query = twitter.search_tweets_iterable(tso) 

    for result in query: 
     state = 0 
     if result["place"]: 
      user = result["user"]["screen_name"] 
      text = result["text"] 
      text = text.encode('utf-8', 'replace') 
      place = result["place"]["full_name"] 
      state = place.split(",")[1] 
     if linearSearch(state,ustates): 
      print state 
      # now write this row to our CSV file 
      row = [ user, text, place ] 
      csvwriter.writerow(row) 
      result_count += 1 
     last_id = result["id"] 

    print "got %d results" % result_count 

csvfile.close() 

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

+0

Я не вижу смысл определять линейный поиск, что делать точно так же, как и 'государство в ustates' , Кроме того, вы уверены, что 'state' является строкой в ​​верхнем регистре? попробуйте с 'state.upper() в ustates' – Copperfield

+0

Я взял ваши советы и оглянулся на свой код. Первая проблема заключается в том, что этот place.split может иметь только один файл, у него не будет place.split (",") [1]. – FattGuy

+0

Я использовал совет для сравнения состояния с ustates и понял, что мне нужно изменить свой тип данных на unicode в моем массиве. Но все равно результат. – FattGuy

ответ

0

, как это похоже на проблемы некоторые пробелы остальные, вы можете использовать .strip(), чтобы удалить их

>>> x=" WY " 
>>> x.strip() 
'WY' 
>>> 

Также некоторые другие советы

  1. Чтобы ускорить проверку членства в ustates использовать set вместо списка, поскольку набор имеет постоянную проверку времени, а список - линейный поиск

  2. Предпочтительным способом открытия файла является использование context manager, обеспечивающее закрытие файла в конце блока или в случае ошибки в блоке. Кроме того, использование открытым вместо файла

с тем кончиком код должен выглядеть

#!/usr/bin/python 

... # all the previous stuff 

# Create an set of USA states 
ustates = { 
      "AL", "AK", "AS", "AZ", "AR", 
      "CA", "CO", "CT", 
      "DE", "DC", 
      "FM", "FL", 
      "GA", "GU", 
      "HI", 
      "ID", "IL", "IN", "IA", 
      "KS", "KY", 
      "LA", 
      "ME", "MH", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "MP", 
      "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", 
      "OH", "OK", "OR", 
      "PW", "PA", "PR", 
      "RI", 
      "SC", "SD", 
      "TN", "TX", 
      "UT", 
      "VT", "VI", "VA", 
      "WA", "WV", "WI", "WY", 
      "USA" 
      } # that arrange is just to take less lines, while grouping them alphabetically 


# open a file to write (mode "w"), and create a CSV writer object 
with open(outfile,"w") as csvfile: 
    ... # the rest is the same 

    while result_count < num_results: 
     # perform a search based on latitude and longitude 
     # twitter API docs: https://dev.twitter.com/docs/api/1/get/search 
     query = twitter.search_tweets_iterable(tso) 

     for result in query: 
      state = 0 
      if result["place"]: 
       ... # all the other stuff 
       state = state.strip()  #<--- the strip part, add the .upper() if needed or just in case 
      if state in ustates: 
       ... # all the other stuff 
      ... # the rest of stuff 

     print "got %d results" % result_count 
+0

, что лучше предложить thx man – FattGuy