2016-06-07 182 views
-1

我试图实现基于地理位置的流媒体推文的代码,并获得相同的代码,但我不断得到错误,因为 “全局名称'requestid'未定义。 编写的代码是如下给出:所示全局变量未定义错误

# Geolocation twitter crawler using streaming API 
import os 
import sys 
import math 
import time 
from datetime import datetime 
import simplejson as json 
from tweepy import Stream 
from tweepy import OAuthHandler 
from tweepy.streaming import StreamListener 
from geopy import geocoders 

adress = str(sys.argv[1]) # Location (City name, adress...) 
halfradius = float(sys.argv[2]) # Radius in Km of the Bounding Box 
outputlocation = str(sys.argv[3]) 
datereq = datetime.utcnow().strftime("%d%m%Y") 
access_token = "749913608-Z9LiTN6xv7PluHoyNn3Ggot4rnkGObr2OVZsmv5i" 
access_token_secret = "wKK0BWG1dXdNBKAVPCeasbtqQI4W3Vf0jCusRIhu6LKla" 
consumer_key = "f9CE9GjsMCioQ8NnTEJXn4IxE" 
consumer_secret = "a53Ro5lCnsYG6Lq0jW3J6ulEMzy3HQYKknRqUnvdhJFdbsPAuy" 


class listener(StreamListener): 

    def on_data(self, data): 
     data = json.loads(data) 
     logfile = open(os.path.join(outputlocation, adress + "-" + datereq + "- 
Request" + str(requestid) + ".csv"), "a") 

     tweet_date = unicode(data['created_at']).encode("ascii", "ignore")[:10] + " " + unicode(data['created_at']).encode("ascii", "ignore")[-4:] 
     tweet_time = unicode(data['created_at']).encode("ascii", "ignore")[11:-11] 
     user_id = unicode(data['user']['id']).encode("ascii", "ignore") 
     text_id = unicode(data['id']).encode("ascii", "ignore") 
     user_location = unicode(data['user'] 
['location']).encode("ascii", "ignore") 

     user_lang = unicode(data['user']['lang']).encode("ascii", "ignore") 
     text_msg = unicode(data['text']).encode("utf8", "ignore").replace(',', ' ') 

     if data['coordinates'] == None : 
      # print >>logfile, '[No geotag for this tweet]' 
      print '[No geotag for this tweet]' 
      longitude = "" 
      latitude = "" 

     else: 
      coord = unicode(data['coordinates']['coordinates']).encode("ascii", "ignore") 
      longitude = coord[:coord.rfind(',')].replace("[", "") 
      latitude = coord.split(" ")[1].replace("]", "") 
      stream_log = longitude + "," + latitude + "," + tweet_date + "," + tweet_time + "," + user_id + "," + user_location + "," + user_lang + "," + text_id + "," + text_msg 
      stream_log = stream_log.replace('\n', ' ') 
      print stream_log 
      print >> logfile, stream_log 
     logfile.close() 
     return True 

    def on_error(self, statut): 
     print statut 

# degrees to radians 
def deg2rad(degrees): 
    return math.pi * degrees/180.0 

# radians to degrees 
def rad2deg(radians): 
    return 180.0 * radians/math.pi 

# Semi-axes of WGS-84 geoidal reference 
WGS84_a = 6378137.0 # Major semiaxis [m] 
WGS84_b = 6356752.3 # Minor semiaxis [m] 

# Earth radius at a given latitude, according to the WGS-84 ellipsoid [m] 
def WGS84EarthRadius(lat): 
    # http://en.wikipedia.org/wiki/Earth_radius 
    An = WGS84_a * WGS84_a * math.cos(lat) 
    Bn = WGS84_b * WGS84_b * math.sin(lat) 
    Ad = WGS84_a * math.cos(lat) 
    Bd = WGS84_b * math.sin(lat) 
    return math.sqrt((An * An + Bn * Bn)/(Ad * Ad + Bd * Bd)) 

# Bounding box surrounding the point at given coordinates, 
# assuming local approximation of Earth surface as a sphere 
# of radius given by WGS84 
def boundingBox(latitudeInDegrees, longitudeInDegrees, halfSideInKm): 
    lat = deg2rad(latitudeInDegrees) 
    lon = deg2rad(longitudeInDegrees) 
    halfSide = 1000 * halfSideInKm 

    # Radius of Earth at given latitude 
    radius = WGS84EarthRadius(lat) 

    # Radius of the parallel at given latitude 
    pradius = radius * math.cos(lat) 
    latMin = lat - halfSide/radius 
    latMax = lat + halfSide/radius 
    lonMin = lon - halfSide/pradius 
    lonMax = lon + halfSide/pradius 
    return (rad2deg(latMin), rad2deg(lonMin), rad2deg(latMax), rad2deg(lonMax)) 

def main(): 
    g = geocoders.GoogleV3() 
    place, (lat, lng) = g.geocode(adress) 
    location = [boundingBox(lng, lat, halfradius) 
[0], boundingBox(lng, lat, halfradius)[1], boundingBox(lng, lat, halfradius)[2], boundingBox(lng, lat, halfradius)[3]] 

    # print "Location of "+ adress+" :",lng,lat 
    auth = OAuthHandler(consumer_key, consumer_secret) 
    auth.set_access_token(access_token, access_token_secret) 
    twitterStream = Stream(auth, listener()) 
    twitterStream.filter(locations=location) 

main() 

回答

0

的requestId没有定义。我对这段代码一无所知;然而,在收到的JSON数据包中绑定了requestid?如果是这样,请在使用它在on_data(...)方法中构建csv文件名之前从中提取它。