精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何用一行代碼讓gevent爬蟲提速100%

開發 后端
用python做網絡開發的人估計都聽說過gevent這個庫,gevent是一個第三方的python協程庫,其是在微線程庫greenlet的基礎上構建而成,并且使用了epoll事件監聽機制,這讓gevent具有很好的性能并且比greenlet更好用。

 [[334247]]

用python做網絡開發的人估計都聽說過gevent這個庫,gevent是一個第三方的python協程庫,其是在微線程庫greenlet的基礎上構建而成,并且使用了epoll事件監聽機制,這讓gevent具有很好的性能并且比greenlet更好用。根據gevent官方的資料(網址:http://www.gevent.org),gevent具有以下特點:

  1.  基于libev或libuv的快速事件循環。
  2.  基于greenlet的輕量級執行單元。
  3.  重復使用Python標準庫中的概念的API(例如,有event和 queues)。
  4.  具有SSL支持的協作套接字
  5.  通過線程池,dnspython或c-ares執行的合作DNS查詢。
  6.  猴子修補實用程序,使第三方模塊能夠合作
  7.  TCP / UDP / HTTP服務器
  8.  子流程支持(通過gevent.subprocess)
  9.  線程池

筆者總結一下,gevent大致原理就是當一個greenlet遇到需要等待的操作時(多為IO操作),比如網絡IO/睡眠等待,這時就會自動切換到其他的greenlet,等上述操作完成后,再在適當的時候切換回來繼續執行。在這個過程中其實仍然只有一個線程在執行,但因為我們在等待某些IO操作時,切換到了其他操作,避免了無用的等待,這就為我們大大節省了時間,提高了效率。

筆者也是在看了gevent這么多的優點之后,感覺有必要上手試一試,但起初效果非常不理想,速度提升并不大,后來在仔細研究了gevent的用法之后,發現gevent的高效率是有條件的,而其中一個重要條件就是monkey patch的使用,也就是我們常說的猴子補丁。

monkey patch就是在不改變源代碼的情況下,對程序進行更改和優化,其主要適用于動態語言。通過monkey patch,gevent替換了標準庫里面大部分的阻塞式系統調用,比如socket、ssl、threading和select等,而變為協作式運行。下面筆者還是通過代碼來演示一下monkey patch的用法以及使用條件。筆者展示的這個程序是一個小型的爬蟲程序,程序代碼量少,便于閱讀和運行,同時也能較好地測試出monkey patch的提升程度。主要思路是從Box Office Mojo網站抓取北美電影市場今年第二季度上映的電影,然后從每部電影的信息頁面提取出每部電影的電影分級,然后把每部電影的名稱和其對應分級保存在一個字典當中,再測試一下整個過程的時間。在這里,我們主要測試三種情況下的程序完成時間,分別是普通不使用gevent的爬蟲,使用gevent但不用monkey patch的爬蟲,以及使用gevent和monkey patch的爬蟲。

首先看普通不使用gevent的爬蟲。

先導入需要的庫。 

  1. import time  
  2. import requests  
  3. from lxml import etree 

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

  1. url = r'https://www.boxofficemojo.com/quarter/q2/2020/?grossesOption=totalGrosses' #第二季度上映電影的網址  
  2. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'} #爬蟲頭部  
  3. rsp = requests.get(url, headersheaders=headers) #讀取網頁  
  4. text = rsp.text #獲取網頁源碼  
  5. html = etree.HTML(text)  
  6. movie_relative_urls =  html.xpath(r'//td[@class="a-text-left mojo-field-type-release mojo-cell-wide"]/a/@href') #獲取每部電影的信息頁面的相對地址  
  7. movie_urls = [r'https://www.boxofficemojo.com'+u for u in movie_relative_urls] #把每部電影的相對地址換成絕對地址  
  8. genres_dict = {} #用于保存信息的字典 

上述代碼中變量url就是第二季度上映電影的網頁地址,其頁面截圖如圖1所示。headers是爬蟲模擬瀏覽器的頭部信息,每部電影的信息頁面就是圖1中表格頭一行列名Release下面每部電影名稱所包含的網址,點擊每部電影名稱就可進入其對應頁面。因為這個網址是相對地址,所以要轉換成絕對地址。

圖1. 第二季度上映電影的頁面

接下來是每部電影的信息頁面的讀取。 

  1. def spider(url): #這個函數主要用于讀取每部電影頁面中的電影分級信息  
  2.     rsp = requests.get(url, headersheaders=headers) #讀取每部電影的網頁  
  3.     text = rsp.text #獲取頁面代碼  
  4.     html = etree.HTML(text)  
  5.     genre = html.xpath(r'//div/span[text()="Genres"]/following-sibling::span[1]/text()')[0] #讀取電影分級信息  
  6.     title = html.xpath(r'//div/h1/text()')[0] #讀取電影名稱  
  7. genres_dict[title] = genre #把每部電影的名稱和分級信息存入字典 

這個函數就是為了讀取每部電影信息頁面的信息,其功能和上面讀取url頁面的功能類似,都非常簡單,沒有過多可說的。在每部電影頁面中,我們要讀取的每部電影的分級信息就在Genres這一行,比如圖2中電影The Wretched,其Genres信息就是Horror。

圖2. 示例電影信息頁面

接下來是時間測算。 

  1. normal_start = time.time() #程序開始時間  
  2. for u in movie_urls:  
  3.     spider(u)  
  4. normal_end = time.time() #程序結束時間  
  5. normal_elapse = normal_end - normal_start #程序運行時間  
  6. print('The normal procedure costs %s seconds' % normal_elapse) 

我們測算時間用time.time()方法,用結束時間減去開始時間就是程序運行時間,這里我們主要測試spider這個函數多次運行的時間。結果顯示,該過程耗時59.6188秒。

第二個爬蟲是使用gevent但不用monkey patch的爬蟲。其完整代碼如下。 

  1. import time  
  2. from lxml import etree  
  3. import gevent  
  4. import requests  
  5. url = r'https://www.boxofficemojo.com/quarter/q2/2020/?grossesOption=totalGrosses'  
  6. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}  
  7. rsp = requests.get(url, headersheaders=headers)  
  8. text = rsp.text  
  9. html = etree.HTML(text)  
  10. movie_relative_urls =  html.xpath(r'//td[@class="a-text-left mojo-field-type-release mojo-cell-wide"]/a/@href')  
  11. movie_urls = [r'https://www.boxofficemojo.com'+u for u in movie_relative_urls]  
  12. genres_dict = {}  
  13. task_list = [] #用于存放協程的列表  
  14. def spider(url): 
  15.     rsp = requests.get(url, headersheaders=headers)  
  16.     text = rsp.text  
  17.     html = etree.HTML(text)  
  18.     genre = html.xpath(r'//div/span[text()="Genres"]/following-sibling::span[1]/text()')[0]  
  19.     title = html.xpath(r'//div/h1/text()')[0]  
  20.     genres_dict[title] = genre    
  21. gevent_start = time.time()  
  22. for u in movie_urls:  
  23.     task = gevent.spawn(spider, u) #生成協程  
  24.     task_list.append(task) #把協程放入這個列表    
  25. gevent.joinall(task_list) #運行所有協程  
  26. gevent_end = time.time() 
  27. gevent_elapse = gevent_end - gevent_start  
  28. print('The gevent spider costs %s seconds' % gevent_elapse) 

