關於協程爬蟲的內容(關於協程爬蟲的內容)
2023-10-16 16:36:34 1
作者:小K
來源:麥叔編程
❝
上次的Python三分鐘帶大家寫了一把協程函數,然後給大家留了2個跟協程有關的話題讓大家選。
看了下評論區,選擇協程爬蟲的同學比較多。
❞
那麼今天就安排協程爬蟲的內容。
aiohttp模塊上期的文章我強調了,協程函數中不能使用同步的函數或模塊。
我們在一般的爬蟲程序中基本上都會用requests模塊,對目標網站發起請求並獲得響應。
import requestsr = requests.get("http://www.baidu.com")print(r.text)
但是在async函數中如果出現requests模塊,那麼這個async函數就會變成普通函數。
所以如果想要在async函數中發起異步請求,那麼就一定需要對應的模塊對它進行支持。
在這我介紹一個模塊 -- aiohttp,它是能夠寫入async函數中並對web端發起請求。
結合代碼看一下,
import asynciofrom aiohttp import ClientSessionurl = "http://www.baidu.com"async def spider(url): async with ClientSession as session: async with session.get(url) as response: response = await response.read print(response)if __name__ == '__main__': loop = asyncio.get_event_loop loop.run_until_complete(spider(url))
代碼說明:
import asynciofrom aiohttp import ClientSession
模塊導入要用的協程模塊,
from aiohttp import ClientSession
類似於用requests模塊創建了一個session,創建了一個與web之間的會話。
主函數部分直接看代碼注釋吧~
async def spider(url): # 使用ClientSession創建了一個session會話。 async with ClientSession as session: # 使用session去請求目標站,並取迴響應報文。 async with session.get(url) as response: # 獲得響應報文 response = await response.read print(response)
❝
肯定有小夥伴好奇,為什麼函數中會出現async和await這樣的字眼?
❞
我先解釋下await的作用是什麼,爬蟲在發起請求之後,需要服務端對我們的這個請求(request)進行處理分析,有些比較繁忙的伺服器還要等待一些時間才會給我返迴響應。
所以為了避免時間浪費,await表示這一步操作可以掛起不等待。
❝
就像一人操作多臺洗衣機那樣,啟動洗衣機後,根本沒有沒有必要守著,可以去處理別的事情。
等衣服洗完之後,我再來取出衣服。
❞
而async代表的就是,我這個事件在你await之後是可以來處理的。
上面的代碼,我只註冊一個task放入loop循環事件中。
下面我們將嘗試放入N個task,開啟高速爬蟲之旅。
「為了避免崩了他人伺服器,本次測試的url將使用Baidu作例子。」
import timeimport asynciofrom aiohttp import ClientSessiontasks = []url = "http://www.baidu.com"async def spider(url): async with ClientSession as session: async with session.get(url) as response: response = await response.read # print(response) print(f"get reponse time: {time.time}")def run: for i in range(1000): task = asyncio.ensure_future(spider(url)) tasks.append(task)if __name__ == '__main__': loop = asyncio.get_event_loop run loop.run_until_complete(asyncio.wait(tasks))
上面的代碼中,將1000個向Baidu發起請求的task註冊進了loop循環中,
執行代碼之後本機將會向Baidu發起1000次請求。
❝
對於代碼來說可能我們可能改幾個0就會對方伺服器造成很大的壓力,所以大家練練手就行。
「崩了對方伺服器是要進去的。」
❞
如果你也有一些疑問,請在評論區留言,
,