0

APIを使用してFacebookからデータを収集する小さなツールを作成しました。ツールは、マルチプロセッシング、キュー、および httplib モジュールを使用します。ここに、コードの一部があります:

主なプロセス:

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

4

1 に答える 1

2

ソケットのタイムアウト値に関して時折発生する「落とし穴」の 1 つは、ほとんどのオペレーティング システムがそれらを float として期待することです。これは、Linux カーネルの新しいバージョンで説明されていると思います。

変更してみてください: self.connection = httplib.HTTPSConnection("graph.facebook.com", timeout=2) を: self.connection = httplib.HTTPSConnection("graph.facebook.com", timeout=2.0)

ちなみに2秒です。デフォルトは通常 5 秒です。少し低いかも。

于 2013-08-29T21:59:58.710 に答える