日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Python并發(fā)爬蟲常用實現(xiàn)方法解析

瀏覽:25日期:2022-07-04 18:17:43

在進行單個爬蟲抓取的時候,我們不可能按照一次抓取一個url的方式進行網(wǎng)頁抓取,這樣效率低,也浪費了cpu的資源。目前python上面進行并發(fā)抓取的實現(xiàn)方式主要有以下幾種:進程,線程,協(xié)程。進程不在的討論范圍之內(nèi),一般來說,進程是用來開啟多個spider,比如我們開啟了4進程,同時派發(fā)4個spider進行網(wǎng)絡(luò)抓取,每個spider同時抓取4個url。

所以,我們今天討論的是,在單個爬蟲的情況下,盡可能的在同一個時間并發(fā)抓取,并且抓取的效率要高。

一.順序抓取

順序抓取是最最常見的抓取方式,一般初學(xué)爬蟲的朋友就是利用這種方式,下面是一個測試代碼,順序抓取8個url,我們可以來測試一下抓取完成需要多少時間:

HEADERS = {’Accept’: ’text/html,application/xhtml+xml,application/xml;q=0.9’, ’Accept-Language’: ’zh-CN,zh;q=0.8’, ’Accept-Encoding’: ’gzip, deflate’,} URLS = [’http://www.cnblogs.com/moodlxs/p/3248890.html’, ’https://www.zhihu.com/topic/19804387/newest’,’http://blog.csdn.net/yueguanghaidao/article/details/24281751’,’https://my.oschina.net/visualgui823/blog/36987’, ’http://blog.chinaunix.net/uid-9162199-id-4738168.html’, ’http://www.tuicool.com/articles/u67Bz26’, ’http://rfyiamcool.blog.51cto.com/1030776/1538367/’, ’http://itindex.net/detail/26512-flask-tornado-gevent’] #url為隨機獲取的一批url def func(): ''' 順序抓取 ''' import requestsimport time urls = URLS headers = HEADERS headers[’user-agent’] = 'Mozilla/5.0+(Windows+NT+6.2;+WOW64)+AppleWebKit/537' '.36+(KHTML,+like+Gecko)+Chrome/45.0.2454.101+Safari/537.36' print(u’順序抓取’)starttime= time.time() for url in urls: try: r = requests.get(url, allow_redirects=False, timeout=2.0, headers=headers)except: pass else: print(r.status_code, r.url) endtime=time.time() print(endtime-starttime) func()

我們直接采用內(nèi)建的time.time()來計時,較為粗略,但可以反映大概的情況。下面是順序抓取的結(jié)果計時:

Python并發(fā)爬蟲常用實現(xiàn)方法解析

可以從圖片中看到,顯示的順序與urls的順序是一模一樣的,總共耗時為7.763269901275635秒,一共8個url,平均抓取一個大概需要0.97秒。總體來看,還可以接受。

二.多線程抓取

線程是python內(nèi)的一種較為不錯的并發(fā)方式,我們也給出相應(yīng)的代碼,并且為每個url創(chuàng)建了一個線程,一共8線程并發(fā)抓取,下面的代碼:

下面是我們運行8線程的測試代碼:

HEADERS = {’Accept’: ’text/html,application/xhtml+xml,application/xml;q=0.9’, ’Accept-Language’: ’zh-CN,zh;q=0.8’, ’Accept-Encoding’: ’gzip, deflate’,} URLS = [’http://www.cnblogs.com/moodlxs/p/3248890.html’, ’https://www.zhihu.com/topic/19804387/newest’, ’http://blog.csdn.net/yueguanghaidao/article/details/24281751’, ’https://my.oschina.net/visualgui823/blog/36987’, ’http://blog.chinaunix.net/uid-9162199-id-4738168.html’, ’http://www.tuicool.com/articles/u67Bz26’, ’http://rfyiamcool.blog.51cto.com/1030776/1538367/’, ’http://itindex.net/detail/26512-flask-tornado-gevent’]def thread(): from threading import Threadimport requests import timeurls = URLSheaders = HEADERS headers[’user-agent’] = 'Mozilla/5.0+(Windows+NT+6.2;+WOW64)+AppleWebKit/537.36+' '(KHTML,+like+Gecko)+Chrome/45.0.2454.101+Safari/537.36' def get(url): try: r = requests.get(url, allow_redirects=False, timeout=2.0, headers=headers) except:pass else: print(r.status_code, r.url) print(u’多線程抓取’) ts = [Thread(target=get, args=(url,)) for url in urls] starttime= time.time() for t in ts: t.start() for t in ts: t.join()endtime=time.time() print(endtime-starttime)thread()

多線程抓住的時間如下:

Python并發(fā)爬蟲常用實現(xiàn)方法解析

可以看到相較于順序抓取,8線程的抓取效率明顯上升了3倍多,全部完成只消耗了2.154秒。可以看到顯示的結(jié)果已經(jīng)不是urls的順序了,說明每個url各自完成的時間都是不一樣的。線程就是在一個進程中不斷的切換,讓每個線程各自運行一會,這對于網(wǎng)絡(luò)io來說,性能是非常高的。但是線程之間的切換是挺浪費資源的。

三.gevent并發(fā)抓取

gevent是一種輕量級的協(xié)程,可用它來代替線程,而且,他是在一個線程中運行,機器資源的損耗比線程低很多。如果遇到了網(wǎng)絡(luò)io阻塞,會馬上切換到另一個程序中去運行,不斷的輪詢,來降低抓取的時間 下面是測試代碼:

HEADERS = {’Accept’: ’text/html,application/xhtml+xml,application/xml;q=0.9’, ’Accept-Language’: ’zh-CN,zh;q=0.8’, ’Accept-Encoding’: ’gzip, deflate’,}URLS = [’http://www.cnblogs.com/moodlxs/p/3248890.html’, ’https://www.zhihu.com/topic/19804387/newest’, ’http://blog.csdn.net/yueguanghaidao/article/details/24281751’, ’https://my.oschina.net/visualgui823/blog/36987’, ’http://blog.chinaunix.net/uid-9162199-id-4738168.html’, ’http://www.tuicool.com/articles/u67Bz26’, ’http://rfyiamcool.blog.51cto.com/1030776/1538367/’, ’http://itindex.net/detail/26512-flask-tornado-gevent’]def main(): ''' gevent并發(fā)抓取 ''' import requests import gevent import time headers = HEADERS headers[’user-agent’] = 'Mozilla/5.0+(Windows+NT+6.2;+WOW64)+AppleWebKit/537.36+' '(KHTML,+like+Gecko)+Chrome/45.0.2454.101+Safari/537.36' urls = URLS def get(url): try: r = requests.get(url, allow_redirects=False, timeout=2.0, headers=headers) except: pass else: print(r.status_code, r.url) print(u’基于gevent的并發(fā)抓取’) starttime= time.time() g = [gevent.spawn(get, url) for url in urls] gevent.joinall(g) endtime=time.time() print(endtime - starttime)main()

協(xié)程的抓取時間如下:

Python并發(fā)爬蟲常用實現(xiàn)方法解析

正常情況下,gevent的并發(fā)抓取與多線程的消耗時間差不了多少,但是可能是我網(wǎng)絡(luò)的原因,或者機器的性能的原因,時間有點長......,請各位小主在自己電腦進行跑一下看運行時間

四.基于tornado的coroutine并發(fā)抓取

tornado中的coroutine是python中真正意義上的協(xié)程,與python3中的asyncio幾乎是完全一樣的,而且兩者之間的future是可以相互轉(zhuǎn)換的,tornado中有與asyncio相兼容的接口。 下面是利用tornado中的coroutine進行并發(fā)抓取的代碼:

利用coroutine編寫并發(fā)略顯復(fù)雜,但這是推薦的寫法,如果你使用的是python3,強烈建議你使用coroutine來編寫并發(fā)抓取。

下面是測試代碼:

HEADERS = {’Accept’: ’text/html,application/xhtml+xml,application/xml;q=0.9’, ’Accept-Language’: ’zh-CN,zh;q=0.8’, ’Accept-Encoding’: ’gzip, deflate’,}URLS = [’http://www.cnblogs.com/moodlxs/p/3248890.html’, ’https://www.zhihu.com/topic/19804387/newest’, ’http://blog.csdn.net/yueguanghaidao/article/details/24281751’, ’https://my.oschina.net/visualgui823/blog/36987’, ’http://blog.chinaunix.net/uid-9162199-id-4738168.html’, ’http://www.tuicool.com/articles/u67Bz26’, ’http://rfyiamcool.blog.51cto.com/1030776/1538367/’, ’http://itindex.net/detail/26512-flask-tornado-gevent’]import timefrom tornado.gen import coroutinefrom tornado.ioloop import IOLoopfrom tornado.httpclient import AsyncHTTPClient, HTTPErrorfrom tornado.httpclient import HTTPRequest#urls與前面相同class MyClass(object): def __init__(self): #AsyncHTTPClient.configure('tornado.curl_httpclient.CurlAsyncHTTPClient') self.http = AsyncHTTPClient() @coroutine def get(self, url): #tornado會自動在請求首部帶上host首部 request = HTTPRequest(url=url, method=’GET’, headers=HEADERS, connect_timeout=2.0, request_timeout=2.0, follow_redirects=False, max_redirects=False, user_agent='Mozilla/5.0+(Windows+NT+6.2;+WOW64)+AppleWebKit/537.36+ (KHTML,+like+Gecko)+Chrome/45.0.2454.101+Safari/537.36',) yield self.http.fetch(request, callback=self.find, raise_error=False) def find(self, response): if response.error: print(response.error) print(response.code, response.effective_url, response.request_time)class Download(object): def __init__(self): self.a = MyClass() self.urls = URLS @coroutine def d(self): print(u’基于tornado的并發(fā)抓取’) starttime = time.time() yield [self.a.get(url) for url in self.urls] endtime=time.time() print(endtime-starttime)if __name__ == ’__main__’: dd = Download() loop = IOLoop.current() loop.run_sync(dd.d)

抓取的時間如下:

Python并發(fā)爬蟲常用實現(xiàn)方法解析

可以看到總共花費了128087秒,而這所花費的時間恰恰就是最后一個url抓取所需要的時間,tornado中自帶了查看每個請求的相應(yīng)時間。我們可以從圖中看到,最后一個url抓取總共花了1.28087秒,相較于其他時間大大的增加,這也是導(dǎo)致我們消耗時間過長的原因。那可以推斷出,前面的并發(fā)抓取,也在這個url上花費了較多的時間。

總結(jié):

以上測試其實非常的不嚴謹,因為我們選取的url的數(shù)量太少了,完全不能反映每一種抓取方式的優(yōu)劣。如果有一萬個不同的url同時抓取,那么記下總抓取時間,是可以得出一個較為客觀的結(jié)果的。

并且,已經(jīng)有人測試過,多線程抓取的效率是遠不如gevent的。所以,如果你使用的是python2,那么我推薦你使用gevent進行并發(fā)抓取;如果你使用的是python3,我推薦你使用tornado的http客戶端結(jié)合coroutine進行并發(fā)抓取。從上面的結(jié)果來看,tornado的coroutine是高于gevent的輕量級的協(xié)程的。但具體結(jié)果怎樣,我沒測試過。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品成人3p一区二区三区| 亚洲狼人精品一区二区三区| 蜜臀国产一区| 精品日产乱码久久久久久仙踪林| 日韩av中文字幕一区| 国产精品一区二区三区av| 噜噜噜躁狠狠躁狠狠精品视频| 韩日一区二区三区| 午夜欧美在线| 日韩精品一区二区三区中文字幕| 97精品一区| 欧美精品一卡| 国产精品一区高清| 视频一区中文字幕国产| 蜜桃av一区二区在线观看| 中文字幕免费精品| 国产精品一级| 91偷拍一区二区三区精品| 98精品久久久久久久| 久久中文字幕二区| 亚洲97av| 欧美日韩午夜| 国产传媒在线| 国产91精品对白在线播放| 日韩三区免费| 日韩欧美在线精品| 毛片在线网站| 亚洲国产欧美日本视频| 日韩影片在线观看| 成人午夜网址| 青草av.久久免费一区| 亚洲欧美日韩精品一区二区| av中文字幕在线观看第一页| 日韩中出av| 精品日本视频| 久久国产婷婷国产香蕉| 亚洲精品123区| 亚洲久草在线| 欧美日韩国产综合网| 国产精品三级| 日韩精品免费视频一区二区三区| 日韩国产网站| 福利片在线一区二区| 日韩一区二区三免费高清在线观看| 国产综合婷婷| 国产剧情在线观看一区| 国产一区二区三区天码| 福利视频一区| 国产欧美日韩视频在线| 精品1区2区3区4区| 欧美手机在线| 99久久99久久精品国产片果冰| 亚洲欧美日韩国产| 狠狠爱成人网| 日韩在线不卡| 成人国产精品久久| 国产视频一区二区在线播放| 欧美一级专区| 激情婷婷欧美| 日本高清不卡一区二区三区视频| 麻豆国产欧美一区二区三区 | 黑丝一区二区| 国产一区二区久久久久| 国产精品777777在线播放| 日韩激情一二三区| 蜜桃一区二区三区在线| 日韩精品视频一区二区三区| 午夜精品影视国产一区在线麻豆| 亚洲一区亚洲| 久久香蕉精品| 亚洲精品欧美| 国产乱人伦丫前精品视频 | 日本免费新一区视频| 日韩av中文字幕一区二区 | 中文无码日韩欧| 日韩天堂av| 日韩中文字幕一区二区高清99| 日本中文字幕一区二区视频| 影音先锋久久精品| 久久精品九色| 亚洲欧美综合| 亚洲五月综合| 久久尤物视频| 久久成人一区| 成人在线观看免费视频| 精品中国亚洲| 午夜av一区| 老司机精品视频在线播放| 欧美www视频在线观看| 在线一区电影| 精品一区视频| 亚洲精品精选| 欧美黄色一区二区| 电影天堂国产精品| 亚洲三级网站| 国产综合精品一区| 国产精品日韩精品中文字幕| 亚洲一区资源| 欧美日韩一区二区三区四区在线观看 | 亚洲性色av| 亚洲作爱视频| 日韩av一二三| 成人欧美一区二区三区的电影| 亚洲综合婷婷| 1024精品久久久久久久久| 国产精品亚洲综合色区韩国| 久久中文字幕av| 你懂的国产精品| 综合激情在线| 国内精品福利| 国产精品99精品一区二区三区∴| 91精品国产福利在线观看麻豆| 日韩一区二区三区在线看| 韩日一区二区三区| 日韩综合一区| 999精品在线| 精品亚洲二区| 国产专区精品| 久久尤物视频| 久久精品二区亚洲w码| 日韩中文字幕无砖| 综合一区二区三区| 99国产精品久久久久久久| 亚洲先锋成人| 日韩欧美一区二区三区在线观看| 精品一区视频| 欧美激情视频一区二区三区在线播放| 视频在线观看一区| 中文字幕一区二区精品区| 另类国产ts人妖高潮视频| 麻豆精品久久| 欧美天堂在线| 国产另类在线| 国产美女视频一区二区| 欧美一级二区| 亚久久调教视频| 日韩国产欧美在线视频| 亚洲综合另类| 综合激情视频| 亚洲精品观看| 国产麻豆精品| 久久久国产精品网站| 国产一区二区视频在线看| 国产精品伦理久久久久久| 激情中国色综合| 国产精品伦一区二区| 日韩欧美一区二区三区免费看| 韩国三级一区| 亚洲电影在线一区二区三区| 91精品精品| 四虎在线精品| 红杏一区二区三区| 日本精品不卡| 在线日韩成人| 久久美女性网| 日本欧美久久久久免费播放网| 91精品日本| 久久精品不卡| 日韩高清在线观看一区二区| 国产在视频一区二区三区吞精| 国产精品一区二区三区四区在线观看 | 久久精品一本| 欧美不卡高清| 丝袜亚洲另类欧美| 麻豆一区二区三区| 在线一区免费| 欧美精品国产一区| 一区二区三区四区在线看| 在线精品视频一区| 国产精久久久| 好看的av在线不卡观看| 精品国产a一区二区三区v免费| 麻豆精品91| 麻豆高清免费国产一区| 亚洲婷婷免费| 风间由美中文字幕在线看视频国产欧美| 亚洲精品97| 欧美日韩一二| 另类小说一区二区三区| 亚洲视频二区| 欧美~级网站不卡| 国产激情精品一区二区三区| 免费国产自线拍一欧美视频| 老牛国内精品亚洲成av人片| 日韩视频一区二区三区在线播放免费观看 | 久久久久97| 日本在线成人| 亚洲丝袜美腿一区| 丝袜诱惑制服诱惑色一区在线观看| 日本а中文在线天堂| 国产精品va视频| 日韩三级视频| 免费一区二区视频| 久久先锋影音| 一区在线免费观看| 亚洲午夜精品久久久久久app| 国产精品白浆| 精品三级在线观看视频| 成人影视亚洲图片在线| 国产精品宾馆|