所以我现在开始学习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
一次返回一个用户的名称。该task
(ID)被标记为“完成”并继续前进。
上面的代码有什么问题?