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

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

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

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

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

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

一.順序抓取

順序抓取是最最常見(jiàn)的抓取方式,一般初學(xué)爬蟲(chóng)的朋友就是利用這種方式,下面是一個(gè)測(cè)試代碼,順序抓取8個(gè)url,我們可以來(lái)測(cè)試一下抓取完成需要多少時(shí)間:

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為隨機(jī)獲取的一批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()來(lái)計(jì)時(shí),較為粗略,但可以反映大概的情況。下面是順序抓取的結(jié)果計(jì)時(shí):

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

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

二.多線程抓取

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

下面是我們運(yùn)行8線程的測(cè)試代碼:

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()

多線程抓住的時(shí)間如下:

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

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

三.gevent并發(fā)抓取

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

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é)程的抓取時(shí)間如下:

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

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

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

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

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

下面是測(cè)試代碼:

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會(huì)自動(dòng)在請(qǐng)求首部帶上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)

抓取的時(shí)間如下:

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

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

總結(jié):

以上測(cè)試其實(shí)非常的不嚴(yán)謹(jǐn),因?yàn)槲覀冞x取的url的數(shù)量太少了,完全不能反映每一種抓取方式的優(yōu)劣。如果有一萬(wàn)個(gè)不同的url同時(shí)抓取,那么記下總抓取時(shí)間,是可以得出一個(gè)較為客觀的結(jié)果的。

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

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

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久97视频| 国产精品1luya在线播放| 日本午夜精品视频在线观看| аⅴ资源天堂资源库在线| 日本在线一区二区三区| 亚洲精品国产偷自在线观看| 国产精品久久久久久久久久10秀 | 精品一区电影| 亚洲aa在线| 亚洲不卡视频| 亚洲区国产区| 蜜桃一区二区三区在线| 国产精品日本| 男女精品网站| 美女91精品| 天堂成人国产精品一区| 麻豆久久精品| 亚洲免费网址| 日本大胆欧美人术艺术动态| 国产精品免费看| 日韩欧美一区二区三区在线视频| 在线看片福利| 久久久久欧美精品| 久久国产小视频| 久久中文亚洲字幕| 蜜臀av免费一区二区三区| 99精品视频在线| 狠狠久久婷婷| 中文字幕日韩高清在线| 精品国产亚洲一区二区在线观看| 欧美+日本+国产+在线a∨观看| 日本免费在线视频不卡一不卡二| 欧美男人天堂| 欧美在线91| 久久在线电影| 亚洲午夜久久| 久久精选视频| 国产精品115| 欧美在线亚洲综合一区| 日韩av不卡在线观看| 久久精品国内一区二区三区水蜜桃| 日韩和的一区二在线| 久久国内精品| 日韩在线观看一区二区三区| 欧美日韩午夜电影网| 婷婷色综合网| 婷婷五月色综合香五月| 亚洲少妇诱惑| 国产一区日韩欧美| 欧美亚洲日本精品| 精品久久亚洲| 久久精品 人人爱| 日韩精品乱码av一区二区| 国产精品女主播一区二区三区| 四虎884aa成人精品最新| 97国产精品| 日韩综合在线| 精品国产午夜肉伦伦影院| 国产精品尤物| 国产精品二区影院| 欧美成人精品一级| 国产精品a级| 久久精品91| 99久久视频| 亚洲第一精品影视| 成人在线免费观看网站| 久久精品三级| 老牛影视精品| 日韩在线综合| 久久久噜噜噜| 99久久99久久精品国产片果冰| 国产超碰精品| 免费视频一区三区| 国产精品老牛| 日本成人手机在线| 国产精品亚洲一区二区在线观看| 国产欧美精品| 国产日韩在线观看视频| 欧美日一区二区三区在线观看国产免| 国产精品最新| 国产无遮挡裸体免费久久| 国产精品色婷婷在线观看| 你懂的亚洲视频| 岛国av免费在线观看| 国产精品久久久免费| 精品国产第一福利网站| 欧洲激情综合| 日本电影久久久| 日韩美女一区二区三区在线观看| 91精品久久久久久久久久不卡| 一区久久精品| 日本视频在线一区| 国产精品白浆| 日韩欧美中文在线观看| 国产毛片一区二区三区| 国产日韩在线观看视频| 麻豆国产精品视频| 激情丁香综合| 日本aⅴ亚洲精品中文乱码 | 日韩av资源网| 日韩精品社区| 久热精品在线| 欧美激情99| 日韩成人亚洲| 日韩影片在线观看| 欧美国产美女| 日韩影院在线观看| 国产精品久久| 国产成人免费| 国产女优一区| 国产伦乱精品| 欧美精品羞羞答答| 日韩av一级片| 婷婷成人在线| 欧美日本三区| 国产伦精品一区二区三区视频| 免费美女久久99| 久久av影视| 亚洲一区二区三区高清不卡| 日本午夜精品久久久| 日韩毛片视频| 日韩不卡免费视频| 国产99精品一区| 日韩制服丝袜av| 国内精品伊人| 亚洲日本在线观看视频| 日韩在线看片| 欧美男人天堂| 国产乱码精品一区二区三区亚洲人| 亚洲一级少妇| 欧美日本精品| 久久aⅴ国产紧身牛仔裤| 不卡在线一区二区| 美女尤物久久精品| 97精品一区| 日产欧产美韩系列久久99| 欧美羞羞视频| 日韩精选在线| 亚洲美女久久精品| 欧美日韩网址| 亚洲人成网站在线在线观看| 久久一区二区三区喷水| 久久只有精品| 视频一区中文字幕精品| 蜜桃一区二区三区| 黄色欧美在线| 欧美一区=区三区| 亚洲一区国产| 日韩精品久久久久久| 一区在线视频观看| 日韩高清中文字幕一区二区| 欧美国产日本| 天海翼亚洲一区二区三区| 国产一区日韩| 国产欧美69| 婷婷成人av| 日本大胆欧美人术艺术动态| 日韩精品久久久久久久电影99爱| 欧美激情99| 亚洲三级网址| а√天堂8资源在线| 久久激情av| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲高清不卡| 日本久久成人网| 日韩成人高清| 蜜桃av在线播放| 特黄毛片在线观看| 日韩一二三区在线观看| 亚洲毛片网站| 免费成人av在线播放| 91久久中文| 亚洲一区二区三区免费在线观看| 亚洲高清不卡| 亚洲精品激情| 日韩国产欧美在线视频| 少妇精品久久久一区二区| 深夜视频一区二区| 老司机精品久久| 老牛国产精品一区的观看方式| 国产精品美女久久久浪潮软件| 亚洲欧美日韩高清在线| 亚洲一卡久久| 99视频精品全国免费| 国产99精品| 好看不卡的中文字幕| 亚洲综合日本| 免费成人在线视频观看| 日韩中文欧美在线| 精品午夜久久| 久久精品九色| 久久只有精品| 欧美日韩视频网站| 婷婷综合在线| 蜜桃视频在线观看一区| 亚洲精品乱码| 国产精品久久久久久久久久久久久久久 | 日韩精品亚洲专区| 日韩精品免费一区二区夜夜嗨| 日本免费在线视频不卡一不卡二|