中文字幕精品亚洲无线码vr,中文字幕av高清人妻,中文人妻熟女乱又乱精品,真正免费的毛片,在线视频色在线

×

如何用一行代碼讓gevent爬蟲(chóng)提速100%

分類(lèi):互聯(lián)網(wǎng)熱點(diǎn) 編輯:3 瀏覽量:1
2020-07-20 13:33:06

用python做網(wǎng)絡(luò)開(kāi)發(fā)的人估計(jì)都聽(tīng)說(shuō)過(guò)gevent這個(gè)庫(kù),gevent是一個(gè)第三方的python協(xié)程庫(kù),其是在微線(xiàn)程庫(kù)greenlet的基礎(chǔ)上構(gòu)建而成,并且使用了epoll事件監(jiān)聽(tīng)機(jī)制,這讓gevent具有很好的性能并且比greenlet更好用。根據(jù)gevent官方的資料(網(wǎng)址:http://www.gevent.org),gevent具有以下特點(diǎn):

筆者總結(jié)一下,gevent大致原理就是當(dāng)一個(gè)greenlet遇到需要等待的操作時(shí)(多為IO操作),比如網(wǎng)絡(luò)IO/睡眠等待,這時(shí)就會(huì)自動(dòng)切換到其他的greenlet,等上述操作完成后,再在適當(dāng)?shù)臅r(shí)候切換回來(lái)繼續(xù)執(zhí)行。在這個(gè)過(guò)程中其實(shí)仍然只有一個(gè)線(xiàn)程在執(zhí)行,但因?yàn)槲覀冊(cè)诘却承㊣O操作時(shí),切換到了其他操作,避免了無(wú)用的等待,這就為我們大大節(jié)省了時(shí)間,提高了效率。

筆者也是在看了gevent這么多的優(yōu)點(diǎn)之后,感覺(jué)有必要上手試一試,但起初效果非常不理想,速度提升并不大,后來(lái)在仔細(xì)研究了gevent的用法之后,發(fā)現(xiàn)gevent的高效率是有條件的,而其中一個(gè)重要條件就是monkey patch的使用,也就是我們常說(shuō)的猴子補(bǔ)丁。

monkey patch就是在不改變?cè)创a的情況下,對(duì)程序進(jìn)行更改和優(yōu)化,其主要適用于動(dòng)態(tài)語(yǔ)言。通過(guò)monkey patch,gevent替換了標(biāo)準(zhǔn)庫(kù)里面大部分的阻塞式系統(tǒng)調(diào)用,比如socket、ssl、threading和select等,而變?yōu)閰f(xié)作式運(yùn)行。下面筆者還是通過(guò)代碼來(lái)演示一下monkey patch的用法以及使用條件。筆者展示的這個(gè)程序是一個(gè)小型的爬 蟲(chóng)程序,程序代碼量少,便于閱讀和運(yùn)行,同時(shí)也能較好地測(cè)試出monkey patch的提升程度。主要思路是從Box Office Mojo網(wǎng)站抓取北美電影市場(chǎng)今年第二季度上映的電影,然后從每部電影的信息頁(yè)面提取出每部電影的電影分級(jí),然后把每部電影的名稱(chēng)和其對(duì)應(yīng)分級(jí)保存在一個(gè)字典當(dāng)中,再測(cè)試一下整個(gè)過(guò)程的時(shí)間。在這里,我們主要測(cè)試三種情況下的程序完成時(shí)間,分別是普通不使用gevent的爬 蟲(chóng),使用gevent但不用monkey patch的爬 蟲(chóng),以及使用gevent和monkey patch的爬 蟲(chóng)。

首先看普通不使用gevent的爬 蟲(chóng)。

先導(dǎo)入需要的庫(kù)。

然后讀取第二季度上映電影的頁(yè)面。

上述代碼中變量url就是第二季度上映電影的網(wǎng)頁(yè)地址,其頁(yè)面截圖如圖1所示。headers是爬蟲(chóng)模擬瀏覽器的頭部信息,每部電影的信息頁(yè)面就是圖1中表格頭一行列名Release下面每部電影名稱(chēng)所包含的網(wǎng)址,點(diǎn)擊每部電影名稱(chēng)就可進(jìn)入其對(duì)應(yīng)頁(yè)面。因?yàn)檫@個(gè)網(wǎng)址是相對(duì)地址,所以要轉(zhuǎn)換成絕對(duì)地址。

圖1. 第二季度上映電影的頁(yè)面

接下來(lái)是每部電影的信息頁(yè)面的讀取。

