Python aiohttp異步爬蟲(萌新讀物,大神勿擾)

aiohttp異步爬蟲難嗎?

當(dāng)然!首先你找教程就是個(gè)問題!面向萌新的更是少的可憐,零零散散,大部分教程都是中級以上的程度!問題是…………入門篇呢?怎么入門?

還好!這篇文章就是專門解決這個(gè)問題的!((≧?≦)/)

圖片發(fā)自簡書App

準(zhǔn)備工作:

Python版本3.5及以上!有安裝? aiohttp? ? ? asyncio? ? ? BeautifulSoup? ? ? 等庫!

這些是準(zhǔn)備工作!沒有工具怎么擼代碼對吧!

還有至少有Python基礎(chǔ)!會requests!才能學(xué)習(xí)喔⊙ω⊙!

異步使用中要注意的地方:

1.異步很快!所以想要為所欲為!電腦一定要好,否則會出現(xiàn)遺失數(shù)據(jù)的情況(我的辣雞老電腦43分鐘爬了55000張圖片,結(jié)果程序跑完了只有最多20000張圖能看,其他的數(shù)據(jù)因?yàn)殡娔X太老了來不及寫入結(jié)果被沖掉了…………所以,要有承受失去一部分?jǐn)?shù)據(jù)的心理準(zhǔn)備,或者限速!(高級套,土豪套可以無視此限制!)

2.? aiohttp相當(dāng)于12缸發(fā)動機(jī)的跑車!所以鏈接數(shù)量只有百來?xiàng)l的同學(xué)!請老老實(shí)實(shí)用requests吧!百來?xiàng)l鏈接用aiohttp速度會和requests差不多!原因很簡單,數(shù)量少壓根跑不起來!這是大殺器,拿來殺雞不理想!


3.? 記住上面兩點(diǎn)!完畢…………!

(怕你們吃虧,提前說出來!)

圖片發(fā)自簡書App


教程正式開始:

1.天才第一步,導(dǎo)入Python庫!

圖片發(fā)自簡書App

time是時(shí)間模塊用來計(jì)時(shí)的不是本篇必要的庫!

aiohttp? 我們異步爬蟲的主角,還有它老爸——? asyncio? !

我們的解析庫BeautifulSoup? 爬蟲必備!?

注意!?

建議你安裝使用? lxml? 來解析,而不是BeautifulSoup? 自帶的? html.parser? !

如果說aiohttp是請求庫中的12V跑車,那么lxml就是解析的12V跑車,兩強(qiáng)聯(lián)手,所向披靡!

2.構(gòu)建要爬取的鏈接:

這個(gè)應(yīng)該是基礎(chǔ)了,各有各的方法和方式就不多解釋了!

圖片發(fā)自簡書App

3.異步第一步 async? def

async=標(biāo)記為協(xié)程,協(xié)程就是異步的關(guān)鍵!def 大家都很熟悉了,定義的意思,不做詳細(xì)解釋了!

連在一起?

就是以協(xié)程的形式定義一個(gè)函數(shù)? 或者? 說文化點(diǎn)就是? 定義一個(gè)協(xié)程形式的函數(shù)? 簡化點(diǎn)? 定義協(xié)程函數(shù)!三種騷話版本應(yīng)該能看懂了吧!get()是我定義的函數(shù)名!這個(gè)按自己喜好來!記得加上? async? def? 就好,

headers是請求頭,基礎(chǔ)知識不做詳解!

圖片發(fā)自簡書App

4.異步第二步 session

圖片發(fā)自簡書App


這一步和 async def 差不多是固定套路,我們的異步請求全是靠aiohttp里面的ClientSession 來執(zhí)行的,因?yàn)槭莻€(gè)關(guān)鍵的東西,所以是固定化的!

async with aiohttp.ClientSession() as session:

as 后面的名字可以改動,前半身是固定的,記下來就好!了解了解有什么用就OK了,庫的開發(fā)者已經(jīng)幫助我們鋪墊好了,按套路走就好!

注意:

async with aiohttp.ClientSession() as session:

這一句

