溫婭娜 袁梓梁 何詠宸 黃猛
摘? 要:網(wǎng)絡(luò)的發(fā)展,大數(shù)據(jù)、人工智能的崛起使數(shù)據(jù)變得尤為重要,各行各業(yè)的發(fā)展都需要數(shù)據(jù)的支持,任何一種深度學(xué)習(xí)以及算法中都需要大量的數(shù)據(jù)作為模型來訓(xùn)練才能得出較為準(zhǔn)確的結(jié)論。文中討論了網(wǎng)絡(luò)爬蟲實現(xiàn)過程中的主要問題:了解網(wǎng)頁基本結(jié)構(gòu)、使用直觀的網(wǎng)頁分析工具對網(wǎng)頁進(jìn)行抓包分析、如何使用正則表達(dá)式獲取準(zhǔn)確的字符串信息、利用Python實現(xiàn)簡單的頁面數(shù)據(jù)獲取。
關(guān)鍵詞:網(wǎng)絡(luò)爬蟲;Python;正則表達(dá)式;抓包分析
中圖分類號:TP391.3? ? ? 文獻(xiàn)標(biāo)識碼:A 文章編號:2096-4706(2020)01-0012-03
Abstract:With the development of network,the rise of big data and artificial intelligence,data becomes more and more important. The development of all walks of life needs the support of data. Any kind of deep learning and algorithm needs a lot of data as a model for training to get a more accurate conclusion. This paper discusses the main problems in the implementation of web crawler:understanding the basic structure of web page,using the intuitive web page analysis tool to analyze the web page,how to use regular expression to obtain accurate string information,and using Python to achieve simple page data acquisition.
Keywords:web crawler;Python;regular expression;packet capturing analysis
0? 引? 言
在網(wǎng)絡(luò)迅速發(fā)展的過程中,萬維網(wǎng)成為大量信息的載體,數(shù)據(jù)獲取的多樣性也使如何有效地提取并利用這些信息成為一個巨大的挑戰(zhàn)。而網(wǎng)絡(luò)爬蟲是一種按照一定的規(guī)則,自動地抓取萬維網(wǎng)信息的程序或者腳本,使用網(wǎng)絡(luò)爬蟲來面對這個巨大的挑戰(zhàn)是最優(yōu)的,因為網(wǎng)絡(luò)爬蟲作為搜索引擎的重要組成部分,在信息檢索過程中發(fā)揮著重要的作用,對于網(wǎng)絡(luò)爬蟲,Python有很大的優(yōu)勢,在Python中有各種爬蟲框架,方便高效地下載網(wǎng)頁,多線程、進(jìn)程模型成熟穩(wěn)定。本文將對Python爬蟲有效提取大量信息的應(yīng)用過程進(jìn)行詳細(xì)介紹。
1? 網(wǎng)頁的基本結(jié)構(gòu)
要應(yīng)用爬蟲技術(shù),首先要看應(yīng)用的領(lǐng)域,本文主要針對網(wǎng)頁的結(jié)構(gòu),了解網(wǎng)頁的結(jié)構(gòu),這些光鮮亮麗的頁面都是由代碼組成的。這種代碼我們稱之為HTML(超文本標(biāo)記語言),HTML是瀏覽器(Chrome、Safari、IE、Firefox等)看得懂的語言。除了HTML,構(gòu)建頁面還有CSS以及JavaScript。HTML負(fù)責(zé)頁面的結(jié)構(gòu),CSS負(fù)責(zé)頁面的樣式,JavaScript負(fù)責(zé)頁面的動態(tài)功能。網(wǎng)頁有靜態(tài)網(wǎng)頁和動態(tài)網(wǎng)頁之分,靜態(tài)網(wǎng)頁并不是沒有動態(tài)效果的頁面,而是指沒有后臺數(shù)據(jù)庫的不可交互網(wǎng)頁,常以.htm、.html、.xml為后綴;動態(tài)網(wǎng)頁是指能與后臺數(shù)據(jù)庫進(jìn)行數(shù)據(jù)傳遞的可交互網(wǎng)頁,常以.aspx、.asp、.jsp、.php為后綴。目前很多動態(tài)網(wǎng)站都采取了異步加載技術(shù)(Ajax),這就是很多時候抓取到的源代碼和網(wǎng)站顯示的源代碼不一致的原因。目前有多種技術(shù)和方法可以對動靜態(tài)網(wǎng)頁中的信息進(jìn)行獲取,本文介紹了抓包分析和正則表達(dá)式兩種方法。下文就介紹一下如何采用抓包分析對動態(tài)網(wǎng)頁進(jìn)行分析。
2? Chrome抓包分析
2.1? 網(wǎng)頁源代碼分析
靜態(tài)和動態(tài)兩種網(wǎng)頁的源代碼也是不同的,在分析過程中我們需要對這兩種代碼都進(jìn)行分析,其中重要的是對動態(tài)頁面中的數(shù)據(jù)包抓取分析,本文采用谷歌瀏覽器Chrome開發(fā)者工具進(jìn)行抓包分析,具體采用的方法:以京東商品為例分析如何通過Chrome進(jìn)行抓包。首先打開一個商品的首頁,通常抓取到的源代碼就是網(wǎng)頁最原始的代碼,來到網(wǎng)頁空白處單擊鼠標(biāo)右鍵,選擇查看網(wǎng)頁源代碼,并且也可以采用右擊鼠標(biāo)方式選擇檢查,這樣就得到了兩種不同的源代碼,對代碼進(jìn)行對比分析。而采用右擊鼠標(biāo)方式選擇檢查得到的代碼是經(jīng)過Ajax加載和JavaScript渲染的源代碼,也就是當(dāng)前網(wǎng)站顯示內(nèi)容的源代碼。對比過后會發(fā)現(xiàn),代碼隨著網(wǎng)頁的變化而變化,這就是典型的動態(tài)網(wǎng)頁異步加載技術(shù)(Ajax)的例子。
通過以上方法,我們了解了動態(tài)網(wǎng)頁,下一步就是怎樣獲取動態(tài)網(wǎng)頁中的數(shù)據(jù)包來爬取動態(tài)網(wǎng)頁中的信息。
2.2? 網(wǎng)頁抓包分析
本文嘗試使用Chrome抓包分析獲取當(dāng)前頁面商品的價格數(shù)據(jù)。打開瀏覽器中的開發(fā)者工具,然后選擇Network選項卡進(jìn)行抓包分析。此時要按下F5鍵刷新頁面,才可以看到開發(fā)者工具中出現(xiàn)了各種各樣的包,本文只需要JS的數(shù)據(jù)包,所以需要使用Filter對包進(jìn)行過濾,經(jīng)過篩選后即得到返回的商品價格信息。
打開此包Headers中的URL,里面是商品價格信息的JSON數(shù)據(jù)呈現(xiàn),當(dāng)前的網(wǎng)站開發(fā)大都采用這樣的模式。分析URL的參數(shù),可以推測出SKUid就是每個商品主鍵(SKU是一個在物流、運(yùn)輸?shù)犬a(chǎn)業(yè)中常用的縮寫,其全稱是Stock Keeping Unit(庫存量單位),即庫存進(jìn)出計量的基本單元,現(xiàn)在已經(jīng)被引申為產(chǎn)品統(tǒng)一編號的簡稱,每種產(chǎn)品均對應(yīng)有唯一的SKU。例如,商品首頁https://item.jd.com/ 100004286189.html中100004286189就是商品的唯一號碼標(biāo)識,可以由抓到的價格數(shù)據(jù)包中的URL的callback前https: //p.3.cn/prices/mgets?后添加SKUid=商品的號碼標(biāo)識,來直接打開商品的信息從而獲得商品價格。
由此得出結(jié)論:通過泛化后的URL,理論上只要能得到商品的SKUid,我們就可以訪問對應(yīng)商品的信息。
以上方法可以獲取網(wǎng)頁中的關(guān)鍵數(shù)據(jù),但是從技術(shù)角度來說,對于大量數(shù)據(jù)的采集本方法不適合,需要采用代碼的方法進(jìn)行,下面將詳細(xì)描述正則。
3? 正則表達(dá)式獲取字符串信息
正則表達(dá)式是一組特殊的字符序列,由一些事先定義好的字符以及這些字符的組合形成,常常用于匹配字符串,在Python中,re模塊就是一個用于處理正則表達(dá)式的模塊。
給定一個正則表達(dá)式和另一個字符串,可以達(dá)到以下兩個目的:給定的字符串是否符合正則表達(dá)式的過濾邏輯(稱作“匹配”)??梢酝ㄟ^正則表達(dá)式,從字符串中獲取我們想要的特定部分。正則表達(dá)式對于剛接觸的人來說,比較難一些,但是它可以迅速地用極簡單的方式表示復(fù)雜的字符串,正則表達(dá)式具有靈活性、邏輯性和功能性非常強(qiáng),常用來匹配或提取一些特征字符串。Python中處理正則匹配最常見的函數(shù)是match和search函數(shù)分別如下:
re.match與re.search的區(qū)別:re.match從字符串開始起匹配指定正則表達(dá)式,如果字符串開始不符合正則表達(dá)式,則匹配失敗,函數(shù)返回None;而re.search從字符串開始匹配正則表達(dá)式,直至找到一個盡可能地匹配成功。接下來介紹一個簡單的使用正則表達(dá)式爬取小說的實例,小說數(shù)據(jù)獲取如下。
(1)抓取網(wǎng)頁數(shù)據(jù):打開某小說頁面,打開瀏覽器的開發(fā)人員工具,使用Requests庫獲取章節(jié)和章節(jié)對應(yīng)的鏈接信息,并使用response.text獲取對應(yīng)章節(jié)的內(nèi)容。把所有內(nèi)容讀入一個字符串,采用循環(huán)的方式讀取字符串內(nèi)容,獲取每一個章節(jié),分別去下載小說的內(nèi)容,提取章節(jié)內(nèi)容:
(2)數(shù)據(jù)清洗及提取:對于獲得的頁面上的原始數(shù)據(jù),但是獲取數(shù)據(jù)本身的格式(其中包含一些標(biāo)簽、字符)等內(nèi)容都不符合規(guī)范,由于不規(guī)范的數(shù)據(jù)和實際所需要的信息混在一起,因此需要進(jìn)一步清洗、提取才能獲得我們實際需要的數(shù)據(jù)。所以再次讀取獲得的字符串信息,獲取每一章的信息(包括章節(jié)、url):
再使用空字符代替空格、P標(biāo)簽等不需要的數(shù)據(jù),對獲取的數(shù)據(jù)進(jìn)行二次清洗,只保留所需要的小說的文字。
(3)數(shù)據(jù)持久化:把清洗后的數(shù)據(jù)保存到新文件中,以便進(jìn)一步分析。新建一個文件保存小說的內(nèi)容,在源代碼中找到標(biāo)題所在的標(biāo)簽,使用正則表達(dá)式將其匹配為文件的title,并將所需內(nèi)容寫入文件中:
4? 結(jié)? 論
本文介紹了兩種方法來進(jìn)行頁面信息的獲取,使用Chrome抓包分析可以對動態(tài)頁面的少量信息進(jìn)行獲取,而正則表達(dá)式可以對頁面中大量的數(shù)據(jù)進(jìn)行獲取,對比下,使用正則表達(dá)式來獲取數(shù)據(jù)的效率和功能高一些。
使用抓包分析獲取異步加載動態(tài)網(wǎng)頁的數(shù)據(jù),下一步會研究使用Python工具實現(xiàn)爬取動態(tài)網(wǎng)頁。借助Python功能的各種標(biāo)準(zhǔn)庫對網(wǎng)頁數(shù)據(jù)的抓取、處理,更方便地實現(xiàn)數(shù)據(jù)持久化。下一步也會探索一些爬蟲框架來完成數(shù)據(jù)抓取的目標(biāo)。也會繼續(xù)學(xué)習(xí)并解決在更深層次地爬取各大網(wǎng)站信息的同時會遇到的反爬蟲問題。
參考文獻(xiàn):
[1] 郭二強(qiáng),李博.大數(shù)據(jù)環(huán)境下基于python的網(wǎng)絡(luò)爬蟲技術(shù) [J].計算機(jī)產(chǎn)品與流通,2017(12):82.
[2] 李培.基于Python的網(wǎng)絡(luò)爬蟲與反爬蟲技術(shù)研究 [J].計算機(jī)與數(shù)字工程,2019,47(6):1415-1420+1496.
[3] 王朝陽.基于Python的圖書信息系統(tǒng)的設(shè)計與實現(xiàn) [D].長春:吉林大學(xué),2016.
[4] 徐恒.社會化網(wǎng)絡(luò)數(shù)據(jù)獲取技術(shù)研究與實現(xiàn) [D].長春:吉林大學(xué),2016.
[5] 孫建立,賈卓生.基于Python網(wǎng)絡(luò)爬蟲的實現(xiàn)及內(nèi)容分析研究 [C]//中國計算機(jī)用戶協(xié)會網(wǎng)絡(luò)應(yīng)用分會2017年第二十一屆網(wǎng)絡(luò)新技術(shù)與應(yīng)用年會.中國計算機(jī)用戶協(xié)會網(wǎng)絡(luò)應(yīng)用分會2017年第二十一屆網(wǎng)絡(luò)新技術(shù)與應(yīng)用年會論文集.河北雄安:《計算機(jī)科 學(xué)》編輯部,2017:275-277+281.
[6] 陳琳,任芳.基于Python的新浪微博數(shù)據(jù)爬蟲程序設(shè)計 [J].信息系統(tǒng)工程,2016(9):97-99.
[7] 陸樹芬.基于Python對網(wǎng)絡(luò)爬蟲系統(tǒng)的設(shè)計與實現(xiàn) [J].電腦編程技巧與維護(hù),2019(2):26-27+51.
[8] 熊暢.基于Python爬蟲技術(shù)的網(wǎng)頁數(shù)據(jù)抓取與分析研究 [J].數(shù)字技術(shù)與應(yīng)用,2017(9):35-36.
[9] 吳爽.基于python語言的web數(shù)據(jù)挖掘與分析研究 [J].電腦知識與技術(shù),2018,14(27):1-2.
作者簡介:溫婭娜(1999.03-),女,漢族,內(nèi)蒙古包頭人,本科,學(xué)士學(xué)位,研究方向:人工智能和軟件開發(fā)應(yīng)用。