這個(gè)函數(shù)就是為了讀取每部電影信息頁(yè)面的信息,其功能和上面讀取url頁(yè)面的功能類(lèi)似,都非常簡(jiǎn)單,沒(méi)有過(guò)多可說(shuō)的。在每部電影頁(yè)面中,我們要讀取的每部電影的分級(jí)信息就在Genres這一行,比如圖2中電影The Wretched,其Genres信息就是Horror。

圖2. 示例電影信息頁(yè)面

接下來(lái)是時(shí)間測(cè)算。

我們測(cè)算時(shí)間用time.time()方法,用結(jié)束時(shí)間減去開(kāi)始時(shí)間就是程序運(yùn)行時(shí)間,這里我們主要測(cè)試spider這個(gè)函數(shù)多次運(yùn)行的時(shí)間。結(jié)果顯示,該過(guò)程耗時(shí)59.6188秒。

第二個(gè)爬蟲(chóng)是使用gevent但不用monkey patch的爬蟲(chóng)。其完整代碼如下。

這里絕大部分代碼和前面爬蟲(chóng)代碼相同,但多了一個(gè)task_list變量,其是用于存放協(xié)程的列表,我們從gevent_start = time.time()這行開(kāi)始看,因?yàn)榍懊娴拇a都和之前的爬蟲(chóng)相同。task = gevent.spawn(spider, u)是生成gevent中生成協(xié)程的方法,task_list.append(task)是把每個(gè)協(xié)程放入這個(gè)列表中,而gevent.joinall(task_list)就是運(yùn)行所有協(xié)程。上面這些過(guò)程和我們運(yùn)行多線(xiàn)程的方式非常相似。運(yùn)行結(jié)果是59.1744秒。

最后一個(gè)爬蟲(chóng)就是同時(shí)使用gevent和monkey patch的爬蟲(chóng),在這里筆者不再粘貼代碼,因?yàn)槠浯a和第二個(gè)爬蟲(chóng)幾乎一模一樣,只有一個(gè)區(qū)別,就是多了一行代碼from gevent import monkey; monkey.patch_all(),注意這是一行代碼,不過(guò)包含兩個(gè)語(yǔ)句,用分號(hào)放在了一起。最重要的是,這行代碼要放在所有代碼的前面,切記?。?!

這個(gè)爬蟲(chóng)的運(yùn)行結(jié)果是26.9184秒。

筆者把這里三個(gè)爬蟲(chóng)分別放在三個(gè)文件中,分別命名為normal_spider.py、gevent_spider_no.py和gevent_spider.py,分別表示普通不用gevent的爬蟲(chóng)、使用gevent但不用monkey patch的爬蟲(chóng)、使用gevent和monkey patch的爬蟲(chóng)。這里有一點(diǎn)要注意,monkey patch暫不支持jupyter notebook,所以這三個(gè)程序要在命令行中使用,不能在notebook中使用。

最后把三種爬蟲(chóng)的結(jié)果總結(jié)如下。

圖3. 三種爬蟲(chóng)的結(jié)果對(duì)比

可以看出使用了gevent但不用monkey patch的爬蟲(chóng)和普通爬蟲(chóng)的運(yùn)行時(shí)間幾乎完全相等,而在用了monkey patch以后,運(yùn)行時(shí)間只有前面程序的一半不到,速度提升了大約120%,僅僅一行代碼就帶來(lái)如此大的速度提升,可見(jiàn)monkey patch的作用還是很大的。而對(duì)于前兩個(gè)爬蟲(chóng)的速度幾乎完全一樣,筆者認(rèn)為原因在于這兩個(gè)程序都是單線(xiàn)程運(yùn)行,本質(zhì)上沒(méi)有太大區(qū)別,同時(shí)網(wǎng)頁(yè)讀取數(shù)量較?。ㄖ挥?8個(gè)網(wǎng)頁(yè)),也很難看出gevent的效果。

從本例中可以看出monkey patch還是有不小提升的,但gevent目前只對(duì)常見(jiàn)庫(kù)尤其是官方標(biāo)準(zhǔn)庫(kù)有patch作用,其他第三方庫(kù)的效果還不得而知,所以對(duì)monkey patch的使用還是要視情況而定。本文的代碼筆者放在gitee代碼網(wǎng)站上,網(wǎng)址是https://gitee.com/leonmovie/speed-up-gevent-spider-with-monkey-patch,如有需要可以自行下載。

【責(zé)任編輯:龐桂玉 TEL:(010)68476606】

聲明:免責(zé)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),也不承認(rèn)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,請(qǐng)發(fā)

送郵件至:operations@xinnet.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)

需注明出處:新網(wǎng)idc知識(shí)百科

免費(fèi)咨詢(xún)獲取折扣

Loading