python爬蟲結課了,最後的高性能爬蟲方案
代理:避開IP這種反扒機制
什麼是代理:
代理服務器
代理的作用:
突破自身IP訪問限制
隱藏自身真實IP
代理IP的類型
http:應用到http協議對應的url中 proxies ={‘協議’:‘ip:端口號’}
https:應用到https協議對應的url中
代理IP的匿名度:
透明:服務器知道該請求使用了代理,也知道請求對應的真實IP
匿名:知道使用了代理,不知道真實IP
高匿:不知道使用了代理,更不知道真實的IP
高性能異步爬蟲:
目的:在爬蟲中使用異步實現高性能的數據爬取操作
異步爬蟲的方式:
多線程/多進程:(不建議)
好處:可以爲相關阻塞的操作單獨開啓線程或進程,阻塞操作就可以異步執行。
弊端:無法無限制的開啓多線程或多進程。
線程池/進程池:(適當使用)
好處:我們可以降低系統對進程或線程的創建和銷燬的一個頻率,從而很好的降低系統的開銷。
弊端:池中線程或進程的數量是有上限的。
導入線程池模塊對應的類:from multiprocessing import pool
實例化一個線程池對象:pool = pool(n) n:線程池中線程數
線程池的使用:pool.map(阻塞操作,可迭代對象)
使用原則:線程池處理的是阻塞且較爲耗時的操作
單線程+異步協程(推薦)
event_loop:事件循環,相當於一個無限循環,我們可以把一些函數註冊到這個事件循環上,當滿足某些條件的時候,函數就會被循環執行
coroutine:協程對象,我們可以將協程對象註冊到循環事件中,它會被事件循環調用
我們可以使用 async 關鍵字來定義一個方法,這個方法在調用時不會立即執行,而是返回一個協程對象
task:任務,它是對協程對象的進一步封裝,包含了任務的各個狀態
future:代表將來執行會還沒執行的任務,實際上和 task 沒有本質區別
async:定義一個協程
await: 用來掛起阻塞方法的執行
異步請求(aiohttp)
環境安裝:
pip install aiohttp
使用該模塊中的ClientSession
使用aiohttp
請求代替requests
請求
用法:
async with aiohttp.ClientSession() as session:
get()/post():
headers,params/data,proxy=‘http://ip:port’
async with await session.get(url) as response:
text() 返回字符串形式的響應數據
read() 返回二進制形式的響應數據
json() 返回的就是json對象
注意:獲取相應數據操作之前一定要使用await進行手動掛起
page_text = await response.text()