多協程爬蟲

2021-10-06 07:44:09 字數 1887 閱讀 3615

要實現非同步的爬蟲方式的話,需要用到多協程。

同步的爬蟲方式爬取這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...