我想用celery+redis+requests寫爬蟲,我自己測試了一下速度。採集url的狀態碼放入文件中。
from celery import Celery
import requests
app = Celery('tasks',
broker = 'redis://localhost:6379/0',
backend= 'redis://localhost:6379/1')
app.conf.CELERY_TASK_SERIALIZER = 'json'
@app.task
def page(url):
p = requests.get(url).status_code
file = open('result','a')
file.write(str(p)+'\n')
file.close()
return p
結果很快就很滿意
/usr/bin/python2.7 /home/comboo/PycharmProjects/run.py
0.919842004776
Process finished with exit code 0
和單線程比較
34.3654260635
但是假如我輸出task的結果,就會變成單線程一個個取出結果
#coding:utf-8
import time
from tasks import page
url = 'http://www.baidu.com'
# print page.delay(url).get()
cent = time.time()
for line in range(100):
code = page.delay(url)
print code.get()
print time.time() - cent
就是任務之外只要有語句速度就會變慢。
現在造成的結果就是,我必須寫一個完整的任務,從請求到解析到下載,再到存入資料庫,透過celery來調度。
但是有時候我可能不想這樣做,例如寫入文件,我想一次全部寫入在關閉連接,而不是寫入一行關閉一次連接
有點長,謝謝大家了。