欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Python多線程爬蟲與常見搜索算法是什么

今天小編給大家分享一下Python多線程爬蟲與常見搜索算法是什么的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

在四平等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、做網(wǎng)站 網(wǎng)站設(shè)計制作定制網(wǎng)站設(shè)計,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,成都全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站制作,四平網(wǎng)站建設(shè)費(fèi)用合理。

Python多線程爬蟲與常見搜索算法是什么

多線程爬蟲

多線程的優(yōu)勢

在掌握了requests與正則表達(dá)式以后,就可以開始實(shí)戰(zhàn)爬取一些簡單的網(wǎng)址了。
但是,此時的爬蟲只有一個進(jìn)程、一個線程,因此稱為單線程爬蟲。單線程爬蟲每次只訪問一個頁面,不能充分利用計算機(jī)的網(wǎng)絡(luò)帶寬。一個頁面最多也就幾百KB,所以爬蟲在爬取一個頁面的時候,多出來的網(wǎng)速和從發(fā)起請求到得到源代碼中間的時間都被浪費(fèi)了。如果可以讓爬蟲同時訪問10個頁面,就相當(dāng)于爬取速度提高了10倍。為了達(dá)到這個目的,就需要使用多線程技術(shù)了。

Python這門語言,有一個全局解釋器鎖(Global Interpreter Lock, GIL)。這導(dǎo)致Python的多線程都是偽多線程,即本質(zhì)上還是一個線程,但是這個線程每個事情只做幾毫秒,幾毫秒以后就保存現(xiàn)場,換做其他事情,幾毫秒后再做其他事情,一輪之后回到第一件事上,恢復(fù)現(xiàn)場再做幾毫秒,繼續(xù)換……微觀上的單線程,在宏觀上就像同時在做幾件事。這種機(jī)制在I/O(Input/Output,輸入/輸出)密集型的操作上影響不大,但是在CPU計算密集型的操作上面,由于只能使用CPU的一個核,就會對性能產(chǎn)生非常大的影響。所以涉及計算密集型的程序,就需要使用多進(jìn)程,Python的多進(jìn)程不受GIL的影響。爬蟲屬于I/O密集型的程序,所以使用多線程可以大大提高爬取效率。

多進(jìn)程庫:multiprocessing

multiprocessing本身是Python的多進(jìn)程庫,用來處理與多進(jìn)程相關(guān)的操作。但是由于進(jìn)程與進(jìn)程之間不能直接共享內(nèi)存和堆棧資源,而且啟動新的進(jìn)程開銷也比線程大得多,因此使用多線程來爬取比使用多進(jìn)程有更多的優(yōu)勢。

multiprocessing下面有一個dummy模塊,它可以讓Python的線程使用multiprocessing的各種方法。
dummy下面有一個Pool類,它用來實(shí)現(xiàn)線程池。
這個線程池有一個map()方法,可以讓線程池里面的所有線程都“同時”執(zhí)行一個函數(shù)。

例如:
在學(xué)習(xí)了for循環(huán)后

for i in range(10):
	print(i*i)

這種寫法當(dāng)然可以得到結(jié)果,但是代碼是一個數(shù)一個數(shù)地計算,效率并不高。而如果使用多線程的技術(shù),讓代碼同時計算很多個數(shù)的平方,就需要使用multiprocessing.dummy來實(shí)現(xiàn):

多線程的使用范例:

from multiprocessing.dummy import Pooldef cal_pow(num):
    return num*num
pool=Pool(3)num=[x for x in range(10)]result=pool.map(cal_pow,num)print('{}'.format(result))

在上面的代碼中,先定義了一個函數(shù)用來計算平方,然后初始化了一個有3個線程的線程池。這3個線程負(fù)責(zé)計算10個數(shù)字的平方,誰先計算完手上的這個數(shù),誰就先取下一個數(shù)繼續(xù)計算,直到把所有的數(shù)字都計算完成為止。

在這個例子中,線程池的map()方法接收兩個參數(shù),第1個參數(shù)是函數(shù)名,第2個參數(shù)是一個列表。注意:第1個參數(shù)僅僅是函數(shù)的名字,是不能帶括號的。第2個參數(shù)是一個可迭代的對象,這個可迭代對象里面的每一個元素都會被函數(shù)clac_power2()接收來作為參數(shù)。除了列表以外,元組、集合或者字典都可以作為map()的第2個參數(shù)。

多線程爬蟲開發(fā)

由于爬蟲是I/O密集型的操作,特別是在請求網(wǎng)頁源代碼的時候,如果使用單線程來開發(fā),會浪費(fèi)大量的時間來等待網(wǎng)頁返回,所以把多線程技術(shù)應(yīng)用到爬蟲中,可以大大提高爬蟲的運(yùn)行效率。舉一個例子。洗衣機(jī)洗完衣服要50min,水壺?zé)?5min,背單詞要1h。如果先等著洗衣機(jī)洗衣服,衣服洗完了再燒水,水燒開了再背單詞,一共需要125min。

但是如果換一種方式,從整體上看,3件事情是可以同時運(yùn)行的,假設(shè)你突然分身出另外兩個人,其中一個人負(fù)責(zé)把衣服放進(jìn)洗衣機(jī)并等待洗衣機(jī)洗完,另一個人負(fù)責(zé)燒水并等待水燒開,而你自己只需要背單詞就可以了。等到水燒開,負(fù)責(zé)燒水的分身先消失。等到洗衣機(jī)洗完衣服,負(fù)責(zé)洗衣服的分身再消失。最后你自己本體背完單詞。只需要60min就可以同時完成3件事。

