摘要:網(wǎng)絡(luò)爬蟲是通過編寫程序模擬瀏覽器訪問服務(wù)器、獲取目標(biāo)數(shù)據(jù)的方法。在大數(shù)據(jù)環(huán)境下,爬蟲速度成為影響網(wǎng)絡(luò)爬蟲性能的重要評(píng)價(jià)條件之一。Python語言因其豐富的第三方庫,被廣泛應(yīng)用于網(wǎng)絡(luò)爬蟲及數(shù)據(jù)分析等場(chǎng)景。文章基于Python編程語言,以提高網(wǎng)絡(luò)爬蟲速度為目的,探討實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲速度提升的方案,并以某網(wǎng)站智能圖片爬取為例實(shí)現(xiàn)多線程爬蟲系統(tǒng)。
關(guān)鍵詞:Python技術(shù);網(wǎng)絡(luò)爬蟲;大數(shù)據(jù);多線程
中圖分類號(hào):TP18文獻(xiàn)標(biāo)志碼:A
0引言
以大數(shù)據(jù)、云計(jì)算、人工智能為代表的新一代信息技術(shù)的不斷發(fā)展,互聯(lián)網(wǎng)及各個(gè)系統(tǒng)平臺(tái)中存儲(chǔ)的海量數(shù)據(jù)成為推動(dòng)經(jīng)濟(jì)發(fā)展的重要因素。同時(shí),人們獲取分析數(shù)據(jù)的渠道和方法發(fā)生了根本性變革。傳統(tǒng)的人工收集數(shù)據(jù)方式需要花費(fèi)巨大的時(shí)間和精力,使用網(wǎng)絡(luò)爬蟲技術(shù)可以更及時(shí)全面地獲取海量數(shù)據(jù),并實(shí)現(xiàn)數(shù)據(jù)的智能篩選和存儲(chǔ)。爬取速度是衡量用戶使用網(wǎng)絡(luò)爬蟲技術(shù)體驗(yàn)的重要標(biāo)準(zhǔn)之一,傳統(tǒng)爬蟲速度慢,爬取質(zhì)量難以保證。因此,本文基于Python技術(shù),設(shè)計(jì)一種多線程爬蟲系統(tǒng),可以有效提升爬蟲速度,改善用戶使用網(wǎng)絡(luò)爬蟲技術(shù)的體驗(yàn)。
1網(wǎng)絡(luò)爬蟲技術(shù)介紹
1.1網(wǎng)絡(luò)爬蟲技術(shù)簡(jiǎn)介
網(wǎng)絡(luò)爬蟲是一段計(jì)算機(jī)代碼,是由開發(fā)者按照事先約定的規(guī)則編寫,能夠自動(dòng)請(qǐng)求網(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)在多個(gè)領(lǐng)域得到廣泛的應(yīng)用,主要包括:
(1)通用網(wǎng)絡(luò)爬蟲,其爬取的目標(biāo)是整個(gè)互聯(lián)網(wǎng)數(shù)據(jù),獲得的數(shù)據(jù)是海量的,主要用于搜索引擎領(lǐng)域,例如百度、Google等;
(2)聚焦網(wǎng)絡(luò)爬蟲,其爬取的目標(biāo)是某一個(gè)專題數(shù)據(jù),目標(biāo)和范圍都非常明確,主要用于某一特定主題的數(shù)據(jù)獲取,目前使用最為廣泛;
(3)增量式網(wǎng)絡(luò)爬蟲,當(dāng)網(wǎng)站更新內(nèi)容時(shí),用戶啟動(dòng)該爬蟲程序,獲取該網(wǎng)站最新的數(shù)據(jù),主要用于數(shù)據(jù)更新領(lǐng)域;
(4)深層次網(wǎng)絡(luò)爬蟲,相對(duì)于爬取靜態(tài)頁面,深層網(wǎng)絡(luò)爬蟲是指通過構(gòu)造Form爬取網(wǎng)站的動(dòng)態(tài)頁面數(shù)據(jù),這些數(shù)據(jù)通常存儲(chǔ)在網(wǎng)站的后端數(shù)據(jù)庫中[1]。
一般而言,實(shí)際應(yīng)用由以上4種網(wǎng)絡(luò)爬蟲技術(shù)結(jié)合實(shí)現(xiàn)。
1.2基于Python的網(wǎng)絡(luò)爬蟲技術(shù)
Python是一種面向?qū)ο蟮母呒?jí)程序設(shè)計(jì)語言,其語法簡(jiǎn)潔易學(xué),并且擁有大量專為爬蟲開發(fā)及數(shù)據(jù)分析而設(shè)計(jì)的庫,如Requests、Lxml、Re、bs4、Scrapy等,這些庫簡(jiǎn)化了爬蟲的開發(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é)點(diǎn),并獲取目標(biāo)數(shù)據(jù)。
(3) Re庫。Re庫是使用正則表達(dá)式獲取目標(biāo)數(shù)據(jù)的Python標(biāo)準(zhǔn)庫,其處理的對(duì)象是字符串,用于匹配、檢索符合某個(gè)模式的文本對(duì)象。
(4)BeatuifulSoup庫。BeatuifulSoup是一個(gè)從HTML或XML文件中提取數(shù)據(jù)的第三方庫,bs4是BeautifulSoup庫的最新版本。開發(fā)者可以選擇Lxml或Python標(biāo)準(zhǔn)庫作為解析器,實(shí)現(xiàn)網(wǎng)頁數(shù)據(jù)的查找、定位和修改。
(5) Scrapy框架技術(shù)。Scrapy是一種常用的爬蟲框架,分為項(xiàng)目整體配置文件、項(xiàng)目設(shè)置文件、爬蟲編寫文件3個(gè)部分。開發(fā)者只需要在具體流程模塊中進(jìn)行相關(guān)配置,就可以爬取網(wǎng)頁數(shù)據(jù),并實(shí)現(xiàn)爬取結(jié)果的保存。
1.3增強(qiáng)網(wǎng)絡(luò)爬蟲技術(shù)程序健壯性的方法
在互聯(lián)網(wǎng)數(shù)據(jù)采集中,網(wǎng)頁的結(jié)構(gòu)和內(nèi)容千變?nèi)f化,用戶有時(shí)也會(huì)遇到服務(wù)器拒絕請(qǐng)求等情況。為增強(qiáng)爬蟲程序健壯性,開發(fā)者需要結(jié)合網(wǎng)站的實(shí)際架構(gòu)逐一解決這些問題。
(1) headers模擬瀏覽器。網(wǎng)站為了攔截惡意抓取數(shù)據(jù)的行為,通常加入反爬蟲措施。服務(wù)器通過查看請(qǐng)求頭,判斷本次請(qǐng)求的發(fā)送者是真人還是爬蟲程序,如果判斷為爬蟲程序則會(huì)啟動(dòng)反爬蟲機(jī)制。為了解決這個(gè)問題,開發(fā)者可以通過定制User-Agent請(qǐng)求頭,讓爬蟲程序模擬瀏覽器訪問[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è)置程序休眠時(shí)間。開發(fā)者通過time.sleep()設(shè)置爬蟲程序休眠時(shí)間,降低訪問服務(wù)器的頻次,降低訪問被攔截的概率。
(3)設(shè)置代理服務(wù)器。爬蟲訪問頻率過高會(huì)被對(duì)方服務(wù)器要求暫停訪問,開發(fā)者可以通過設(shè)置代理服務(wù)器來解決這個(gè)問題。對(duì)方服務(wù)器無法獲取客戶端真實(shí)IP地址,也就無法采取反爬措施。
(4)驗(yàn)證碼識(shí)別。多數(shù)網(wǎng)站為了辨別用戶是真人還是計(jì)算機(jī)程序,加入驗(yàn)證碼等人機(jī)交互驗(yàn)證功能。開發(fā)者可以采取pytesseract和Selenium等方法,實(shí)現(xiàn)文字、圖片驗(yàn)證碼的識(shí)別。
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ù),這就是一個(gè)網(wǎng)絡(luò)I/O操作。由于下載操作遇到阻塞,CPU處于空轉(zhuǎn)狀態(tài),由此產(chǎn)生的延遲影響了網(wǎng)絡(luò)爬蟲技術(shù)工作效率。
2.2提升爬蟲速度的方案
針對(duì)上述因素,本文通過異步執(zhí)行任務(wù)的方式來解決爬蟲速度延遲的問題,即同時(shí)爬取多個(gè)頁面,每個(gè)賽道之間互不影響。異步爬取的方案如下。
(1)多線程爬蟲。使用多個(gè)線程同時(shí)抓取數(shù)據(jù),可實(shí)現(xiàn)程序的多任務(wù)執(zhí)行。隨著多核處理器在現(xiàn)代計(jì)算機(jī)設(shè)備中的流行,在軟件中使用多線程程序的頻率也隨之增加,多線程技術(shù)可有效提高程序的運(yùn)行效率。但是多線程的模式需要不停地建立與關(guān)閉線程,依然會(huì)造成一定的資源浪費(fèi)[4]。
(2)分布式爬蟲。多線程爬蟲程序運(yùn)行在單臺(tái)計(jì)算機(jī)上,受到計(jì)算機(jī)性能的影響,遇到大體量數(shù)據(jù)仍需要花費(fèi)很多時(shí)間。分布式爬蟲可以很好地解決這個(gè)問題,其通過搭建集群,在多臺(tái)計(jì)算機(jī)上同時(shí)運(yùn)行一個(gè)爬蟲程序,完成采集任務(wù)。分布式爬蟲按照不同的通信方式可以分為主從模式、自治模式和混合模式[5]。
3多線程爬蟲系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)
3.1系統(tǒng)模塊設(shè)計(jì)
本文使用Python技術(shù)實(shí)現(xiàn)對(duì)某網(wǎng)站圖片數(shù)據(jù)的多線程爬蟲系統(tǒng),主要功能模塊包括URL地址管理模塊、線程管理模塊以及數(shù)據(jù)獲取、解析和存儲(chǔ)模塊。各模塊主要功能如下。
(1)URL地址管理模塊。本模塊主要任務(wù)是管理和維護(hù)一個(gè)URL地址列表。
(2)線程管理模塊。本模塊按照URL地址列表對(duì)應(yīng)端口數(shù)量,設(shè)置多個(gè)爬蟲線程。
(3)數(shù)據(jù)獲取、解析和存儲(chǔ)模塊。本模塊是整個(gè)系統(tǒng)的核心部分,主要功能是爬取網(wǎng)頁源代碼并進(jìn)行解析,獲得目標(biāo)數(shù)據(jù),將目標(biāo)數(shù)據(jù)進(jìn)行本地化存儲(chǔ)。
3.2代碼實(shí)現(xiàn)
3.2.1網(wǎng)頁URL地址管理模塊的實(shí)現(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線程管理模塊的實(shí)現(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ā)起請(qǐng)求,調(diào)用函數(shù)實(shí)現(xiàn)多線程爬蟲
exe.submit(down_imgs(url))
3.2.3數(shù)據(jù)獲取、數(shù)據(jù)解析及數(shù)據(jù)存儲(chǔ)模塊的實(shí)現(xiàn)
本模塊實(shí)現(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ù)的隨機(jī)變量
file_name = uuid.uuid4()
with open(f'imges/{file_name}.jpg','wb') as file:
file.write(img_data)
3.3結(jié)論
通過編寫程序計(jì)算爬取速度,本文比較傳統(tǒng)單線程爬蟲與多線程爬蟲的耗時(shí)比。核心代碼如下:
//設(shè)置爬蟲開始和結(jié)束時(shí)間,計(jì)算爬蟲實(shí)際運(yùn)行時(shí)長(zhǎng)。
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頁。查看爬蟲完成時(shí)間,結(jié)果如表1所示。當(dāng)爬取頁數(shù)為10頁時(shí),采用傳統(tǒng)爬蟲模式所用的時(shí)間為39 s,采用多線程爬蟲模式完成任務(wù)所需的時(shí)間僅為5 s,耗時(shí)比為7.8∶1,爬取頁數(shù)為30頁和50頁的耗時(shí)比分別為7.12∶1和7.37∶1,但當(dāng)爬取頁數(shù)達(dá)到100頁時(shí),耗時(shí)比優(yōu)勢(shì)減小為4.28∶1。
4結(jié)語
本文基于Python網(wǎng)絡(luò)爬蟲技術(shù),研究了提升爬蟲速度的多線程方案,并以爬取某網(wǎng)站圖片為例實(shí)現(xiàn)了多線程爬蟲系統(tǒng)。通過分析程序,結(jié)果表明多線程爬蟲在提升爬蟲速度方面比傳統(tǒng)爬蟲模式有較大優(yōu)勢(shì)。多線程爬蟲適合大量數(shù)據(jù)同時(shí)爬取,但仍要考慮計(jì)算機(jī)CPU核數(shù)等性能指標(biāo),否則會(huì)因頻繁進(jìn)行資源調(diào)度而影響整體效率。
參考文獻(xiàn)
[1]鐘機(jī)靈.基于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ù)的不良信息檢測(cè)系統(tǒng)設(shè)計(jì)[J].電子技術(shù)與軟件工程,2022(5):5-8.
[4]黃子純,蔡敏.基于Java多線程的智能圖片爬蟲系統(tǒng)的研究與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2022(22):55-57.
[5]何西遠(yuǎn),張?jiān)溃瑥埍?基于分布式爬蟲的微博輿情監(jiān)督與情感分析系統(tǒng)設(shè)計(jì)[J].現(xiàn)代信息科技,2024(5):111-114.
(編輯沈強(qiáng)編輯)
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