
摘要:網絡爬蟲是通過編寫程序模擬瀏覽器訪問服務器、獲取目標數據的方法。在大數據環境下,爬蟲速度成為影響網絡爬蟲性能的重要評價條件之一。Python語言因其豐富的第三方庫,被廣泛應用于網絡爬蟲及數據分析等場景。文章基于Python編程語言,以提高網絡爬蟲速度為目的,探討實現網絡爬蟲速度提升的方案,并以某網站智能圖片爬取為例實現多線程爬蟲系統。
關鍵詞:Python技術;網絡爬蟲;大數據;多線程
中圖分類號:TP18文獻標志碼:A
0引言
以大數據、云計算、人工智能為代表的新一代信息技術的不斷發展,互聯網及各個系統平臺中存儲的海量數據成為推動經濟發展的重要因素。同時,人們獲取分析數據的渠道和方法發生了根本性變革。傳統的人工收集數據方式需要花費巨大的時間和精力,使用網絡爬蟲技術可以更及時全面地獲取海量數據,并實現數據的智能篩選和存儲。爬取速度是衡量用戶使用網絡爬蟲技術體驗的重要標準之一,傳統爬蟲速度慢,爬取質量難以保證。因此,本文基于Python技術,設計一種多線程爬蟲系統,可以有效提升爬蟲速度,改善用戶使用網絡爬蟲技術的體驗。
1網絡爬蟲技術介紹
1.1網絡爬蟲技術簡介
網絡爬蟲是一段計算機代碼,是由開發者按照事先約定的規則編寫,能夠自動請求網站服務器數據并獲取目標數據的程序。網絡爬蟲技術就是模擬人使用瀏覽器訪問互聯網資源,并收集服務器返回的數據。爬蟲技術經過多年的發展,已經在多個領域得到廣泛的應用,主要包括:
(1)通用網絡爬蟲,其爬取的目標是整個互聯網數據,獲得的數據是海量的,主要用于搜索引擎領域,例如百度、Google等;
(2)聚焦網絡爬蟲,其爬取的目標是某一個專題數據,目標和范圍都非常明確,主要用于某一特定主題的數據獲取,目前使用最為廣泛;
(3)增量式網絡爬蟲,當網站更新內容時,用戶啟動該爬蟲程序,獲取該網站最新的數據,主要用于數據更新領域;
(4)深層次網絡爬蟲,相對于爬取靜態頁面,深層網絡爬蟲是指通過構造Form爬取網站的動態頁面數據,這些數據通常存儲在網站的后端數據庫中[1]。
一般而言,實際應用由以上4種網絡爬蟲技術結合實現。
1.2基于Python的網絡爬蟲技術
Python是一種面向對象的高級程序設計語言,其語法簡潔易學,并且擁有大量專為爬蟲開發及數據分析而設計的庫,如Requests、Lxml、Re、bs4、Scrapy等,這些庫簡化了爬蟲的開發過程,提高了開發效率[2]。
(1) Requests庫。Requests是Python的第三方庫,能夠提供網頁訪問以及源代碼獲取的功能。開發者可以采用Requests.get(URL)方法,獲取URL地址頁面的全部源代碼。
(2) Lxml庫。Lxml庫是使用Xpath技術提取網頁數據的第三方庫,可以在HTML樹狀結構中尋找目標節點,并獲取目標數據。
(3) Re庫。Re庫是使用正則表達式獲取目標數據的Python標準庫,其處理的對象是字符串,用于匹配、檢索符合某個模式的文本對象。
(4)BeatuifulSoup庫。BeatuifulSoup是一個從HTML或XML文件中提取數據的第三方庫,bs4是BeautifulSoup庫的最新版本。開發者可以選擇Lxml或Python標準庫作為解析器,實現網頁數據的查找、定位和修改。
(5) Scrapy框架技術。Scrapy是一種常用的爬蟲框架,分為項目整體配置文件、項目設置文件、爬蟲編寫文件3個部分。開發者只需要在具體流程模塊中進行相關配置,就可以爬取網頁數據,并實現爬取結果的保存。
1.3增強網絡爬蟲技術程序健壯性的方法
在互聯網數據采集中,網頁的結構和內容千變萬化,用戶有時也會遇到服務器拒絕請求等情況。為增強爬蟲程序健壯性,開發者需要結合網站的實際架構逐一解決這些問題。
(1) headers模擬瀏覽器。網站為了攔截惡意抓取數據的行為,通常加入反爬蟲措施。服務器通過查看請求頭,判斷本次請求的發送者是真人還是爬蟲程序,如果判斷為爬蟲程序則會啟動反爬蟲機制。為了解決這個問題,開發者可以通過定制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) 設置程序休眠時間。開發者通過time.sleep()設置爬蟲程序休眠時間,降低訪問服務器的頻次,降低訪問被攔截的概率。
(3)設置代理服務器。爬蟲訪問頻率過高會被對方服務器要求暫停訪問,開發者可以通過設置代理服務器來解決這個問題。對方服務器無法獲取客戶端真實IP地址,也就無法采取反爬措施。
(4)驗證碼識別。多數網站為了辨別用戶是真人還是計算機程序,加入驗證碼等人機交互驗證功能。開發者可以采取pytesseract和Selenium等方法,實現文字、圖片驗證碼的識別。
2網絡爬蟲技術爬取速度的提升方案
2.1影響爬蟲爬取速度的主要因素
影響爬蟲爬取速度慢的主要因素在于網絡I/O操作,CPU的處理速度遠高于網絡I/O操作速度。例如,網絡爬蟲正在執行圖片下載任務,這就是一個網絡I/O操作。由于下載操作遇到阻塞,CPU處于空轉狀態,由此產生的延遲影響了網絡爬蟲技術工作效率。
2.2提升爬蟲速度的方案
針對上述因素,本文通過異步執行任務的方式來解決爬蟲速度延遲的問題,即同時爬取多個頁面,每個賽道之間互不影響。異步爬取的方案如下。
(1)多線程爬蟲。使用多個線程同時抓取數據,可實現程序的多任務執行。隨著多核處理器在現代計算機設備中的流行,在軟件中使用多線程程序的頻率也隨之增加,多線程技術可有效提高程序的運行效率。但是多線程的模式需要不停地建立與關閉線程,依然會造成一定的資源浪費[4]。
(2)分布式爬蟲。多線程爬蟲程序運行在單臺計算機上,受到計算機性能的影響,遇到大體量數據仍需要花費很多時間。分布式爬蟲可以很好地解決這個問題,其通過搭建集群,在多臺計算機上同時運行一個爬蟲程序,完成采集任務。分布式爬蟲按照不同的通信方式可以分為主從模式、自治模式和混合模式[5]。
3多線程爬蟲系統設計實現
3.1系統模塊設計
本文使用Python技術實現對某網站圖片數據的多線程爬蟲系統,主要功能模塊包括URL地址管理模塊、線程管理模塊以及數據獲取、解析和存儲模塊。各模塊主要功能如下。
(1)URL地址管理模塊。本模塊主要任務是管理和維護一個URL地址列表。
(2)線程管理模塊。本模塊按照URL地址列表對應端口數量,設置多個爬蟲線程。
(3)數據獲取、解析和存儲模塊。本模塊是整個系統的核心部分,主要功能是爬取網頁源代碼并進行解析,獲得目標數據,將目標數據進行本地化存儲。
3.2代碼實現
3.2.1網頁URL地址管理模塊的實現
開發者通過瀏覽器訪問某圖片網站,輸入查詢關鍵字,在開發者工具中查看Requests URL地址。分析URL代碼可知,word、queryWord、pn和rn分別代表關鍵詞、查詢關鍵詞、圖片數量、每頁圖片數量,其中pn=rn×(page_size+1)。編寫循環程序,獲得全部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線程管理模塊的實現
本系統使用Python的Thread庫創建線程池管理器,線程池最大管理數量為URL地址列表數量。程序循環調用down_imgs()函數,開始多線程爬蟲。核心代碼如下:
//創建連接池管理器,根據URL端口數量確定線程數
with ThreadPoolExecutor(max_workers=len(url)) as exe:
for url in urls:
//使用連接池管理器發起請求,調用函數實現多線程爬蟲
exe.submit(down_imgs(url))
3.2.3數據獲取、數據解析及數據存儲模塊的實現
本模塊實現爬蟲的核心功能,主要包括使用requests庫獲取網頁全部源代碼和解析json數據獲取目標數據。核心代碼如下:
//使用requests庫的get()方法,獲取網頁數據
req=requests.get(url,headers=headers).json()
//解析json數據,獲得目標數據,即圖片鏈接地址
for item in req[\"data\"]:
img_url=item.get(\"thumbURL\",\"\")
if img_url:
img_data=requests.get(img_url,headers=headers).content
//將圖片以文件的形式保存在本地文件夾中,其中文件名為不重復的隨機變量
file_name = uuid.uuid4()
with open(f'imges/{file_name}.jpg','wb') as file:
file.write(img_data)
3.3結論
通過編寫程序計算爬取速度,本文比較傳統單線程爬蟲與多線程爬蟲的耗時比。核心代碼如下:
//設置爬蟲開始和結束時間,計算爬蟲實際運行時長。
starttime = datetime.now()
endtime=datetime.now()
time=(endtime-starttime).seconds
print(\"本次爬取共使用:%d秒\"%time)
本文設定在相同的網絡環境和硬件配置下,爬蟲程序爬取圖片網站的相同內容,分別設置采集頁數分別為10頁、30頁、50頁、100頁。查看爬蟲完成時間,結果如表1所示。當爬取頁數為10頁時,采用傳統爬蟲模式所用的時間為39 s,采用多線程爬蟲模式完成任務所需的時間僅為5 s,耗時比為7.8∶1,爬取頁數為30頁和50頁的耗時比分別為7.12∶1和7.37∶1,但當爬取頁數達到100頁時,耗時比優勢減小為4.28∶1。
4結語
本文基于Python網絡爬蟲技術,研究了提升爬蟲速度的多線程方案,并以爬取某網站圖片為例實現了多線程爬蟲系統。通過分析程序,結果表明多線程爬蟲在提升爬蟲速度方面比傳統爬蟲模式有較大優勢。多線程爬蟲適合大量數據同時爬取,但仍要考慮計算機CPU核數等性能指標,否則會因頻繁進行資源調度而影響整體效率。
參考文獻
[1]鐘機靈.基于Python網絡爬蟲技術的數據采集系統研究[J].信息通信,2020(4):96-98.
[2]楊健,陳偉.基于Python的三種網絡爬蟲技術研究[J].軟件工程,2023(2):24-27.
[3]沈冰,周亮,李娟,等.基于定制主題網絡爬蟲技術的不良信息檢測系統設計[J].電子技術與軟件工程,2022(5):5-8.
[4]黃子純,蔡敏.基于Java多線程的智能圖片爬蟲系統的研究與實現[J].電腦知識與技術,2022(22):55-57.
[5]何西遠,張岳,張秉文.基于分布式爬蟲的微博輿情監督與情感分析系統設計[J].現代信息科技,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