2013-08-29 48 views
0

我写了一个小工具,它使用api从facebook收集数据。工具使用多处理,队列和httplib模块。在此,是一个代码部分:Python:httplib.HTTPSConnection.request无法正常工作

主要过程:

def extract_and_save(args): 
    put_queue = JoinableQueue() 
    get_queue = Queue() 

    for index in range(args.number_of_processes): 
     process_name = u"facebook_worker-%s" % index 
     grabber = FacebookGrabber(get_queue=put_queue, put_queue=get_queue, name=process_name) 
     grabber.start() 

    friend_list = get_user_friends(args.default_user_id, ["id"]) 
    for index, friend_id in enumerate(friend_list): 
     put_queue.put(friend_id) 

    put_queue.join() 
    if not get_queue.empty(): 
     ... save to database ... 
    else: 
     logger.info(u"There is no data to save") 

工作进程:

class FacebookGrabber(Process): 
    def __init__(self, *args, **kwargs): 
     self.connection = httplib.HTTPSConnection("graph.facebook.com", timeout=2) 
     self.get_queue = kwargs.pop("get_queue") 
     self.put_queue = kwargs.pop("put_queue") 
     super(FacebookGrabber, self).__init__(*args, **kwargs) 
     self.daemon = True 

    def run(self): 
     while True: 
      friend_id = self.get_queue.get(block=True) 
      try: 
       friend_obj = self.get_friend_obj(friend_id) 
      except Exception, e: 
       logger.info(u"Friend id %s: facebook responded with an error (%s)", friend_id, e) 
      else: 
       if friend_obj: 
        self.put_queue.put(friend_obj) 
      self.get_queue.task_done() 

共同代码:

def get_json_from_facebook(connection, url, kwargs=None): 
    url_parts = list(urlparse.urlparse(url)) 
    query = dict(urlparse.parse_qsl(url_parts[4])) 
    if kwargs: 
     query.update(kwargs) 
    url_parts[4] = urllib.urlencode(query) 
    url = urlparse.urlunparse(url_parts) 
    try: 
     connection.request("GET", url) 
    except Exception, e: 
     print "<<<", e 

    response = connection.getresponse() 
    data = json.load(response) 
    return data 

此代码完美适用于Ubuntu。但是当我试图在Windows 7上运行它时,我收到了消息“没有要保存的数据”。问题就在这里:

try: 
    connection.request("GET", url) 
except Exception, e: 
    print "<<<", e 

我得到一个错误:<<< a float is required

不要任何人知道,如何解决这个问题?

Python版本:2.7.5

回答

2

其中的“疑难杂症的”,偶尔带插座的超时值的情况是,大多数操作系统指望他们为浮动。我相信这已经被更高版本的Linux内核所考虑。

尝试改变: self.connection = httplib.HTTPSConnection("graph.facebook.com", timeout=2) 到: self.connection = httplib.HTTPSConnection("graph.facebook.com", timeout=2.0)

这是2秒,顺便说一句。默认值通常是5秒。可能会有点低。

+0

有趣的是,在Win 7中,int和float都适用于我。你运行的是哪个版本的Windows? – DivinusVox

+0

这很有趣。我改变超时为'浮动'值(10.0),一切正常。我也用'int'值(10)检查了超时,它也工作得很完美。所以,很明显,问题在于HTTPSConnection .__ init__中超时的值。可能它太小了(它也不适用于默认值)。 –

+0

@TuralGurbanov奇怪。 2.0在我的盒子上工作。 – DivinusVox