只需要寫一次!

只需要寫一次!

只需要寫一次!

重要的逼,裝三遍!

5.發(fā)送請求

圖片發(fā)自簡書App


async with session.get(url,headers = headers) as resp:

這一句就是請求部分了,session是我定義的名字,你們換成自己的!url是鏈接,headers是請求頭,除了get外,其他的和requests差不多也能 post 等同于requests.get(url,headers=headers)

僅僅是把requests.get請求置換成了async with session.get()了而已,然后依次解析!寫法和requests差不多吧!

圖片發(fā)自簡書App

我放圖你們自己琢磨!我過一下重要部分就好!

圖片發(fā)自簡書App


注意,之所以上下錯(cuò)開是我調(diào)了編譯器的設(shè)置,不然代碼截圖不完全,你們還是按Python正常的寫法,縮進(jìn)書寫!

6.重點(diǎn)部分來了!

圖片發(fā)自簡書App

第一句和最后一句跳過,是統(tǒng)計(jì)程序運(yùn)行時(shí)間的代碼!可有可無!

loop = asyncio.get_event_loop()

又一句固定化代碼!照抄就好,作用是開啟循環(huán)模式,因?yàn)楫惒骄褪切畔⒀h(huán)的過程,這一句相當(dāng)于給汽車打火!

tasks =[get(i)for i in a]

還記得a列表嗎?就是我們拼接或者循環(huán)得到的所有主要鏈接!通過迭代的方式賦值給我定義的協(xié)程函數(shù)get(),注意,[? ]? 這個(gè)無論如何都是要的,沒他沒法跑起來,估計(jì)是內(nèi)部有函數(shù)需要用[? ]判斷鏈接是否發(fā)送過吧!和a列表原理應(yīng)該差不多,不過它是內(nèi)置在里面的而已!注意一下就好!

loop.run_until_complete(asyncio.wait(tasks))

這一句,差不多也算固定化代碼,里面的tasks變量名可以改成你自己的,這一句的作用就是啟動循環(huán)跑起來的意思,相當(dāng)于踩汽車油門,愉快開跑的意思!

我們來梳理一下!

1.構(gòu)建鏈接

2.定義一個(gè)協(xié)程函數(shù)體(此時(shí)的async僅僅起到了標(biāo)明只是一個(gè)協(xié)程定義函數(shù)的作用,后面的才是發(fā)揮作用的代碼,形象的比喻,就是,只是一個(gè)協(xié)程的文件夾,代碼在里面!)

3.async with aiohttp.ClientSession() as session:

以協(xié)程的形式使用請求功能的主要函數(shù),沒他不能get請求,固定套路,缺一不可!

4.async with session.get(url,headers = headers) as resp:

get請求的方式,用于異步請求,出自aiohttp.ClientSession()

(跳過部分:這一段是請求和解析的部分,因人而異,所以跳過,會requests和BeautifulSoup都懂!)

5.loop = asyncio.get_event_loop()

開啟消息循環(huán),固定套路,缺一不可!

6.tasks =[get(i)for i in a]

這個(gè)迭代真的不用講吧!基礎(chǔ)知識!

7.loop.run_until_complete(asyncio.wait(tasks))

這一句,啟動所有代碼!

汽車人!出發(fā)!

異步爬蟲講解完畢!其他的解析js?。》磁老x??!什么的就自己去掌握了,知識是說不完的!下面是不錯(cuò)的教程用于參考!

aiohttp還能用于異步服務(wù)器端喔!這些百度的到!反正是個(gè)很強(qiáng)大的庫!


1.異步起源知識

2.異步簡易使用

3.異步講解

4.異步使用2

5.不錯(cuò)的異步文章

6.有參考價(jià)值的異步爬蟲代碼

是不是灰常簡單!除了代碼變動了一下其他簡直和requests一模一樣的寫法有木有!就這樣就能輕松實(shí)現(xiàn)異步操作!這一點(diǎn)非常的Python!一句話————牛逼!墻都不服,就服你!

圖片發(fā)自簡書App




簡書處女作——完成!


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容