這里絕大部分代碼和前面爬蟲代碼相同,但多了一個task_list變量,其是用于存放協程的列表,我們從gevent_start = time.time()這行開始看,因為前面的代碼都和之前的爬蟲相同。task = gevent.spawn(spider, u)是生成gevent中生成協程的方法,task_list.append(task)是把每個協程放入這個列表中,而gevent.joinall(task_list)就是運行所有協程。上面這些過程和我們運行多線程的方式非常相似。運行結果是59.1744秒。

最后一個爬蟲就是同時使用gevent和monkey patch的爬蟲,在這里筆者不再粘貼代碼,因為其代碼和第二個爬蟲幾乎一模一樣,只有一個區別,就是多了一行代碼from gevent import monkey; monkey.patch_all(),注意這是一行代碼,不過包含兩個語句,用分號放在了一起。最重要的是,這行代碼要放在所有代碼的前面,切記!!!

這個爬蟲的運行結果是26.9184秒。

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

最后把三種爬蟲的結果總結如下。

圖3. 三種爬蟲的結果對比

可以看出使用了gevent但不用monkey patch的爬蟲和普通爬蟲的運行時間幾乎完全相等,而在用了monkey patch以后,運行時間只有前面程序的一半不到,速度提升了大約120%,僅僅一行代碼就帶來如此大的速度提升,可見monkey patch的作用還是很大的。而對于前兩個爬蟲的速度幾乎完全一樣,筆者認為原因在于這兩個程序都是單線程運行,本質上沒有太大區別,同時網頁讀取數量較小(只有18個網頁),也很難看出gevent的效果。

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

 

