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
흥미롭게도 int 및 float 모두 Win 7에서 작동합니다. 어떤 Windows 버전을 실행하고 있습니까? – DivinusVox
재미 있습니다. 나는 timeout을'float' 값 (10.0)으로 바꾸 었으며 모든 것이 잘 동작했습니다. 또한'int' 값 (10)으로 타임 아웃을 확인했고 완벽했습니다. 그래서 분명히, 문제는 HTTPSConnection .__ init__의 시간 초과 값에 있습니다. 아마도 너무 작습니다 (기본 값으로는 작동하지 않습니다). –
@TuralGurbanov Strange. 2.0 내 상자에 근무했습니다. – DivinusVox