我写了一个小工具,它使用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
有趣的是,在Win 7中,int和float都适用于我。你运行的是哪个版本的Windows? – DivinusVox
这很有趣。我改变超时为'浮动'值(10.0),一切正常。我也用'int'值(10)检查了超时,它也工作得很完美。所以,很明显,问题在于HTTPSConnection .__ init__中超时的值。可能它太小了(它也不适用于默认值)。 –
@TuralGurbanov奇怪。 2.0在我的盒子上工作。 – DivinusVox