【Python爬虫学习笔记12】Ajax数据爬取简介
有時候在我們設(shè)計利用requests抓取網(wǎng)頁數(shù)據(jù)的時候,會發(fā)現(xiàn)所獲得的結(jié)果可能與瀏覽器顯示給我們的不一樣:比如說有的信息我們通過瀏覽器可以顯示,但一旦用requests卻得不到想要的結(jié)果。這種現(xiàn)象是因為我們通過requests獲得的都是HTML源文檔,而瀏覽器中見到的頁面數(shù)據(jù)都是經(jīng)過JavaScript處理的,而這些處理的數(shù)據(jù)可能是通過Ajax加載、本身包含于HTML中或是經(jīng)過JavaScript自動生成。
由Web發(fā)展趨勢來看,越來越多的網(wǎng)頁都通過Ajax加載來呈現(xiàn),即網(wǎng)頁數(shù)據(jù)加載是一種異步加載方式,網(wǎng)頁本身不包含數(shù)據(jù),而是在初始化網(wǎng)頁后自動地通過向服務(wù)器發(fā)送Ajax請求,然后從服務(wù)器獲取相應(yīng)數(shù)據(jù)之后在渲染到網(wǎng)頁上。本節(jié)下面將重點介紹Ajax的相關(guān)概念和如何判斷和獲取是否由Ajax請求,并在后面介紹爬取Ajax數(shù)據(jù)的兩種基本方法。
Ajax簡介
Ajax(全稱Asynchronous JavaScript and XML,異步的JavaScript 和 XML),是一種利用JavaScript在保證頁面不被刷新、頁面鏈接不改變的情況下與服務(wù)器交換數(shù)據(jù)并更新部分網(wǎng)頁的技術(shù)。使用Ajax的示例有很多,比如說新浪微博和不凡商業(yè)的查看更多等。
Ajax分析
初步了解Ajax后,我們便可以知道其加載過程主要分為三個步驟:發(fā)送請求——解析內(nèi)容——渲染頁面。那么,我們又是如何判斷頁面是通過發(fā)送Ajax請求來動態(tài)加載的,又如何確定其請求的地址呢?
其實,判斷一個頁面是否為Ajax請求加載,我們可以借助Chrome瀏覽器的工具欄。以不凡商業(yè)網(wǎng)站為例,我們先調(diào)出Chrome瀏覽器的Network工具欄,選擇XHR進行過濾(其實這一個就是代表請求的類型,也就是Ajax的請求類型),再刷新頁面便可看到當前所有的Ajax請求了。
接著我們下拉到網(wǎng)頁底部并試著點擊查看更多,就會發(fā)現(xiàn)請求列表中多了一個請求,如圖所示,我們再試著點擊多次,又會有更多新的請求,因此我們也就可以確定這是通過Ajax來加載的。
由此,我們便可以通過分析每一個請求的請求頭具體內(nèi)容來獲取數(shù)據(jù)源。如上圖中的Request URL里的內(nèi)容就是剛剛加載的數(shù)據(jù)的來源地址,我們打開一個新頁面試著訪問一下,發(fā)現(xiàn)了如下的內(nèi)容:
粗略一看,我們想這應(yīng)該是一個JSON數(shù)據(jù)格式,那就再試著把它放到解析站中看一看,結(jié)果不出我們所料,也證明了請求頭里的請求URL正是網(wǎng)頁的Ajax數(shù)據(jù)來源。
Ajax數(shù)據(jù)獲取
在之前分析的基礎(chǔ)上,實際我們就已經(jīng)得到一種獲取Ajax數(shù)據(jù)的方法:分析Ajax請求的URL構(gòu)成法,然后對其進行頁面解析再數(shù)據(jù)提取。這一種方法可以很直接地獲取到源數(shù)據(jù),性能較高,但分析的成本一般來說也都很大。因為并不是所有的URL構(gòu)成法都是很容易得出來的,它可能混淆了很多加密機制,且通常需要有Js的功底輔助分析。
由此,我們提出了另一種策略:使用selenium模擬瀏覽器行為來獲取動態(tài)解析獲取數(shù)據(jù)。這里的selenium是什么呢?其實它相當于的機器人,它可以模擬出人為操作瀏覽器的行為,比如點擊、輸入,拖動等。其實最初這主要是用于網(wǎng)頁測試,但發(fā)現(xiàn)其很符合爬蟲的特性,也因此廣泛用于爬蟲領(lǐng)域。在服務(wù)器看來,它就是人在訪問頁面,而很難捕捉到是爬蟲,因此安全性很高;但另一方面,使用它來獲取Ajax數(shù)據(jù)成本很大,較為繁瑣,性能不及分析URL。
上述就是常用的獲取Ajax數(shù)據(jù)的兩種方法,具體使用哪一種方法,我們可以先測試看一下所需要獲取的Ajax數(shù)據(jù)來源URL構(gòu)成法分析是否方便,如果較為規(guī)則便可以直接采用requests獲取;反之,若較為復(fù)雜則可以考慮使用selenium策略(更多的介紹在后續(xù)筆記中將會給予說明)。
轉(zhuǎn)載于:https://www.cnblogs.com/Unikfox/p/9719545.html
總結(jié)
以上是生活随笔為你收集整理的【Python爬虫学习笔记12】Ajax数据爬取简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cf375D. Tree and Que
- 下一篇: python文件编码及执行