當(dāng)然,大家肯定會發(fā)現(xiàn)上面的例子并不是生活中的實(shí)際情況。現(xiàn)實(shí)中沒有人會分身。真實(shí)生活中的情況是,人背單詞的時候就專心背單詞;水燒開后,水壺會發(fā)出響聲提醒;衣服洗完了,洗衣機(jī)會發(fā)出“滴滴”的聲音。所以到提醒的時候再去做相應(yīng)的動作就好,沒有必要每分鐘都去檢查。上面的兩種差異,其實(shí)就是多線程和事件驅(qū)動的異步模型的差異。本小節(jié)講到的是多線程操作,后面會講到使用異步操作的爬蟲框架。現(xiàn)在只需要記住,在需要操作的動作數(shù)量不大的時候,這兩種方式的性能沒有什么區(qū)別,但是一旦動作的數(shù)量大量增長,多線程的效率提升就會下降,甚至比單線程還差。而到那個時候,只有異步操作才是解決問題的辦法。

下面通過兩段代碼來對比單線程爬蟲和多線程爬蟲爬取bd首頁的性能差異:Python多線程爬蟲與常見搜索算法是什么
從運(yùn)行結(jié)果可以看到,一個線程用時約16.2s,5個線程用時約3.5s,時間是單線程的五分之一左右。從時間上也可以看到5個線程“同時運(yùn)行”的效果。但并不是說線程池設(shè)置得越大越好。從上面的結(jié)果也可以看到,5個線程運(yùn)行的時間其實(shí)比一個線程運(yùn)行時間的五分之一要多一點(diǎn)。這多出來的一點(diǎn)其實(shí)就是線程切換的時間。這也從側(cè)面反映了Python的多線程在微觀上還是串行的。因此,如果線程池設(shè)置得過大,線程切換導(dǎo)致的開銷可能會抵消多線程帶來的性能提升。線程池的大小需要根據(jù)實(shí)際情況來確定,并沒有確切的數(shù)據(jù)。讀者可以在具體的應(yīng)用場景下設(shè)置不同的大小進(jìn)行測試對比,找到一個最合適的數(shù)據(jù)。

爬蟲的常見搜索算法

深度優(yōu)先搜索

某在線教育網(wǎng)站的課程分類,需要爬取上面的課程信息。從首頁開始,課程有幾個大的分類,比如根據(jù)語言分為Python、Node.js和Golang。每個大分類下面又有很多的課程,比如Python下面有爬蟲、Django和機(jī)器學(xué)習(xí)。每個課程又分為很多的課時。

在深度優(yōu)先搜索的情況下,爬取路線如圖所示(序號從小到大)
Python多線程爬蟲與常見搜索算法是什么

廣度優(yōu)先搜索

先后順序如下
Python多線程爬蟲與常見搜索算法是什么

算法選擇

例如要爬取某網(wǎng)站全國所有的餐館信息和每個餐館的訂單信息。假設(shè)使用深度優(yōu)先算法,那么先從某個鏈接爬到了餐館A,再立刻去爬餐館A的訂單信息。由于全國有十幾萬家餐館,全部爬完可能需要12小時。這樣導(dǎo)致的問題就是,餐館A的訂單量可能是早上8點(diǎn)爬到的,而餐館B是晚上8點(diǎn)爬到的。它們的訂單量差了12小時。而對于熱門餐館來說,12小時就有可能帶來幾百萬的收入差距。這樣在做數(shù)據(jù)分析時,12小時的時間差就會導(dǎo)致難以對比A和B兩個餐館的銷售業(yè)績。相對于訂單量來說,餐館的數(shù)量變化要小得多。所以如果采用廣度優(yōu)先搜索,先在半夜0點(diǎn)到第二天中午12點(diǎn)把所有的餐館都爬取一遍,第二天下午14點(diǎn)到20點(diǎn)再集中爬取每個餐館的訂單量。這樣做,只用了6個小時就完成了訂單爬取任務(wù),縮小了由時間差異致的訂單量差異。同時由于店鋪隔幾天抓一次影響也不大,所以請求量也減小了,使爬蟲更難被網(wǎng)站發(fā)現(xiàn)。

又例如,要分析實(shí)時輿情,需要爬百度貼吧。一個熱門的貼吧可能有幾萬頁的帖子,假設(shè)最早的帖子可追溯到2010年。如果采用廣度優(yōu)先搜索,則先把這個貼吧所有帖子的標(biāo)題和網(wǎng)址都獲取下來,然后根據(jù)這些網(wǎng)址進(jìn)入每個帖子里面以獲取每一層樓的信息。可是,既然是實(shí)時輿情,那么7年前的帖子對現(xiàn)在的分析意義不大,更重要的應(yīng)該是新的帖子才對,所以應(yīng)該優(yōu)先抓取新的內(nèi)容。相對于過往的內(nèi)容,實(shí)時的內(nèi)容才最為重要。因此,對于貼吧內(nèi)容的爬取,應(yīng)該采用深度優(yōu)先搜索。看到一個帖子就趕緊進(jìn)去,爬取它的每個樓層信息,一個帖子爬完了再爬下一個帖子。當(dāng)然,這兩種搜索算法并非非此即彼,需要根據(jù)實(shí)際情況靈活選擇,很多時候也能夠同時使用。

以上就是“Python多線程爬蟲與常見搜索算法是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁題目:Python多線程爬蟲與常見搜索算法是什么
瀏覽地址:http://www.chinadenli.net/article48/gepdhp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)定制開發(fā)品牌網(wǎng)站制作微信公眾號外貿(mào)建站靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)