摘要:網(wǎng)絡(luò)爬蟲是通過編寫程序模擬瀏覽器訪問服務(wù)器、獲取目標(biāo)數(shù)據(jù)的方法。在大數(shù)據(jù)環(huán)境下,爬蟲速度成為影響網(wǎng)絡(luò)爬蟲性能的重要評價條件之一。Python語言因其豐富的第三方庫,被廣泛應(yīng)用于網(wǎng)絡(luò)爬蟲及數(shù)據(jù)分析等場景。文章基于Python編程語言,以提高網(wǎng)絡(luò)爬蟲速度為目的,探討實現(xiàn)網(wǎng)絡(luò)爬蟲速度提升的方案,并以某網(wǎng)站智能圖片爬取為例實現(xiàn)多線程爬蟲系統(tǒng)。
關(guān)鍵詞:Python技術(shù);網(wǎng)絡(luò)爬蟲;大數(shù)據(jù);多線程
中圖分類號:TP18文獻(xiàn)標(biāo)志碼:A
0引言
以大數(shù)據(jù)、云計算、人工智能為代表的新一代信息技術(shù)的不斷發(fā)展,互聯(lián)網(wǎng)及各個系統(tǒng)平臺中存儲的海量數(shù)據(jù)成為推動經(jīng)濟發(fā)展的重要因素。同時,人們獲取分析數(shù)據(jù)的渠道和方法發(fā)生了根本性變革。傳統(tǒng)的人工收集數(shù)據(jù)方式需要花費巨大的時間和精力,使用網(wǎng)絡(luò)爬蟲技術(shù)可以更及時全面地獲取海量數(shù)據(jù),并實現(xiàn)數(shù)據(jù)的智能篩選和存儲。爬取速度是衡量用戶使用網(wǎng)絡(luò)爬蟲技術(shù)體驗的重要標(biāo)準(zhǔn)之一,傳統(tǒng)爬蟲速度慢,爬取質(zhì)量難以保證。因此,本文基于Python技術(shù),設(shè)計一種多線程爬蟲系統(tǒng),可以有效提升爬蟲速度,改善用戶使用網(wǎng)絡(luò)爬蟲技術(shù)的體驗。
1網(wǎng)絡(luò)爬蟲技術(shù)介紹
1.1網(wǎng)絡(luò)爬蟲技術(shù)簡介
網(wǎng)絡(luò)爬蟲是一段計算機代碼,是由開發(fā)者按照事先約定的規(guī)則編寫,能夠自動請求網(wǎng)站服務(wù)器數(shù)據(jù)并獲取目標(biāo)數(shù)據(jù)的程序。網(wǎng)絡(luò)爬蟲技術(shù)就是模擬人使用瀏覽器訪問互聯(lián)網(wǎng)資源,并收集服務(wù)器返回的數(shù)據(jù)。爬蟲技術(shù)經(jīng)過多年的發(fā)展,已經(jīng)在多個領(lǐng)域得到廣泛的應(yīng)用,主要包括:
(1)通用網(wǎng)絡(luò)爬蟲,其爬取的目標(biāo)是整個互聯(lián)網(wǎng)數(shù)據(jù),獲得的數(shù)據(jù)是海量的,主要用于搜索引擎領(lǐng)域,例如百度、Google等;
(2)聚焦網(wǎng)絡(luò)爬蟲,其爬取的目標(biāo)是某一個專題數(shù)據(jù),目標(biāo)和范圍都非常明確,主要用于某一特定主題的數(shù)據(jù)獲取,目前使用最為廣泛;
(3)增量式網(wǎng)絡(luò)爬蟲,當(dāng)網(wǎng)站更新內(nèi)容時,用戶啟動該爬蟲程序,獲取該網(wǎng)站最新的數(shù)據(jù),主要用于數(shù)據(jù)更新領(lǐng)域;
(4)深層次網(wǎng)絡(luò)爬蟲,相對于爬取靜態(tài)頁面,深層網(wǎng)絡(luò)爬蟲是指通過構(gòu)造Form爬取網(wǎng)站的動態(tài)頁面數(shù)據(jù),這些數(shù)據(jù)通常存儲在網(wǎng)站的后端數(shù)據(jù)庫中[1]。
一般而言,實際應(yīng)用由以上4種網(wǎng)絡(luò)爬蟲技術(shù)結(jié)合實現(xiàn)。
1.2基于Python的網(wǎng)絡(luò)爬蟲技術(shù)
Python是一種面向?qū)ο蟮母呒壋绦蛟O(shè)計語言,其語法簡潔易學(xué),并且擁有大量專為爬蟲開發(fā)及數(shù)據(jù)分析而設(shè)計的庫,如Requests、Lxml、Re、bs4、Scrapy等,這些庫簡化了爬蟲的開發(fā)過程,提高了開發(fā)效率[2]。
(1) Requests庫。Requests是Python的第三方庫,能夠提供網(wǎng)頁訪問以及源代碼獲取的功能。開發(fā)者可以采用Requests.get(URL)方法,獲取URL地址頁面的全部源代碼。
(2) Lxml庫。Lxml庫是使用Xpath技術(shù)提取網(wǎng)頁數(shù)據(jù)的第三方庫,可以在HTML樹狀結(jié)構(gòu)中尋找目標(biāo)節(jié)點,并獲取目標(biāo)數(shù)據(jù)。
(3) Re庫。Re庫是使用正則表達(dá)式獲取目標(biāo)數(shù)據(jù)的Python標(biāo)準(zhǔn)庫,其處理的對象是字符串,用于匹配、檢索符合某個模式的文本對象。
(4)BeatuifulSoup庫。BeatuifulSoup是一個從HTML或XML文件中提取數(shù)據(jù)的第三方庫,bs4是BeautifulSoup庫的最新版本。開發(fā)者可以選擇Lxml或Python標(biāo)準(zhǔn)庫作為解析器,實現(xiàn)網(wǎng)頁數(shù)據(jù)的查找、定位和修改。
(5) Scrapy框架技術(shù)。Scrapy是一種常用的爬蟲框架,分為項目整體配置文件、項目設(shè)置文件、爬蟲編寫文件3個部分。開發(fā)者只需要在具體流程模塊中進(jìn)行相關(guān)配置,就可以爬取網(wǎng)頁數(shù)據(jù),并實現(xiàn)爬取結(jié)果的保存。
1.3增強網(wǎng)絡(luò)爬蟲技術(shù)程序健壯性的方法
在互聯(lián)網(wǎng)數(shù)據(jù)采集中,網(wǎng)頁的結(jié)構(gòu)和內(nèi)容千變?nèi)f化,用戶有時也會遇到服務(wù)器拒絕請求等情況。為增強爬蟲程序健壯性,開發(fā)者需要結(jié)合網(wǎng)站的實際架構(gòu)逐一解決這些問題。
(1) headers模擬瀏覽器。網(wǎng)站為了攔截惡意抓取數(shù)據(jù)的行為,通常加入反爬蟲措施。服務(wù)器通過查看請求頭,判斷本次請求的發(fā)送者是真人還是爬蟲程序,如果判斷為爬蟲程序則會啟動反爬蟲機制。為了解決這個問題,開發(fā)者可以通過定制User-Agent請求頭,讓爬蟲程序模擬瀏覽器訪問[3]。具體方法如下:
headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'}
req=requests.get(url,headers=headers).content
(2) 設(shè)置程序休眠時間。開發(fā)者通過time.sleep()設(shè)置爬蟲程序休眠時間,降低訪問服務(wù)器的頻次,降低訪問被攔截的概率。
(3)設(shè)置代理服務(wù)器。爬蟲訪問頻率過高會被對方服務(wù)器要求暫停訪問,開發(fā)者可以通過設(shè)置代理服務(wù)器來解決這個問題。對方服務(wù)器無法獲取客戶端真實IP地址,也就無法采取反爬措施。
(4)驗證碼識別。多數(shù)網(wǎng)站為了辨別用戶是真人還是計算機程序,加入驗證碼等人機交互驗證功能。開發(fā)者可以采取pytesseract和Selenium等方法,實現(xiàn)文字、圖片驗證碼的識別。
2網(wǎng)絡(luò)爬蟲技術(shù)爬取速度的提升方案
2.1影響爬蟲爬取速度的主要因素
影響爬蟲爬取速度慢的主要因素在于網(wǎng)絡(luò)I/O操作,CPU的處理速度遠(yuǎn)高于網(wǎng)絡(luò)I/O操作速度。例如,網(wǎng)絡(luò)爬蟲正在執(zhí)行圖片下載任務(wù),這就是一個網(wǎng)絡(luò)I/O操作。由于下載操作遇到阻塞,CPU處于空轉(zhuǎn)狀態(tài),由此產(chǎn)生的延遲影響了網(wǎng)絡(luò)爬蟲技術(shù)工作效率。
2.2提升爬蟲速度的方案
針對上述因素,本文通過異步執(zhí)行任務(wù)的方式來解決爬蟲速度延遲的問題,即同時爬取多個頁面,每個賽道之間互不影響。異步爬取的方案如下。
(1)多線程爬蟲。使用多個線程同時抓取數(shù)據(jù),可實現(xiàn)程序的多任務(wù)執(zhí)行。隨著多核處理器在現(xiàn)代計算機設(shè)備中的流行,在軟件中使用多線程程序的頻率也隨之增加,多線程技術(shù)可有效提高程序的運行效率。但是多線程的模式需要不停地建立與關(guān)閉線程,依然會造成一定的資源浪費[4]。
(2)分布式爬蟲。多線程爬蟲程序運行在單臺計算機上,受到計算機性能的影響,遇到大體量數(shù)據(jù)仍需要花費很多時間。分布式爬蟲可以很好地解決這個問題,其通過搭建集群,在多臺計算機上同時運行一個爬蟲程序,完成采集任務(wù)。分布式爬蟲按照不同的通信方式可以分為主從模式、自治模式和混合模式[5]。
3多線程爬蟲系統(tǒng)設(shè)計實現(xiàn)
3.1系統(tǒng)模塊設(shè)計
本文使用Python技術(shù)實現(xiàn)對某網(wǎng)站圖片數(shù)據(jù)的多線程爬蟲系統(tǒng),主要功能模塊包括URL地址管理模塊、線程管理模塊以及數(shù)據(jù)獲取、解析和存儲模塊。各模塊主要功能如下。
(1)URL地址管理模塊。本模塊主要任務(wù)是管理和維護(hù)一個URL地址列表。
(2)線程管理模塊。本模塊按照URL地址列表對應(yīng)端口數(shù)量,設(shè)置多個爬蟲線程。
(3)數(shù)據(jù)獲取、解析和存儲模塊。本模塊是整個系統(tǒng)的核心部分,主要功能是爬取網(wǎng)頁源代碼并進(jìn)行解析,獲得目標(biāo)數(shù)據(jù),將目標(biāo)數(shù)據(jù)進(jìn)行本地化存儲。
3.2代碼實現(xiàn)
3.2.1網(wǎng)頁URL地址管理模塊的實現(xiàn)
開發(fā)者通過瀏覽器訪問某圖片網(wǎng)站,輸入查詢關(guān)鍵字,在開發(fā)者工具中查看Requests URL地址。分析URL代碼可知,word、queryWord、pn和rn分別代表關(guān)鍵詞、查詢關(guān)鍵詞、圖片數(shù)量、每頁圖片數(shù)量,其中pn=rn×(page_size+1)。編寫循環(huán)程序,獲得全部URL地址列表。核心代碼如下:
for i in range(page_size):
url=f'https://image.baidu.com/search/acjson?tn=resultjson_comamp;logid=6426048854354725441amp;ipn=rjamp;ct=201326592amp;is=amp;fp=resultamp;fr=amp;word={word}amp;cg=staramp;queryWord={word}amp;cl=2amp;…amp;pn={(i+1)*30}amp;rn=30amp;gsm=1eamp;1714648320531=’
urls.append(url)
3.2.2線程管理模塊的實現(xiàn)
本系統(tǒng)使用Python的Thread庫創(chuàng)建線程池管理器,線程池最大管理數(shù)量為URL地址列表數(shù)量。程序循環(huán)調(diào)用down_imgs()函數(shù),開始多線程爬蟲。核心代碼如下:
//創(chuàng)建連接池管理器,根據(jù)URL端口數(shù)量確定線程數(shù)
with ThreadPoolExecutor(max_workers=len(url)) as exe:
for url in urls:
//使用連接池管理器發(fā)起請求,調(diào)用函數(shù)實現(xiàn)多線程爬蟲
exe.submit(down_imgs(url))
3.2.3數(shù)據(jù)獲取、數(shù)據(jù)解析及數(shù)據(jù)存儲模塊的實現(xiàn)
本模塊實現(xiàn)爬蟲的核心功能,主要包括使用requests庫獲取網(wǎng)頁全部源代碼和解析json數(shù)據(jù)獲取目標(biāo)數(shù)據(jù)。核心代碼如下:
//使用requests庫的get()方法,獲取網(wǎng)頁數(shù)據(jù)
req=requests.get(url,headers=headers).json()
//解析json數(shù)據(jù),獲得目標(biāo)數(shù)據(jù),即圖片鏈接地址
for item in req[\"data\"]:
img_url=item.get(\"thumbURL\",\"\")
if img_url:
img_data=requests.get(img_url,headers=headers).content
//將圖片以文件的形式保存在本地文件夾中,其中文件名為不重復(fù)的隨機變量
file_name = uuid.uuid4()
with open(f'imges/{file_name}.jpg','wb') as file:
file.write(img_data)
3.3結(jié)論
通過編寫程序計算爬取速度,本文比較傳統(tǒng)單線程爬蟲與多線程爬蟲的耗時比。核心代碼如下:
//設(shè)置爬蟲開始和結(jié)束時間,計算爬蟲實際運行時長。
starttime = datetime.now()
endtime=datetime.now()
time=(endtime-starttime).seconds
print(\"本次爬取共使用:%d秒\"%time)
本文設(shè)定在相同的網(wǎng)絡(luò)環(huán)境和硬件配置下,爬蟲程序爬取圖片網(wǎng)站的相同內(nèi)容,分別設(shè)置采集頁數(shù)分別為10頁、30頁、50頁、100頁。查看爬蟲完成時間,結(jié)果如表1所示。當(dāng)爬取頁數(shù)為10頁時,采用傳統(tǒng)爬蟲模式所用的時間為39 s,采用多線程爬蟲模式完成任務(wù)所需的時間僅為5 s,耗時比為7.8∶1,爬取頁數(shù)為30頁和50頁的耗時比分別為7.12∶1和7.37∶1,但當(dāng)爬取頁數(shù)達(dá)到100頁時,耗時比優(yōu)勢減小為4.28∶1。
4結(jié)語
本文基于Python網(wǎng)絡(luò)爬蟲技術(shù),研究了提升爬蟲速度的多線程方案,并以爬取某網(wǎng)站圖片為例實現(xiàn)了多線程爬蟲系統(tǒng)。通過分析程序,結(jié)果表明多線程爬蟲在提升爬蟲速度方面比傳統(tǒng)爬蟲模式有較大優(yōu)勢。多線程爬蟲適合大量數(shù)據(jù)同時爬取,但仍要考慮計算機CPU核數(shù)等性能指標(biāo),否則會因頻繁進(jìn)行資源調(diào)度而影響整體效率。
參考文獻(xiàn)
[1]鐘機靈.基于Python網(wǎng)絡(luò)爬蟲技術(shù)的數(shù)據(jù)采集系統(tǒng)研究[J].信息通信,2020(4):96-98.
[2]楊健,陳偉.基于Python的三種網(wǎng)絡(luò)爬蟲技術(shù)研究[J].軟件工程,2023(2):24-27.
[3]沈冰,周亮,李娟,等.基于定制主題網(wǎng)絡(luò)爬蟲技術(shù)的不良信息檢測系統(tǒng)設(shè)計[J].電子技術(shù)與軟件工程,2022(5):5-8.
[4]黃子純,蔡敏.基于Java多線程的智能圖片爬蟲系統(tǒng)的研究與實現(xiàn)[J].電腦知識與技術(shù),2022(22):55-57.
[5]何西遠(yuǎn),張岳,張秉文.基于分布式爬蟲的微博輿情監(jiān)督與情感分析系統(tǒng)設(shè)計[J].現(xiàn)代信息科技,2024(5):111-114.
(編輯沈強編輯)
Research and implementation of multi-threaded Web crawler system based on Python
LIU" Ying
(Jinan Polytechnic Engineering, Jinan 250200, China)
Abstract: A Web crawler is a method of obtaining target data by programming to simulate a browser accessing a server. In the big data environment, the speed of Web crawler is one of the important evaluation criteria affecting the performance of Web crawler. The Python language is widely used in scenarios such as Web crawler and data analysis due to its rich third-party libraries. Based on the Python programming language, the solution to improve the speed of Web crawling is explored in this paper with the target of improving the speed of Web crawling. And taking the intelligent image crawling on a certain Website as an example, a multi-threaded crawling system is implemented.
Key words: Python technology; Web crawler; big data; multi-threading