這次,我們來爬取百度文庫的VIP才能下載的PPT文檔卸伞。我們學(xué)爬蟲的時(shí)候抹镊,最讓我們頭疼的可能就是動(dòng)態(tài)請(qǐng)求了,因?yàn)椴黄平饫锩娴慕涌诨绨粒覀兙蜎]有辦法拿到我們想要的數(shù)據(jù)垮耳。
破解接口確實(shí)是有很大的難度,對(duì)于初學(xué)者甚至是滋生爬蟲工程師都是很有難度的遂黍,畢竟我們爬蟲是與人在對(duì)抗而不是真的和機(jī)器相愛相殺终佛。
所以,今天我們用selenium直接獲取到動(dòng)態(tài)渲染后的參數(shù)來下載我們想要的數(shù)據(jù)雾家。
一铃彰、爬取前的準(zhǔn)備
python庫
- requests
- lxml
- selenium
- selenium驅(qū)動(dòng)器
- 谷歌瀏覽器
selenium原理介紹
它可以把渲染之后的前端頁面返回給我們,這樣我們就能夠拿到我們想要的數(shù)據(jù)了芯咧。
二豌研、實(shí)現(xiàn)思路
首先,我們要引入chrome自動(dòng)化驅(qū)動(dòng)器唬党,然后加載這個(gè)網(wǎng)頁鹃共。
百度文庫頁面分析
從這個(gè)頁面中,我們發(fā)現(xiàn)驶拱,其他都很正常霜浴,但是呢,這個(gè)頁面有一個(gè)反扒措施蓝纲,就是有一個(gè)“還剩xx頁未讀阴孟,繼續(xù)閱讀”這個(gè)字段,其實(shí)税迷,這個(gè)就是我們這次遇到的最大的反爬永丝。
在解決這個(gè)反爬問題之前,我們先分析一下最先出來的那幾張PPT箭养,選擇我們爬取它的方法慕嚷。
三、分析前端頁面
1.一開始就展現(xiàn)出來的頁面分析
我們發(fā)現(xiàn),在前三個(gè)顯示出來的ppt是以圖片的形式喝检,而且嗅辣,圖片的url已經(jīng)暴露在了頁面中,并且挠说,存儲(chǔ)在前端中的格式是完全相同的澡谭,非常的理想。
2.隱藏頁面的分析
現(xiàn)在损俭,我們點(diǎn)擊繼續(xù)閱讀蛙奖,看看之后的圖片是不是也是這么儲(chǔ)存的。
我們發(fā)現(xiàn)杆兵,接下來隱藏的頁面中外永,圖片的url存儲(chǔ)方式并沒有發(fā)生什么大變化,無非解釋外面又套了一層div拧咳,并且div的class屬性伯顶,僅僅只在reader-pageNo-<頁數(shù)>,發(fā)生了變化骆膝。
到此祭衩,我們前端就分析完了≡那總結(jié)如下:
- 一開始展示的頁面中掐暮,圖片的url在class是ppt-image-wrap的div下的img標(biāo)簽
- 隱藏的圖片url僅僅只在剛剛分析出來的div上套了一層盒子,并且class中僅僅只有reader-pageNo-<頁數(shù)>這個(gè)參數(shù)需要改變
3.思路
那我們先用selenium政钟,渲染出隱藏后的前端頁面路克,然后將渲染后的頁面?zhèn)魅雔xml中的etree中去解析,再通過xpath把url再匹配出來养交,通過request.get()來下載圖片精算,最后通過上下文處理器傳入文件中保存。
這樣碎连,我們的PPT爬取就實(shí)現(xiàn)了灰羽。
4.開始實(shí)現(xiàn)
在分析完了前端頁面后,我們可以開始實(shí)現(xiàn)爬取了鱼辙。
代碼
5.代碼解釋
1)input阻斷
根據(jù)剛剛講的原理廉嚼,我們放個(gè)input阻斷程序運(yùn)行,然后我們手動(dòng)點(diǎn)擊繼續(xù)閱讀倒戏,然后回到程序中按回車?yán)^續(xù)進(jìn)行程序怠噪。
2)sleep函數(shù)
這個(gè)函數(shù)是用來模擬的第一步。因?yàn)樵谧x取的過程中杜跷,頁面的加載也是需要時(shí)間的傍念,所以我們需要有等待的時(shí)間矫夷。
3)模擬滑動(dòng)
這個(gè)代碼,大家只需要用的時(shí)候復(fù)制就好了捂寿,其中,535這個(gè)就是一個(gè)參數(shù)孵运,在實(shí)驗(yàn)中秦陋,發(fā)現(xiàn)535這個(gè)參數(shù)配合上range()使用,能夠?qū)崿F(xiàn)每次都加載一個(gè)到兩個(gè)頁面治笨。
大家可能對(duì)range里面的參數(shù)感到好奇驳概,這個(gè)我也解釋一下。這個(gè)參數(shù)旷赖,就是剩下的頁數(shù)顺又,比如在點(diǎn)擊繼續(xù)閱讀后,還剩31個(gè)PPT等孵,那么range的最后就填31稚照。這個(gè)是根據(jù)你想要的PPT的頁數(shù)來的。
sleep是要等待滑動(dòng)后俯萌,頁面加載出來果录。這樣我們才能匹配到圖片的url。
4)圖片url匹配
首先咐熙,一開始展現(xiàn)出來的圖片我們就直接用xpath匹配了弱恒,我們來看看隱藏的url匹配
在第二個(gè)for循環(huán)中,range里面的參數(shù)棋恼,就是接下來顯示的返弹,和最后一個(gè)圖片的url所對(duì)應(yīng)的數(shù)字。
在all_ppt_div后面爪飘,我們看reader-pageNo-%s义起,其中,%s就是用來傳數(shù)字的师崎,因?yàn)閯倓偽覀兎治龀鰜聿⑸龋琩iv中class的變化和PPT的頁數(shù)是一致的,所以通過這個(gè)方法傳進(jìn)去抡诞。
然后再將url存進(jìn)列表中穷蛹。
5)文件存儲(chǔ)
這個(gè)就是文件操作,存入當(dāng)前目錄昼汗。其中肴熏,content就是文件的二進(jìn)制形式。
四顷窒、總結(jié)
到此蛙吏,百度文庫PPT的爬取就結(jié)束啦源哩。大家可以用這個(gè)代碼和思想爬取絕大多數(shù)的百度文庫ppt,因?yàn)榍岸说目蚣苁腔静粫?huì)變的鸦做,所以每個(gè)PPT中圖片url在前端的存儲(chǔ)格式也是一樣的励烦,我們要改的也只是程序中的部分參數(shù)就可以了。