2013-08-29 4 views
0

api를 사용하여 페이스 북에서 데이터를 수집하는 작은 도구를 작성했습니다. 도구는 다중 처리, 대기열 및 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 

이 코드는 우분투에서 완벽하게 작동합니다. 그러나 Windows 7에서 실행하려고하면 "저장할 데이터가 없습니다"라는 메시지가 나타납니다. 문제는 여기에 있습니다 :

아무도 알아 <<< a float is required, 어떻게이 문제를 해결하기 위해 :

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

나는 다음 오류가?

파이썬 버전 :은 "잡았다의는"그 가끔 소켓 시간 초과 값과 발생의 2.7.5

답변

2

하나는 대부분의 운영 체제가 수레로를 기대합니다. 나는 이것이 리눅스 커널의 최신 버전으로 설명되었다고 생각한다. 변경

시도 : self.connection = httplib.HTTPSConnection("graph.facebook.com", timeout=2) 에 : 그런데, 2 초입니다 self.connection = httplib.HTTPSConnection("graph.facebook.com", timeout=2.0)

. 기본값은 일반적으로 5 초입니다. 조금 낮을 수도 있습니다.

+0

흥미롭게도 int 및 float 모두 Win 7에서 작동합니다. 어떤 Windows 버전을 실행하고 있습니까? – DivinusVox

+0

재미 있습니다. 나는 timeout을'float' 값 (10.0)으로 바꾸 었으며 모든 것이 잘 동작했습니다. 또한'int' 값 (10)으로 타임 아웃을 확인했고 완벽했습니다. 그래서 분명히, 문제는 HTTPSConnection .__ init__의 시간 초과 값에 있습니다. 아마도 너무 작습니다 (기본 값으로는 작동하지 않습니다). –

+0

@TuralGurbanov Strange. 2.0 내 상자에 근무했습니다. – DivinusVox