責任編輯:龐桂玉 來源: Python中文社區
相關推薦

2020-04-10 12:25:28

Python爬蟲代碼

2023-03-16 16:18:09

PyTorch程序人工智能

2018-09-19 15:46:51

編程語言Python編譯器

2016-12-02 08:53:18

Python一行代碼

2020-09-09 16:00:22

Linux進程

2022-02-23 14:37:48

代碼Pythonbug

2013-02-28 10:35:59

hadoop大數據Hortonworks

2022-08-14 15:07:59

代碼顯卡

2022-05-03 17:04:08

CSS前端

2015-03-20 14:51:09

Testin云測

2021-08-23 17:49:02

代碼開發模型

2021-06-11 14:15:55

代碼前端項目

2024-05-13 12:58:30

2021-09-13 10:43:12

開發CSS代碼

2023-08-14 07:42:01

模型訓練

2022-04-09 09:11:33

Python

2017-04-05 11:10:23

Javascript代碼前端

2014-02-12 13:43:50

代碼并行任務

2025-08-29 10:00:00

JavaScript瀏覽器API

2020-02-28 15:33:12

代碼人工智能檢測
點贊
收藏

51CTO技術棧公眾號

国内精品在线观看视频| 青草热久免费精品视频 | 黄大色黄女片18第一次| 欧洲美女少妇精品| 麻豆精品视频在线| 欧美高清视频在线播放| 欧美久久免费观看| 国产国语刺激对白av不卡| 蜜桃精品成人影片| 国产黄色一区| 亚洲九九爱视频| 麻豆91蜜桃| www.com亚洲| 国产精品久久久久蜜臀| 亚洲精品福利资源站| 8x8x最新地址| 毛片在线网址| 亚洲国产精品二十页| 91免费精品视频| 中日韩黄色大片| 91一区二区| 日韩精品免费在线播放| 一区二区三区 日韩| 国产极品人妖在线观看| 国产欧美日韩在线看| 98精品在线视频| 成人欧美一区二区三区黑人一| 精品久久国产一区| 欧美系列一区二区| 久久手机在线视频| 午夜视频成人| 97久久精品人人做人人爽| 成人免费大片黄在线播放| 日本最新中文字幕| 欧美一区影院| 伊人久久久久久久久久久| 亚洲麻豆一区二区三区| 亚洲ww精品| 亚洲天堂av一区| 亚洲一区二区三区免费观看| 丰满人妻av一区二区三区| 国产中文字幕精品| 日韩av男人的天堂| 人人草在线观看| 亚洲午夜伦理| 久久视频在线免费观看| 国产亚洲xxx| 国产96在线 | 亚洲| 日本在线观看网站| 久久这里都是精品| 国产精品久久亚洲7777| 国产精品日韩无码| 日本va欧美va欧美va精品| 97在线视频免费看| 欧美大片xxxx| 日韩精品2区| 亚洲午夜精品视频| jizz中文字幕| 四虎影视精品| 亚洲欧美另类国产| 亚洲综合自拍网| 午夜精品福利影院| www香蕉视频| 国产日本精品视频| 久久激五月天综合精品| 国产激情久久久| 中文字幕+乱码+中文| 国产美女诱惑一区二区| 欧美一区深夜视频| 天天操天天摸天天干| 欧美久久影院| 欧美成人午夜激情在线| 免费一级肉体全黄毛片| 欧美国产三级| 欧美第一页在线| 久久精品女人毛片国产| 日韩视频一区| 国产91在线播放精品91| 国产精彩视频在线观看| 亚洲免费激情| 97精品视频在线| 免费在线观看一级片| 国产精品99久久精品| 久久99久久亚洲国产| 激情小说中文字幕| 国产亚洲综合精品| 国产成人一区二区在线| 伊人久久婷婷色综合98网| 亚洲专区区免费| 欧美在线色图| www.99久久热国产日韩欧美.com| 白丝女仆被免费网站| 国产一区二区电影在线观看| 久久精品99久久香蕉国产色戒| 少妇按摩一区二区三区| 精品国产欧美日韩| 俺去亚洲欧洲欧美日韩| 亚洲国产综合久久| 午夜性色一区二区三区免费视频| 91sao在线观看国产| 真实国产乱子伦对白在线| 亚洲精品婷婷| 45www国产精品网站| 亚洲天天综合网| 久久99精品久久久| 激情小说综合网| 阿v免费在线观看| 亚洲一区二区影院| 国产v片免费观看| 免费v片在线观看| 婷婷亚洲久悠悠色悠在线播放| 天天影视综合色| 欧美黄视频在线观看| 国产亚洲一区二区精品| 黄免费在线观看| 韩日欧美一区| 国产精品国产自产拍高清av水多| 国产精品久久久久久久久毛片| 六月丁香婷婷久久| 精品欧美一区二区在线观看视频| 国产日本在线观看| 亚洲国产精品精华液网站| 国产成人手机视频| 九九热hot精品视频在线播放| 亚洲天堂成人在线| 在线观看亚洲天堂| 性xx色xx综合久久久xx| 亚洲自拍偷拍色片视频| 欧性猛交ⅹxxx乱大交| 中文字幕一区二区三区精华液| 综合久久国产| 在线免费观看国产精品| 多野结衣av一区| 亚洲国产欧美在线| 成人免费在线观看视频网站| 亚欧日韩另类中文欧美| 精品国产拍在线观看| 国产99久久久久久免费看| 福利一区二区在线| 成人在线观看毛片| 欧美日韩亚洲国产| 日韩欧美不卡一区| 蜜桃精品成人影片| 国产视频亚洲| 99精品国产一区二区| av大片在线播放| 亚洲一区二区三区不卡国产欧美| 亚洲天堂av线| 精品国内亚洲2022精品成人| 欧美大片在线看| 国产精品自产拍| 国产精品久久久久久久久免费相片 | 国产在线视频91| av中文天堂在线| 丁香五六月婷婷久久激情| 中文字幕一区三区久久女搜查官| 久久中文亚洲字幕| 国产色综合天天综合网| 欧美一级特黄aaaaaa| 亚洲大片在线观看| 麻豆传媒在线看| 亚洲经典视频在线观看| 91免费在线观看网站| 欧美家庭影院| 日韩欧美成人一区二区| 日本免费一二三区| 99久久精品免费看国产免费软件| 成人免费性视频| 日本精品在线播放 | 性欧美18~19sex高清播放| 精品电影一区二区三区| 日本道在线观看| 91日韩一区二区三区| 99久久久国产精品免费蜜臀| 中文字幕免费高| 国产免费不卡| 日韩成人在线播放| 日本a级c片免费看三区| 成人国产精品免费观看视频| 人妻久久久一区二区三区| 精品176极品一区| www.午夜精品| a在线观看免费| 亚洲午夜精品一区二区三区他趣| yjizz视频| 日精品一区二区| 亚洲电影一二三区| 一区二区中文字幕在线观看| 在线观看久久av| 国产免费视频一区二区三区| 亚洲欧洲av色图| 亚洲成人精品在线播放| 国产一区二区三区久久久久久久久 | 西西44rtwww国产精品| 99久久精品国产导航| 黑人粗进入欧美aaaaa| 97色伦图片97综合影院| 国产精品久久久久免费| 精品91久久| 欧美成年人视频| 天堂网av2014| 欧美久久久一区| 日韩av免费网址| 国产精品久久毛片| 91亚洲一区二区| 国产综合精品一区| 欧美h视频在线| 国产成人77亚洲精品www| 久久精品99国产精品酒店日本| 欧美性受xxx黑人xyx性爽| 亚洲青青青在线视频| 极品粉嫩小仙女高潮喷水久久| 久久99久久精品欧美| 东北少妇不带套对白| 欧美好骚综合网| 成人综合色站| 91国产精品| 欧美一级成年大片在线观看| 国产91久久久| 精品视频一区二区不卡| 国产一级在线免费观看| aaa国产一区| 国产精品av在线播放| 久久久精品人妻无码专区| 一区二区三区国产在线| 蜜臀av.com| 欧美日韩精品在线一区| 91久久久久久| 欧美成人毛片| 乱亲女秽乱长久久久| 成人在线免费电影| 精品国产3级a| 成人乱码一区二区三区| 91国偷自产一区二区三区成为亚洲经典 | 亚洲福利国产| 欧美精品一区二区三区四区五区 | 国产精品美女高潮无套| 国产乱子伦视频一区二区三区 | 裸体丰满少妇做受久久99精品| 这里视频有精品| 成人国产在线视频| 欧美成a人片免费观看久久五月天| 欧美亚洲第一页| av资源中文在线天堂| 在线观看国产精品91| 久久精品国产亚洲a∨麻豆| 天天综合天天综合色| 日本中文字幕网| 午夜一区二区三区在线观看| 久久久久久欧美精品se一二三四| 一区二区三区四区激情| 欧美激情 一区| 中文幕一区二区三区久久蜜桃| 欲求不满的岳中文字幕| 国产成人免费视频网站高清观看视频| 少妇人妻无码专区视频| 亚洲激情自拍| 欧美丰满熟妇bbbbbb百度| 成人影视亚洲图片在线| 日韩av电影免费在线观看| 色婷婷狠狠五月综合天色拍| 蜜桃传媒视频麻豆第一区免费观看 | 好男人www在线视频| 日韩一区二区在线免费观看| 国产ts人妖调教重口男| 五月婷婷综合激情| 成人免费毛片视频| 亚洲国产视频在线| 久久精品国产亚洲AV无码麻豆| 亚洲一区二区欧美日韩| 久久9999久久免费精品国产| 精品日本高清在线播放| 国产免费av一区二区| 在线免费视频一区二区| 超碰在线观看91| 欧美色视频在线| 91精品人妻一区二区三区果冻| 欧美一区在线视频| aaa一区二区三区| 欧美不卡一区二区三区| 天天干视频在线观看| 日韩国产在线看| 91在线直播| 久久久精品国产网站| av官网在线播放| www.欧美三级电影.com| 久久手机免费观看| 色七七影院综合| 午夜影院免费在线| 欧美成人免费全部| 18videosex性欧美麻豆| 久久久女女女女999久久| 91精品韩国| 成人福利视频在线观看| 欧美电影免费网站| 国产精品我不卡| 欧美猛男同性videos| 亚洲7777| 国产在线日韩| 国产一级片黄色| 美女一区二区视频| 亚洲欧美日韩色| 日韩美女久久久| 日本一区二区三区四区五区| 色婷婷综合久久| 亚洲手机在线观看| 日韩激情av在线播放| av大片在线观看| 国内精品久久久久伊人av| 欧美天堂一区| 国产日韩专区在线| 久久精品福利| 一本色道久久99精品综合| 午夜一级久久| 中文字幕第100页| 伊人久久大香线蕉综合网站| 国产一区二区三区在线观看网站| 日韩有码电影| 日韩天堂在线视频| 91在线超碰| 99re在线视频上| 精品国产视频| 成年人免费在线播放| 美国毛片一区二区| 免费看黄色aaaaaa 片| 亚洲综合无码一区二区| 超碰在线97观看| 亚洲欧洲中文天堂| 怡红院在线播放| 亚洲一区亚洲二区亚洲三区| 美女av一区| 男人添女人下部高潮视频在观看| 久久国产精品第一页| 日本黄色网址大全| 五月开心婷婷久久| 99久久免费国产精精品| 亚洲午夜av电影| 亚洲成a人片| 国产精品亚洲一区| 在线观看亚洲| 超碰人人cao| 一区二区三区欧美亚洲| 国产99久久久| 亚洲精品一区二区三区香蕉| av毛片在线免费| 成人久久久久久| 国产国产精品| 三上悠亚在线一区| 国产精品国产三级国产aⅴ中文| 日韩不卡高清视频| 亚洲天堂网在线观看| 新片速递亚洲合集欧美合集| 久久天天狠狠| 一区二区日韩免费看| 一起草在线视频| 亚洲一区国产视频| 亚洲av成人无码网天堂| 中文字幕亚洲综合久久| 精品久久99| 日本一区免费看| 蜜桃av一区二区| 一区二区三区影视| 欧美日韩国产中文精品字幕自在自线 | 亚洲xxx拳头交| 天堂在线资源视频| 国产拍欧美日韩视频二区| 中文字幕人妻互换av久久| 亚洲日本中文字幕| 欧美黄页免费| 中文字幕在线乱| 国产一区二区剧情av在线| 日本少妇aaa| 欧美一区二区三区视频免费 | 国产精品三级久久久久三级| 亚洲视频在线免费播放| 中文字幕亚洲字幕| 一区二区网站| 成人免费观看视频在线观看| 韩国v欧美v日本v亚洲v| 久热精品在线观看| 精品三级av在线| 欧美aa免费在线| 亚洲bt天天射| 一区二区影院| 亚洲最大成人网站| 欧日韩精品视频| 欧美videossex另类| 欧美不卡在线一区二区三区| 亚洲综合国产激情另类一区| 调教驯服丰满美艳麻麻在线视频 | 久久久久久亚洲精品| 亚洲一级大片| 中文字幕在线观看第三页| 久久久91精品国产一区二区精品 | 任你躁av一区二区三区| 欧美性xxxx极品高清hd直播| 黑人精品一区二区三区| 国产精品热视频| 久久久国产精品| 欧美图片第一页|