翟普
摘要:隨著網(wǎng)絡(luò)技術(shù)的迅猛發(fā)展,網(wǎng)絡(luò)已經(jīng)成為信息的栽體,網(wǎng)絡(luò)隨處可見,打開網(wǎng)絡(luò),大量的信息充斥而來。如何有效提取并利用網(wǎng)絡(luò)中有價值的信息將會成為未來一個很大的挑戰(zhàn)。網(wǎng)絡(luò)爬蟲是一個可以自動提取網(wǎng)頁的程序,Zh.;b-維網(wǎng)上下栽網(wǎng)頁,提取信息。通常爬取的頁面比較多,如何快速有效地爬取頁面是關(guān)鍵,該文通過當(dāng)當(dāng)網(wǎng)新書暢銷排行榜實例來分析對比現(xiàn)有的四種方式,得出結(jié)果異步爬蟲和scrapy框架爬蟲速度最快。
關(guān)鍵詞:網(wǎng)絡(luò)爬蟲;異步爬蟲;scrapy框架爬蟲
中圖分類號:TP393 文獻標(biāo)識碼:A
文章編號:1009-3044(2020)01-0029-02
1什么是網(wǎng)絡(luò)爬蟲
搜索引擎,如baidu、google、yahoo、sougou等是人們通過網(wǎng)絡(luò)檢索信息的入口,但是這些搜索引擎存在著一定的局限性,它們大多是基于關(guān)鍵詞進行檢索,它們的目標(biāo)是盡可能大地覆蓋到網(wǎng)絡(luò),檢索出來的數(shù)據(jù)形式也多樣化,如:圖片、文字、音頻、視頻、數(shù)據(jù)庫等。但是,通常情況下不同背景的用戶檢索目的和需求有所差異,對搜索引擎返回的大量結(jié)果可能并不關(guān)心,對于一些信息含量密集并且具有一定結(jié)構(gòu)的數(shù)據(jù)不能很好地發(fā)現(xiàn)和利用。而搜索引擎也會基于服務(wù)器資源有限,而網(wǎng)絡(luò)資源無限產(chǎn)生資源之間的矛盾。
為了解決這些問題,網(wǎng)絡(luò)爬蟲隨之而誕生。網(wǎng)絡(luò)爬蟲實質(zhì)是一個程序,它可以自動地下載網(wǎng)頁,根據(jù)特定的需求,提取爬取網(wǎng)頁的某些內(nèi)容和信息,可以選擇性地從網(wǎng)絡(luò)上抓取相關(guān)網(wǎng)頁和鏈接,為面向主題的用戶提供數(shù)據(jù)資源。
一個網(wǎng)絡(luò)蜘蛛就是一種機器人,通常,網(wǎng)絡(luò)爬蟲首先會爬取一組url,一個url對應(yīng)一個頁面,然后對每一個頁面里面的url鏈接再進行反復(fù)爬取。爬蟲的基本流程為:
第一步:向要爬取的網(wǎng)頁服務(wù)器發(fā)出請求
通過request庫的get方法向目標(biāo)站點服務(wù)器發(fā)出請求,等待目標(biāo)服務(wù)器的響應(yīng);
第二步:獲得請求響應(yīng)的內(nèi)容
如果目標(biāo)站點服務(wù)器能夠正常響應(yīng),就會返回一個Re-sponse對象,該對象包含請求網(wǎng)頁的內(nèi)容;
第三步:解析網(wǎng)頁內(nèi)容
第二步得到的頁面內(nèi)容可能是HTML格式的,使用第三方頁面解析庫或者使用正則表達式進行解析;
第四步:處理網(wǎng)頁內(nèi)容
處理解析出的網(wǎng)頁內(nèi)容,提取重要的信息,進行保存或者格式化輸出。
2python與網(wǎng)絡(luò)爬蟲的聯(lián)系
2008年,自Android將移動操作系統(tǒng)開源以來,一批新的計算機技術(shù)和概念迅速涌現(xiàn),這些技術(shù)促使現(xiàn)有的計算機技術(shù)升級換代。這些概念包括云計算、移動互聯(lián)網(wǎng)、互聯(lián)網(wǎng)+、大數(shù)據(jù)、可穿戴計算等。這些概念讓計算的平臺和應(yīng)用變得更多樣化,同時不可避免也帶來了更復(fù)雜的安全問題。雖然概念很多,但是,在這個階段很難有哪個技術(shù)能夠獨領(lǐng)風(fēng)騷,面對復(fù)雜的功能性和緊迫的迭代周期,計算機需要更抽象級別的程序設(shè)計語言來表達可編程性,python語言稱為這個階段的主流編程語言。
由于python擁有豐富的網(wǎng)絡(luò)抓取模塊,對字符的處理也很靈活,書寫爬蟲很方便,并且擁有強大的爬蟲框架scrapy,所以經(jīng)常用python來寫爬蟲。今天我們通過研究幾種python爬蟲爬行策略,來分析每種策略的優(yōu)劣。
3python網(wǎng)絡(luò)爬蟲的幾種方法一以當(dāng)當(dāng)網(wǎng)新書暢銷排行榜為例
通過施加不同的策略,可以將Python網(wǎng)絡(luò)爬蟲的方法大致分為四種:同步爬取方法、并發(fā)爬取方法、異步爬取方法、scrapy框架爬取方法。下面通過具體介紹每種方法,來對四種方法進行對比分析。
3.1同步爬取方法
3.1.1方法簡介
該爬蟲方法是用requests+BeautifulSoup的方法。Requests庫是使用python語言編寫的HTTP庫,BeautifulSoup庫是一個靈活又方便的網(wǎng)頁解析庫,處理高效,支持多種解析器。利用它就不用編寫正則表達式也能方便的實現(xiàn)網(wǎng)頁信息的抓取,BeautifulSoup可以解析網(wǎng)頁代碼,根據(jù)用戶的需求獲取想要的內(nèi)容格式化輸出。
3.1.2運行結(jié)果
使用一般的同步方法,爬取25頁書籍,總共耗時大約為7.27s
3.2并發(fā)爬取方法
3.2.1方法簡介
該方法利用并發(fā)模塊concurrent.futures來實現(xiàn),該模塊使用多線程來加速同步爬取的方法,該模塊支持線程池和進程池,可以根據(jù)實際情況設(shè)置線程個數(shù),本文設(shè)置線程的個數(shù)為16個,因為線程設(shè)置越多,切換的開銷也會比較大。
關(guān)鍵代碼如下:
##利用并發(fā)模塊concurrent,futures爬取網(wǎng)頁
executor=ThreadPoolExecutor(max_workers=61)
##函數(shù)submit():parser為函數(shù)的名字,uds為傳入的參數(shù),可以有多個參數(shù)
book_tasks=[executor.submit(parser,urls)for url in urls]
##表示等前面所有的線程全部執(zhí)行完畢才會進行后面程序的執(zhí)行
wait(book_tasks,return_when=ALL_COMPLETED)
3.2.2運行結(jié)果
使用并發(fā)方式,耗時大約為7.79s,說明使用多線程,并不一定會加快爬蟲的速度。
3.3異步爬取方法
3.3.1方法簡介
使用第三方庫aiohttp可以進行異步處理http的請求,使用第三方庫asyncio可以進行時間異步10,異步10方法可以很好地提升網(wǎng)絡(luò)爬蟲的速度。這種爬取方法與同步方法的思路和處理方法基本一致,只是在處理HTTP請求時使用了aiohttp模塊以及在解析網(wǎng)頁時函數(shù)變成了協(xié)程(coroutine),再利用aysncio進行并發(fā)處理,這樣無疑能夠提升爬蟲的效率。
3.3.2運行結(jié)果
3.4scrapy框架爬取方法
Scrapy是用純Python實現(xiàn)一個為了爬取網(wǎng)站數(shù)據(jù)、提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架,只需要定制開發(fā)幾個模塊就可以輕松的實現(xiàn)一個爬蟲。具體步驟如下: