要實現非同步的爬蟲方式的話,需要用到多協程。
同步的爬蟲方式爬取這8個** :
import requests,time
#匯入requests和time
start = time.time()
#記錄程式開始時間
url_list = ['',
'','',
'','',
'','',
'']#把8個**封裝成列表
for url in url_list:
#遍歷url_list
r = requests.get(url)
#用requests.get()函式爬取**
print(url,r.status_code)
#列印**和抓取請求的狀態碼
end = time.time()
#記錄程式結束時間
print(end-start)
#end-start是結束時間減去開始時間,就是最終所花時間。
#最後,把時間列印出來。
from gevent import monkey
monkey.patch_all()
import gevent,time,requests
start = time.time()
url_list = ['',
'','',
'','',
'','',
'']def crawler(url):
r = requests.get(url)
print(url,time.time()-start,r.status_code)
tasks_list =
for url in url_list:
task = gevent.spawn(crawler,url)
gevent.joinall(tasks_list)
end = time.time()
print(end-start)
當我們用多協程來爬蟲,需要建立大量任務(假如我們要爬的不是8個**,而是1000個**,我們可以怎麼做?)
時,我們可以借助queue模組。
queue翻譯成中文是佇列的意思。我們可以用queue模組來儲存任務,讓任務都變成一條整齊的佇列,就像銀行視窗的排號做法。因為queue其實是一種有序的資料結構,可以用來訪問資料。
from gevent import monkey
monkey.patch_all()
import gevent,time,requests
from gevent.queue import queue
start = time.time()
url_list = ['',
'','',
'','',
'','',
'']work = queue()
for url in url_list:
work.put_nowait(url)
def crawler():
while not work.empty():
url = work.get_nowait()
r = requests.get(url)
print(url,work.qsize(),r.status_code)
tasks_list = [ ]
for x in range(2):
task = gevent.spawn(crawler)
gevent.joinall(tasks_list)
end = time.time()
print(end-start)
python 協程 爬蟲
協程 又叫微執行緒 python的多執行緒沒法利用多核,只能用乙個核去切換,沒辦法實現真正的並行效果。多執行緒的意義,對於io密集型是有意義的。大部分處理都是io的,多執行緒是可以解決大多數情況的。但是解決不了並行的多程序。協程 非搶占式的程式,執行緒和程序都是搶占式的。協程也是要切換的,不過這種切...
協程下的爬蟲
from urllib import request import gevent,time from gevent import monkey 在沒有加上此句和下一句時,執行速度理論上是一樣的,因為gevent檢測不到i o埠 monkey.patch all def f url print get...
13 爬蟲之協程
首先我們需要知道的是requests是同步的方法。而我們若想使用協程,寫的方法都盡量不是使用同步的方法。因些我們,選擇使用乙個新的模組庫 aiohttp 官網1.1 安裝pip install aiohttp1.2 快速開始import aiohttp loop.run until complete...