0

だから私は今Pythonを学び始めました、そして私はそれが大好きです.

私は小規模なFacebookデータスクレーパーを構築しています。基本的に、Graph API を使用して、指定された数のユーザーの名をスクレイピングします。シングルスレッド(または私が推測するスレッドなし)で正常に動作します。

オンライン チュートリアルを使用して、次のマルチスレッド バージョン(更新されたコード)を作成しました。

import requests
import json
import time
import threading
import Queue

GraphURL = 'http://graph.facebook.com/'
first_names = {} # will store first names and their counts
queue = Queue.Queue()

def getOneUser(url):
    http_response = requests.get(url) # open the request URL
    if http_response.status_code == 200:
        data = http_response.text.encode('utf-8', 'ignore') # Get the text of response, and encode it
        json_obj = json.loads(data) # load it as a json object
        # name = json_obj['name']
        return json_obj['first_name']
        # last = json_obj['last_name']
    return None

class ThreadGet(threading.Thread):
    """ Threaded name scraper """
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue

    def run(self):
        while True:
            #print 'thread started\n'
            url = GraphURL + str(self.queue.get())
            first = getOneUser(url) # get one user's first name
            if first is not None:
                if first_names.has_key(first): # if name has been encountered before
                    first_names[first] = first_names[first] + 1 # increment the count
                else:
                    first_names[first] = 1 # add the new name
            self.queue.task_done()
            #print 'thread ended\n'

def main():
    start = time.time()
    for i in range(6):
        t = ThreadGet(queue)
        t.setDaemon(True)
        t.start()

    for i in range(100):
        queue.put(i)

    queue.join()

    for name in first_names.keys():
        print name + ': ' + str(first_names[name])

    print '----------------------------------------------------------------'
    print '================================================================'
    # Print top first names
    for key in first_names.keys():
        if first_names[key] > 2:
            print key + ': ' + str(first_names[key])

    print 'It took ' + str(time.time()-start) + 's'

main()

正直なところ、コードのいくつかの部分は理解できませんが、主なアイデアは理解できます。出力は何もありません。つまり、シェルには何も入っていないので、実行し続けると思います。

だから私がやっているqueueことは、fb のユーザー ID である整数を入力することです。次に、各 ID を使用して API 呼び出し URL を作成します。getOneUser一度に 1 人のユーザーの名前を返します。そのtask(ID) は「完了」としてマークされ、次に進みます。

上記のコードの何が問題になっていますか?

4

2 に答える 2