余麗紅 楊董濤 李弋峰 柳貴東
摘要:電子元器件公司在日常的工作中,需要對(duì)市場(chǎng)上的電子物料信息做信息爬取,了解這些物料的基本信息,方便采購(gòu)部門有關(guān)人員去選擇采購(gòu)。文章設(shè)計(jì)了一個(gè)能夠自動(dòng)在網(wǎng)上爬取電子元件信息并且進(jìn)行數(shù)據(jù)可視化的爬蟲系統(tǒng)。該設(shè)計(jì)是基于Python語(yǔ)言開(kāi)發(fā)的爬蟲系統(tǒng),能夠節(jié)約更多的人力物力,對(duì)于從事電子元器件行業(yè)的工作人員高效獲取電子元件信息有很大的幫助。
關(guān)鍵詞:網(wǎng)絡(luò)爬蟲;Python;數(shù)據(jù)可視化;反爬
中圖分類號(hào):F426.63
文獻(xiàn)標(biāo)志碼:A
0 引言
網(wǎng)絡(luò)爬蟲又被稱為網(wǎng)絡(luò)機(jī)器人。它的工作就是在網(wǎng)頁(yè)上搜索所需要的信息,是搜索引擎的重要組成部分[1]。它的工作原理是先確定所需要爬取的主頁(yè)面的URL,然后通過(guò)此URL對(duì)目標(biāo)服務(wù)器發(fā)出請(qǐng)求,在發(fā)出請(qǐng)求的同時(shí)還需要攜帶一些參數(shù),避免反爬。服務(wù)器收到請(qǐng)求后給出響應(yīng),爬蟲程序就獲得了此URL的頁(yè)面源代碼。通過(guò)解析源代碼獲得所需要的數(shù)據(jù)。
本文設(shè)計(jì)的爬蟲系統(tǒng),能夠爬取互聯(lián)網(wǎng)指定網(wǎng)站上的電子元件信息,實(shí)現(xiàn)從購(gòu)買電子物料的網(wǎng)頁(yè)上將所需要的電子物料信息具體詳細(xì)獲取下來(lái),進(jìn)行存儲(chǔ),清洗再可視化,便于用戶對(duì)這些信息的觀察與選擇。該系統(tǒng)做出可視化圖形便于用戶根據(jù)需求選擇所需的電子物料,能夠節(jié)省大量的人力物力,節(jié)省產(chǎn)品元器件采購(gòu)設(shè)計(jì)的時(shí)長(zhǎng),降低生產(chǎn)成本。
1 系統(tǒng)設(shè)計(jì)方案
根據(jù)要完成的功能(數(shù)據(jù)爬取、數(shù)據(jù)清洗和數(shù)據(jù)可視化),系統(tǒng)主要包括四大模塊,分別是:獲取頁(yè)面源碼模塊、頁(yè)面源碼數(shù)據(jù)解析模塊、響應(yīng)數(shù)據(jù)處理模塊和數(shù)據(jù)可視化模塊。系統(tǒng)的結(jié)構(gòu)如圖1所示。
圖1中獲取頁(yè)面源碼模塊主要是通過(guò)requests庫(kù)對(duì)目標(biāo)URL發(fā)起請(qǐng)求獲得目標(biāo)URL的頁(yè)面源碼[2]。頁(yè)面源碼數(shù)據(jù)解析模塊主要負(fù)責(zé)對(duì)獲取到的頁(yè)面源碼進(jìn)行分析從而獲取所需要的數(shù)據(jù);響應(yīng)數(shù)據(jù)處理模塊主要負(fù)責(zé)對(duì)最終所得到的響應(yīng)數(shù)據(jù)進(jìn)行處理,得到最終想要獲取的詳細(xì)數(shù)據(jù)后再對(duì)其進(jìn)行本地存儲(chǔ);數(shù)據(jù)可視化模塊就是負(fù)責(zé)對(duì)本地所存儲(chǔ)的數(shù)據(jù)進(jìn)行可視化處理,便于用戶更加直觀地了解產(chǎn)品信息。
2 系統(tǒng)的實(shí)現(xiàn)方法
2.1 利用反爬機(jī)制獲取頁(yè)面源碼方法
獲取頁(yè)面源碼最大的阻礙就是在訪問(wèn)目標(biāo)URL時(shí),會(huì)遇見(jiàn)一些常見(jiàn)和特殊的反爬措施。最常見(jiàn)的反爬機(jī)制有UA反爬、基于Cookie的反爬和Ajax動(dòng)態(tài)加載。針對(duì)UA反爬,通過(guò)在瀏覽器中打開(kāi)目標(biāo)網(wǎng)頁(yè),啟動(dòng)開(kāi)發(fā)者工具,在數(shù)據(jù)包中找到請(qǐng)求頭。在請(qǐng)求頭中將“User-Agent”的參數(shù)復(fù)制到腳本中,放入header里面,在發(fā)起請(qǐng)求的時(shí)候攜帶此header,就可以成功獲取數(shù)據(jù)。對(duì)于Cookie反爬,只需要在發(fā)起請(qǐng)求時(shí)使用session方法,就能夠保存在發(fā)起請(qǐng)求的時(shí)候產(chǎn)生的Cookie值,下次再次發(fā)出請(qǐng)求時(shí)就會(huì)攜帶此Cookie。對(duì)于Ajax動(dòng)態(tài)加載的數(shù)據(jù),先在網(wǎng)頁(yè)中找到動(dòng)態(tài)加載出來(lái)的數(shù)據(jù)包,然后在此數(shù)據(jù)包中找到關(guān)于頁(yè)面數(shù)的參數(shù),并將表單數(shù)據(jù)中的參數(shù)都復(fù)制下來(lái),在系統(tǒng)源代碼中做一個(gè)字典來(lái)存儲(chǔ)此數(shù)據(jù)。之后再發(fā)出申請(qǐng)時(shí)會(huì)攜帶此字典,就能夠成功獲取到動(dòng)態(tài)加載的數(shù)據(jù)。
2.2 頁(yè)面源碼數(shù)據(jù)解析方法
頁(yè)面源碼數(shù)據(jù)解析模塊是對(duì)獲取到的頁(yè)面源碼進(jìn)行處理,找出需要的數(shù)據(jù),并根據(jù)數(shù)據(jù)所在的位置使用xpath或正則表達(dá)式來(lái)獲取相關(guān)的數(shù)據(jù)[3]。在此模塊中,對(duì)于一般返回的頁(yè)面源碼數(shù)據(jù)解析會(huì)比較簡(jiǎn)單。但是對(duì)于動(dòng)態(tài)加載的數(shù)據(jù)解析,就需要先到動(dòng)態(tài)加載的數(shù)據(jù)所在的位置,并且將此數(shù)據(jù)格式化,格式化后的數(shù)據(jù)有利于觀察。之后根據(jù)觀察到的數(shù)據(jù)所在位置,編寫代碼獲取數(shù)據(jù),并按需要輸出特定格式的數(shù)據(jù)。
2.3 響應(yīng)數(shù)據(jù)處理方法
響應(yīng)數(shù)據(jù)處理模塊主要的工作內(nèi)容就是對(duì)獲取得到的數(shù)據(jù)進(jìn)行處理,處理的內(nèi)容包括對(duì)數(shù)據(jù)的清洗、存儲(chǔ)。數(shù)據(jù)的清洗是將不符合要求的數(shù)據(jù)進(jìn)行過(guò)濾,過(guò)濾后的數(shù)據(jù)才是有價(jià)值的數(shù)據(jù)。而數(shù)據(jù)存儲(chǔ)就是將清洗后的數(shù)據(jù)進(jìn)行本地保存或者保存在數(shù)據(jù)庫(kù)中。
2.4 數(shù)據(jù)可視化方法
數(shù)據(jù)可視化模塊主要就是對(duì)保存的數(shù)據(jù)進(jìn)行繪制可視化圖形處理,方便更加直觀地觀察數(shù)據(jù)的信息,而在此模塊中負(fù)責(zé)繪制圖形的庫(kù)為Matpoltlib庫(kù)。Matplotlib是Python中最受歡迎的數(shù)據(jù)可視化軟件包之一,支持跨平臺(tái)運(yùn)行。
本模塊主要繪制柱狀圖和餅狀圖,在Matpoltlib中就需要是用bar()函數(shù)來(lái)繪制柱狀圖,還需要使用pie()函數(shù)來(lái)繪制餅狀圖。而在這些函數(shù)中還需要定義一些參數(shù)來(lái)定義繪制的圖形的大小、位置和樣式。
3 系統(tǒng)的函數(shù)實(shí)現(xiàn)
3.1 系統(tǒng)的流程設(shè)計(jì)
系統(tǒng)主要處理流程如圖2所示。開(kāi)始對(duì)目標(biāo)URL發(fā)起請(qǐng)求,獲得目標(biāo)URL的頁(yè)面源碼,再對(duì)其分析,列出所有初級(jí)的電子元件類型選擇,用戶選擇自己所需求的類型。對(duì)用戶所選擇的類型所對(duì)應(yīng)的URL發(fā)起請(qǐng)求,通過(guò)其頁(yè)面源碼解析獲得初級(jí)電子元件類型并列出來(lái)。用戶選擇具體類型,對(duì)最終的URL發(fā)起請(qǐng)求獲得最終響應(yīng)。獲取到元件的所有頁(yè)面數(shù),再利用循環(huán)對(duì)所有頁(yè)面進(jìn)行爬取,得到所有的數(shù)據(jù),在爬取數(shù)據(jù)的過(guò)程中若沒(méi)有對(duì)應(yīng)的參數(shù)則用“-”表示。之后對(duì)所獲取到的所有數(shù)據(jù)進(jìn)行本地存儲(chǔ),最后對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行可視化處理生成柱形圖、詞云或餅狀圖,列出最優(yōu)選擇。
3.2 獲取頁(yè)面源碼的實(shí)現(xiàn)
獲取頁(yè)面源碼模塊程序主要使用session來(lái)實(shí)現(xiàn)。主要實(shí)現(xiàn)方法是先定義一個(gè)session對(duì)象:
session = requests.session(),
再根據(jù)提供的url進(jìn)行頁(yè)面爬?。?/p>
page_text = session.get(url = url,headers = headers).content.decode(‘utf-6)。
其中headers在文件開(kāi)頭已經(jīng)定義,后面攜帶的content.decode(‘utf-8)是解決爬取到的中文數(shù)據(jù)亂碼的問(wèn)題。將爬取到的數(shù)據(jù)字符類型都定義為utf-8。最后返回page_text。對(duì)于電子元件信息的多頁(yè)爬取,可以通過(guò)一個(gè)循環(huán)來(lái)實(shí)現(xiàn)。當(dāng)要爬取所有頁(yè)面的數(shù)據(jù)時(shí),首先要知道總頁(yè)數(shù)(pageCount),還要得到需要爬取的電子料的代號(hào)(NodeID),最后將表單數(shù)據(jù)構(gòu)建為data參數(shù)。
3.3 數(shù)據(jù)清洗與本地存儲(chǔ)的實(shí)現(xiàn)
當(dāng)數(shù)據(jù)的爬取完成后,接下來(lái)還要對(duì)爬取下來(lái)的數(shù)據(jù)進(jìn)行清洗,將沒(méi)有意義的干擾數(shù)據(jù)信息去除掉[4]。本文使用text = text(~((text.電子元器件 == 0) )代碼,將無(wú)意義元器件的信息值設(shè)為0來(lái)實(shí)現(xiàn)清洗。當(dāng)數(shù)據(jù)清洗完畢后,接下來(lái)需要做的操作就是對(duì)數(shù)據(jù)進(jìn)行本地存儲(chǔ),本文使用csv表格來(lái)存儲(chǔ)爬取到的電子元件信息數(shù)據(jù)。首先需要為存儲(chǔ)的表格構(gòu)造一個(gè)列名,就是每一列存放數(shù)據(jù)的名稱,將這些列名放入一個(gè)列表中l(wèi)able = [列名1,列名2,…列名n],之后將爬取到的數(shù)據(jù)和列名構(gòu)造成pandas中的DataFrame對(duì)象,對(duì)象名為text。實(shí)現(xiàn)語(yǔ)句為text = pandas.DataFrame(爬取到的數(shù)據(jù)列表名,columns = lable)。之后再通過(guò)爬取的電子物料名稱作為存儲(chǔ)的csv文件的文件名。創(chuàng)建csv文件并將DataFrame對(duì)象text寫入該文件,完成數(shù)據(jù)的本地存儲(chǔ)。
3.4 數(shù)據(jù)可視化的實(shí)現(xiàn)
數(shù)據(jù)可視化用到的庫(kù)有pandas、matplotlib和os。首先,需要用os庫(kù)將腳本所在的文件下所有csv文件列出來(lái)供用戶選擇。當(dāng)用戶選擇了一個(gè)csv文件后,程序會(huì)提示用戶選擇所需要的操作。數(shù)據(jù)可視化模塊流程如圖3所示。
4 系統(tǒng)測(cè)試
系統(tǒng)測(cè)試主要包括頁(yè)面爬取測(cè)試和次級(jí)分類爬取測(cè)試。首頁(yè)爬取測(cè)試是對(duì)初始URL發(fā)出請(qǐng)求,獲取初始URL的首頁(yè)頁(yè)面源碼,再通過(guò)數(shù)據(jù)解析,將首頁(yè)的頁(yè)面源碼當(dāng)中所有電子物料的大分類名稱全部獲取到,并且顯示在終端。次級(jí)分類爬取測(cè)試是在獲取到首頁(yè)電子物料大分類的情況下,對(duì)單個(gè)大分類的電子物料下的具體分類信息進(jìn)行獲取并顯示在終端窗口。測(cè)試表明,該系統(tǒng)實(shí)現(xiàn)了相應(yīng)的功能。
5 結(jié)語(yǔ)
本文以電子產(chǎn)品貿(mào)易公司的電子元器件信息搜集工作為出發(fā)點(diǎn),為提升電子元器件信息搜集的效率,設(shè)計(jì)基于Python語(yǔ)言的爬蟲系統(tǒng)。該系統(tǒng)主要分為四大模塊,分別是數(shù)據(jù)獲取模塊、數(shù)據(jù)清洗模塊、數(shù)據(jù)存儲(chǔ)模塊和數(shù)據(jù)可視化模塊。數(shù)據(jù)爬取模塊將用戶所需要的數(shù)據(jù)從互聯(lián)網(wǎng)上獲取下來(lái),并且在此過(guò)程中應(yīng)對(duì)一些反爬技術(shù)。數(shù)據(jù)清洗模塊將獲取到的數(shù)據(jù)進(jìn)行清洗,將不符合要求的數(shù)據(jù)去掉,保留有價(jià)值的數(shù)據(jù)。數(shù)據(jù)存儲(chǔ)模塊將清洗過(guò)后的數(shù)據(jù)存儲(chǔ)到本地或數(shù)據(jù)庫(kù)中。數(shù)據(jù)可視化模塊將存儲(chǔ)的數(shù)據(jù)做成可以更直觀地查看數(shù)據(jù)信息的可視化圖形。該系統(tǒng)實(shí)現(xiàn)了電子元器件信息的批量下載及可視化操作,方便工作人員根據(jù)需求選擇所需的電子物料。
參考文獻(xiàn)
[1]盧花,馮新.網(wǎng)絡(luò)爬蟲在批量獲取教學(xué)資源中的應(yīng)用[J].福建電腦,2022(7):103-105.
[2]孟憲穎,毛應(yīng)爽.基于Python爬蟲技術(shù)的商品信息采集與分析[J].軟件,2021(11):128-130.
[3]于淑云.基于校園BBS的輿情系統(tǒng)爬蟲應(yīng)用研究[J].長(zhǎng)春工程學(xué)院學(xué)報(bào),2016(2):95-98.
[4]楊丕仁.基于Python語(yǔ)言的網(wǎng)絡(luò)日志處理系統(tǒng)設(shè)計(jì)[J].電腦知識(shí)與技術(shù),2016(15):117-119.
(編輯 李春燕)
Design of electronic component information crawling and data visualization system based on Python
Yu Lihong, Yang Dongtao, Li Yifeng, Liu Guidong*
(School of Electronic and Information Engineering,Guangdong Baiyun University, Guangzhou 510450, China)
Abstract: In daily work, electronic component companies need to crawl the information of electronic materials in the market to understand the basic information of these materials, so that relevant personnel of the purchasing department can choose to purchase. This paper designs a crawler system that can automatically crawl the information of electronic components on the Internet and visualize the data. This design is a crawler system developed based on Python language. This system can save more manpower and material resources, and it is very helpful for the staff engaged in electronic component industry to obtain electronic component information efficiently.
Key words: web crawler; Python; data visualization; reverse crawl