這一講,我將會(huì)為大家講解稍微復(fù)雜一點(diǎn)的爬蟲,即動(dòng)態(tài)網(wǎng)頁的爬蟲。
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),宜章企業(yè)網(wǎng)站建設(shè),宜章品牌網(wǎng)站建設(shè),網(wǎng)站定制,宜章網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,宜章網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
動(dòng)態(tài)網(wǎng)頁技術(shù)介紹
動(dòng)態(tài)網(wǎng)頁爬蟲技術(shù)一之API請(qǐng)求法
動(dòng)態(tài)網(wǎng)頁爬蟲技術(shù)二之模擬瀏覽器法
? ? ? ? 安裝selenium模塊下載
? ? ? ? Google Chrome Driver安裝
? ? ? ? ChromeDriver以某寶某只松鼠店鋪為例爬取"堅(jiān)果炒貨"的商品名稱、價(jià)格、銷量以及評(píng)論數(shù)量
? ? ? ? ?課后作業(yè)
? ? ? ? ?關(guān)于作者
動(dòng)態(tài)網(wǎng)頁技術(shù)介紹
所謂的動(dòng)態(tài)網(wǎng)頁,是指跟靜態(tài)網(wǎng)頁相對(duì)的一種網(wǎng)頁編程技術(shù)。靜態(tài)網(wǎng)頁,隨著html代碼的生成,頁面的內(nèi)容和顯示效果就基本上不會(huì)發(fā)生變化了——除非你修改頁面代碼。而動(dòng)態(tài)網(wǎng)頁則不然,頁面代碼雖然沒有變,但是顯示的內(nèi)容卻是可以隨著時(shí)間、環(huán)境或者數(shù)據(jù)庫操作的結(jié)果而發(fā)生改變的。
值得強(qiáng)調(diào)的是,不要將動(dòng)態(tài)網(wǎng)頁和頁面內(nèi)容是否有動(dòng)感混為一談。這里說的動(dòng)態(tài)網(wǎng)頁,與網(wǎng)頁上的各種動(dòng)畫、滾動(dòng)字幕等視覺上的動(dòng)態(tài)效果沒有直接關(guān)系,動(dòng)態(tài)網(wǎng)頁也可以是純文字內(nèi)容的,也可以是包含各種動(dòng)畫的內(nèi)容,這些只是網(wǎng)頁具體內(nèi)容的表現(xiàn)形式,無論網(wǎng)頁是否具有動(dòng)態(tài)效果,只要是采用了動(dòng)態(tài)網(wǎng)站技術(shù)生成的網(wǎng)頁都可以稱為動(dòng)態(tài)網(wǎng)頁。(解釋來源:百度百科 - “動(dòng)態(tài)網(wǎng)頁”,若鏈接失效請(qǐng)?jiān)L問:https://baike.baidu.com/item/%E5%8A%A8%E6%80%81%E7%BD%91%E9%A1%B5/6327050?fr=aladdin)
互聯(lián)網(wǎng)每天都在蓬勃的發(fā)展,數(shù)以萬計(jì)的在線平臺(tái)如雨后春筍般不斷涌現(xiàn),不同平臺(tái)對(duì)不同用戶的權(quán)限、喜好推出不同的個(gè)性化內(nèi)容,傳統(tǒng)的靜態(tài)網(wǎng)頁似乎早已不能滿足社會(huì)的需求。于是,動(dòng)態(tài)網(wǎng)頁技術(shù)應(yīng)運(yùn)而生,當(dāng)然,在如今人們對(duì)網(wǎng)頁加載速度的要求越來越高的要求下,異步加載成為了許多大的站點(diǎn)的首選。比如各大電商平臺(tái)、知識(shí)型網(wǎng)站、社交平臺(tái)等,都廣泛采用了異步加載的動(dòng)態(tài)技術(shù)。簡單來說,就是把一些根據(jù)時(shí)間、請(qǐng)求而變化的內(nèi)容,比如某寶的商品價(jià)格、評(píng)論,比如某瓣的熱門電影評(píng)論,再比如某訊的視頻等,采用先加載網(wǎng)頁整體框架,后加載動(dòng)態(tài)內(nèi)容的方式呈現(xiàn)。
對(duì)于這一類動(dòng)態(tài)頁面,如果我們采用前面所說的對(duì)付靜態(tài)網(wǎng)頁的爬蟲方式去爬,可能收獲不到任何結(jié)果,因?yàn)檫@些異步加載的內(nèi)容所在的位置大多是一段請(qǐng)求內(nèi)容的JS代碼。在某些觸發(fā)操作下,這些JS代碼開始工作,從數(shù)據(jù)庫中提取對(duì)應(yīng)的數(shù)據(jù),將其放置到網(wǎng)頁框架中相對(duì)應(yīng)的位置,從而最終拼接成我們所能看到的完整的一張頁面。
動(dòng)態(tài)網(wǎng)頁爬蟲技術(shù)一之API請(qǐng)求法
看似更加復(fù)雜的操作似乎給我們的爬蟲帶來了很大的困擾,但其實(shí)也可能給我們帶來極大的便利。我們只需要找到JS請(qǐng)求的API,并按照一定的要求發(fā)送帶有有效參數(shù)的請(qǐng)求,便能獲得最為整潔的數(shù)據(jù),而不用像以前那樣從層層嵌套的HTML代碼中慢慢解析出我們想要的數(shù)據(jù)。
這里我們以上面提到的豆瓣電影(若鏈接失效請(qǐng)?jiān)L問:https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0)為例做一個(gè)分析,提取出熱度排名前100的電影名稱和評(píng)分以及在豆瓣的地址。
這是最近熱門電影按熱度排序的一個(gè)截圖,每個(gè)月都有不同的新電影上映,每部電影會(huì)隨著口碑效應(yīng)每天呈現(xiàn)不同的熱度排序,如果這頁面是個(gè)靜態(tài)網(wǎng)頁,那么豆瓣的程序員豈不是很辛苦,每天都要上線修改這個(gè)頁面。所以,我們可以大膽的猜測,這是個(gè)動(dòng)態(tài)頁面。但是光猜不行,我們還得證實(shí)。這里就要用到第二講講到的谷歌開發(fā)者工具了。按下F12或者在網(wǎng)頁空白處右鍵選擇檢查(N),或者在鍵盤上按下組合鍵Ctrl + Shift + I,召喚出我們的神器。如下圖所示:
今天我們不再使用左上角的鼠標(biāo)按鈕了,而是使用紅色框中的Network,這里顯示的是網(wǎng)頁加載出來的所有的文件,如下圖所示:
如果下方?jīng)]有任何結(jié)果,需要在打開谷歌開發(fā)者工具的情況下刷新網(wǎng)頁。
如上圖所示,我們點(diǎn)擊上方紅色小框中的”XHR“按鈕,就可以將這張網(wǎng)頁中異步加載的內(nèi)容篩選出來。至于到底哪一個(gè)才是我們所要的,這是個(gè)問題,看左邊的地址我們似乎也看不出神馬頭緒,那就一個(gè)一個(gè)點(diǎn)出來看吧。。。經(jīng)過枚舉,我們發(fā)現(xiàn),第三個(gè)是我們要的內(nèi)容,它的內(nèi)容如下圖:
我們可以看到,這個(gè)鏈接里包含的內(nèi)容是以JSON格式展示出來的,這時(shí)我們便有了一個(gè)大概的思路,那就是將這個(gè)鏈接的內(nèi)容用requests模塊下載后,再用Python的json模塊進(jìn)行解析。
但是,這好像是一頁的內(nèi)容,數(shù)一數(shù)也只有20部電影,我們想要的是排名前100的電影,這怎么辦呢?
不方,畢竟是動(dòng)態(tài)網(wǎng)頁,內(nèi)容都是可以根據(jù)請(qǐng)求改變的,而且這里也沒有登陸啥的操作,打開網(wǎng)頁就能看到,那我們是不是可以改變一下URL從而獲取到下一頁甚至下下頁的內(nèi)容咧?當(dāng)然可以,不然我就寫不下去了!
我們仔細(xì)觀察一下這個(gè)URL里傳遞的參數(shù):
到這里我們可能還不知道這五個(gè)參數(shù)是干嘛的,但我們可以找規(guī)律啊,于是現(xiàn)在回到原始的網(wǎng)頁,點(diǎn)擊頁面下方的"加載更多",再返回到開發(fā)者工具,哇,多出了一個(gè)URL,長的跟剛才說的那個(gè)好像,內(nèi)容也長的好像:
這個(gè)URL同樣傳遞了五個(gè)參數(shù):
唯一的不同就是一個(gè)叫"page_start"的關(guān)鍵字的值改變了,簡單翻譯一下大概是頁面起點(diǎn)的意思,再看上面的"page_limit",大概就是頁面限制的意思,看右邊的響應(yīng)內(nèi)容,這一個(gè)頁面?zhèn)鬟f了20個(gè)條目,也就是說"page_limit"是一個(gè)頁面里條目數(shù)量的限制,也就是20條,這個(gè)數(shù)據(jù)是不變的,而"page_start"是這一頁開始的條目序號(hào),那么我們要獲取后面的內(nèi)容,豈不是只要改變一下這個(gè)"page_start"就好了?是的。
老規(guī)矩,先寫個(gè)代碼壓壓驚
注釋1:因?yàn)橐豁撚?0條數(shù)據(jù),我們要爬取100條,而page_start的起始數(shù)據(jù)是0,因此我們這里只需要用一個(gè)i,從0到4循環(huán)5次,每一次乘以20便可以輕松的設(shè)置page_start的值了,因?yàn)楹竺娴腢RL是個(gè)字符串類型,這里進(jìn)行乘法運(yùn)算后我們用str()方法進(jìn)行類型轉(zhuǎn)換,轉(zhuǎn)換成str類型,方便后面的調(diào)用。
注釋2:這里我們每一次循環(huán)只要改變page_start的值就好了,所以在最后修改這個(gè)值;
注釋3:返回的content經(jīng)過decode()方法解碼,變成了一個(gè)字符串類型,根據(jù)我們前面的分析,得出這是一個(gè)JSON格式的字符串,因此,我們用Python內(nèi)置的標(biāo)準(zhǔn)庫json來進(jìn)行解析,標(biāo)準(zhǔn)庫就不需要用pip工具進(jìn)行安裝了。json模塊有兩個(gè)主要方法———json.loads()和json.dumps(),前一個(gè)是用來解碼JSON數(shù)據(jù)的,后一個(gè)則是編碼成JSON數(shù)據(jù)的。這里我們主要用到loads()方法,將content解析成一個(gè)字典格式的內(nèi)容,存儲(chǔ)在名為content_list的對(duì)象里,最后加上“[‘subjects’]”是用來解析出我們要的最簡潔的部分,這個(gè)根據(jù)具體的內(nèi)容來定,不是所有的解析都要這么寫。比如這里,如下圖:
我們要的內(nèi)容最外面有這么一個(gè)嵌套,這個(gè)嵌套的Key為”subjects”,這個(gè)Key的值為一個(gè)數(shù)組,這個(gè)數(shù)組才是我們要的,因此加上了“[‘subjects’]”。
注釋4:content_list是一個(gè)數(shù)組對(duì)象,因此我們也做一個(gè)循環(huán),分條提取。
注釋5:每一條數(shù)據(jù)依然是個(gè)字典類型的對(duì)象,因此我們可以直接寫對(duì)應(yīng)的Key名得到想要的值,這里得到的電影的名稱;
注釋6:同5,這里得到的是電影的評(píng)分;
注釋7:同5,這里得到的是電影的豆瓣鏈接;
最后的話,大家可以采用標(biāo)準(zhǔn)輸入流寫入txt文件,也可以采用xlwt模塊寫入EXCEL,還可以使用比如pyMySQL模塊寫入Mysql數(shù)據(jù)庫,具體的方式大家隨意,使用方法請(qǐng)自行百度。
到這里,這種采用尋找API并傳遞有效參數(shù)重放API的方法便為大家介紹完了,這是個(gè)很通用的方法,在很多網(wǎng)站都可以這樣使用,并且速度很快,結(jié)果最精簡。
動(dòng)態(tài)網(wǎng)頁爬蟲技術(shù)二之模擬瀏覽器法
上面我們所講的API請(qǐng)求法雖然好用且快,但是并不是所有的網(wǎng)站都會(huì)采用這種異步加載的方式來實(shí)現(xiàn)網(wǎng)站,同時(shí)還有部分網(wǎng)站會(huì)針對(duì)爬蟲采取反爬蟲措施,比如常見的驗(yàn)證碼,雖然驗(yàn)證碼主要是用來防止CSRF***的,但也有網(wǎng)站用來處理爬蟲,比如某寶。這時(shí)候,就要為大家介紹另一個(gè)神器了,Python的Selenium模塊。
Selenium是一個(gè)用于Web應(yīng)用程序測試的工具。Selenium測試直接運(yùn)行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。這個(gè)工具的主要功能包括:測試與瀏覽器的兼容性——測試你的應(yīng)用程序看是否能夠很好得工作在不同瀏覽器和操作系統(tǒng)之上。測試系統(tǒng)功能——?jiǎng)?chuàng)建回歸測試檢驗(yàn)軟件功能和用戶需求。支持自動(dòng)錄制動(dòng)作和自動(dòng)生成 .Net、Java、Perl等不同語言的測試腳本。(解釋來自:百度百科 - “Selenium”,若鏈接失效請(qǐng)點(diǎn)擊https://baike.baidu.com/item/Selenium/18266?fr=aladdin)
簡單的說,Selenium是一個(gè)主要用來進(jìn)行自動(dòng)化測試的工具,它可以配合瀏覽器驅(qū)動(dòng)在各個(gè)瀏覽器中運(yùn)行,依照代碼自動(dòng)地模擬人的操作,去獲取網(wǎng)頁元素或?qū)W(wǎng)頁元素進(jìn)行控制。當(dāng)然,Selenium并不是Python的產(chǎn)物,而是一個(gè)獨(dú)立的項(xiàng)目,Python對(duì)Selenium提供支持。(大家可以自行訪問Selenium的主頁進(jìn)行訪問,若鏈接失效請(qǐng)點(diǎn)擊http://www.seleniumhq.org/)
安裝selenium模塊
要使用Selenium這種第三方的工具,我們首先要進(jìn)行安裝,這里依然用到pip工具。在管理員權(quán)限下運(yùn)行命令行,輸入pip install selenium,稍等片刻后便可以完成安裝,如果覺得網(wǎng)絡(luò)連接官方pypi鏡像速度較慢,可以使用國內(nèi)豆瓣的鏡像源,pip install selenium -i https://pypi.douban.com/simple/,加上這個(gè)-i參數(shù)和豆瓣pypi鏡像的地址就可以了,如果想要默認(rèn)使用豆瓣鏡像源,請(qǐng)自行百度修改方法。
下載Google Chrome Driver
在安裝成功后,我們就需要安裝下一個(gè)必要的東西了,瀏覽器驅(qū)動(dòng),前面說過,selenium需要配合瀏覽器驅(qū)動(dòng)運(yùn)行,因此我們以安裝Google Chrome Driver為例。
首先,我們需要查看自己的谷歌瀏覽器版本,這個(gè)在谷歌的”幫助”中可以查看,具體方法是,打開Chrome,點(diǎn)擊右上角的三個(gè)點(diǎn)狀的按鈕,接著在彈出的菜單中依次選擇幫助(E) -> 關(guān)于 Google Chrome(G)如下圖所示:
作者的瀏覽器是更新到當(dāng)前最新的版本63的,舊版本的操作方法大致一致。
點(diǎn)開關(guān)于信息后,我們可以看到當(dāng)前的Chrome版本,以下圖為例:
Chrome一直在升級(jí),因此對(duì)應(yīng)的驅(qū)動(dòng)也得不斷升級(jí),并且與Chrome版本相適應(yīng)。這里我們需要查找相應(yīng)的ChromeDriver版本映射,給大家推薦一個(gè)持續(xù)更新的CSDN博客(若鏈接失效請(qǐng)點(diǎn)擊:http://blog.csdn.net/huilan_same/article/details/51896672),根據(jù)版本映射表,下載對(duì)應(yīng)版本的ChromeDriver,下載地址1 (http://chromedriver.storage.googleapis.com/index.html)(若鏈接失效請(qǐng)?jiān)L問:http://chromedriver.storage.googleapis.com/index.html),下載地址2(http://npm.taobao.org/mirrors/chromedriver/)(若鏈接失效請(qǐng)?jiān)L問:http://npm.taobao.org/mirrors/chromedriver/)。
安裝ChromeDriver
這里需要進(jìn)行環(huán)境變量的配置,如第一講所說,為”Path”添加一行值。
首先,我們需要找到Chrome的安裝位置,最為簡單的辦法是,在桌面找到Google Chrome的快捷方式,右鍵選擇”打開文件所在的位置“,就能打開了。比如我這里打開的路徑為C:\Program Files (x86)\Google\Chrome\Application,那么我就將這個(gè)路徑添加到Path里。然后,需要我們將下載的ChromeDriver解壓到exe程序,將單獨(dú)的exe程序復(fù)制到剛才這個(gè)路徑里,如下圖所示:
到這里,ChromeDriver便完成了安裝,我們可以在命令行輸入命令python,進(jìn)入到python交互環(huán)境進(jìn)行測試,如下圖所示:
如果你的谷歌瀏覽器自動(dòng)打開,并且跳轉(zhuǎn)到百度首頁,那么Congratulations~
以某寶某只松鼠店鋪為例爬取”堅(jiān)果炒貨”的商品名稱、價(jià)格、銷量以及評(píng)論數(shù)量
該頁面的URL為:https://sanzhisongshu.tmall.com/category-1124487841.htm?spm=a1z10.1-b-s.w5003-17763072511.42.6995d6732XB8Of&tsearch=y&scene=taobao_shop#TmshopSrchNav
老規(guī)矩,先放一段代碼:
注釋1:實(shí)例化了一個(gè)webdriver的Chrome對(duì)象,命名為driver,這時(shí)會(huì)有一個(gè)Chrome窗口自動(dòng)打開。
注釋2:調(diào)用了driver的maximize_window()方法,直接翻譯就是最大化窗口,也就是這個(gè)功能,這句寫不寫不重要,作者寫只是覺得看的清楚點(diǎn)。
注釋3:調(diào)用了driver的get()方法,以get方式請(qǐng)求URL。
注釋4:這里開始是重點(diǎn),webdriver主要有八種查找元素的方式,這一行是采用class_name的形式進(jìn)行查找,并且注意到elements這里的復(fù)數(shù),這個(gè)方法用來查找頁面上所有的符合條件的元素,如果是沒有s的方法就只能找到首個(gè)符合條件的元素,這一行是使用谷歌開發(fā)者工具的左上角小箭頭工具對(duì)元素進(jìn)行審核,并找出所有的商品條目,其中一個(gè)條目范圍如下圖所示:
注釋5:同注釋4,但這里采用的是css_selector,即css選擇器的方式進(jìn)行查找,因?yàn)檫@里的類名”item-name J_TGoldData”是個(gè)復(fù)合結(jié)構(gòu),而find_element_by_class_name()方法不支持復(fù)合結(jié)構(gòu)的查找,所以只能采用css_selector這種方式。
注釋6:同注釋4,這里是單數(shù),即在一個(gè)商品條目的范圍內(nèi)查找一次。
注釋7:同注釋6。
注釋8:同注釋4,但這里采用的是xpath的方式查找。
XPath即為XML路徑語言,它是一種用來確定XML(標(biāo)準(zhǔn)通用標(biāo)記語言的子集)文檔中某部分位置的語言。XPath基于XML的樹狀結(jié)構(gòu),有不同類型的節(jié)點(diǎn),包括元素節(jié)點(diǎn),屬性節(jié)點(diǎn)和文本節(jié)點(diǎn),提供在數(shù)據(jù)結(jié)構(gòu)樹中找尋節(jié)點(diǎn)的能力。起初 XPath 的提出的初衷是將其作為一個(gè)通用的、介于XPointer與XSLT間的語法模型。但是 XPath 很快的被開發(fā)者采用來當(dāng)作小型查詢語言。(解釋來自:百度百科 - “XPath”,若鏈接失效請(qǐng)?jiān)L問:https://baike.baidu.com/item/XPath/5574064?fr=aladdin)
獲得元素xpath的方法有幾種,最為簡單的一種,即在谷歌開發(fā)者工具面板上選擇要查找的元素,右鍵選擇Copy -> Copy XPath,如下圖所示:
當(dāng)然這種方式可能存在缺陷,即獲得的XPath可能過于繁瑣,也可能獲取的XPath無法正確查找到相應(yīng)的元素,這都需要手動(dòng)的依據(jù)XPath的語法去修改。
注釋9:最后一定要記得關(guān)閉實(shí)例化的對(duì)象,這時(shí)候由程序打開的瀏覽器也會(huì)隨之關(guān)閉。
這個(gè)例子最后的結(jié)果如下圖:
大家依然可以自由的選擇數(shù)據(jù)存儲(chǔ)方式。
這里要注意的是:使用selenium進(jìn)行數(shù)據(jù)爬取相比前面的API請(qǐng)求法可能會(huì)慢的多,在打開到對(duì)應(yīng)的窗口后,也可能窗口很長時(shí)間沒有任何動(dòng)作,但這不一定是出錯(cuò)或者是程序卡死的表現(xiàn),也可能是程序在瘋狂的查找網(wǎng)頁元素,在這個(gè)過程中,如果不確定是否出錯(cuò),請(qǐng)最好不要進(jìn)行其他操作,避免有些時(shí)候造成元素失去焦點(diǎn),導(dǎo)致莫名的錯(cuò)誤。
當(dāng)然了,selenium的功能遠(yuǎn)不止如此,幾乎人能在網(wǎng)頁上做出的行為,它都能模擬,包括點(diǎn)擊、輸入等各種行為,這個(gè)比較適用于某些網(wǎng)站要填寫驗(yàn)證碼的情況,更多有趣的內(nèi)容大家可以自行發(fā)現(xiàn)。本講就寫到這里。感謝大家的耐心閱讀。
當(dāng)前名稱:Python動(dòng)態(tài)網(wǎng)頁爬蟲技術(shù)
標(biāo)題網(wǎng)址:http://chinadenli.net/article34/ppsgse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、用戶體驗(yàn)、營銷型網(wǎng)站建設(shè)、云服務(wù)器、Google、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)