だから私は今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) は「完了」としてマークされ、次に進みます。
上記のコードの何が問題になっていますか?