1 . 什么是 AJAX ?
AJAX = 異步 JavaScript 和 XML。
AJAX 是一種用於創建快速動態網頁的技術。
通過在后台與服務器進行少量數據交換,AJAX 可以使網頁實現異步更新。這意味着可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新。
傳統的網頁(不使用 AJAX)如果需要更新內容,必需重載整個網頁面。
幾個常見的用到ajax的場景。
比如你在逛知乎,你沒有刷新過網頁,但是你卻能看到你關注的用戶或者話題有了新動態的消息提示。
還比如,我們在看視頻時,可以看到下面的評論沒有完全全部加載出來,而是你向下拖動一點,它給你加載一點。
為什么要用到ajax呢?
從上述場景你應該也可以發現它的優點,
第一,方便與用戶的交互,不用重新加載整個網頁,就可以實現刷新,不用中斷用戶的行為。你正在看程序員如何找對象呢,此時來個消息推送,整個網頁被刷新了,你說你氣不氣!
第二個呢,還是你在看程序員如何找對象,但是此時通信狀況不好啊。回答加載不出來,頁面就空白的卡那了,回答加載不出來,你說急不急!那這樣咯,先給你看幾個回答,在你看的時候我再悄悄的加載其它的數據,那不就解決了嗎?就跟吃飯一個道理,你點了一桌子菜,難道菜全做好了再給你上嗎?肯定不會的呀,做好一道上一道嘛,對不對。
第三,從服務端的發送過來的ajax數據,體積比較小。瀏覽器知道怎么渲染它,這樣就減輕了服務端的壓力,讓客戶端,也就是瀏覽器承擔了一些任務。
Ajax技術的核心是XMLHttpRequest對象(簡稱XHR),可以通過使用XHR對象獲取到服務器的數據,然后再通過DOM將數據插入到頁面中呈現。雖然名字中包含XML,但Ajax通訊與數據格式無關,所以我們的數據格式可以是XML或JSON等格式。
XMLHttpRequest對象用於在后台與服務器交換數據,具體作用如下:
- 在不重新加載頁面的情況下更新網頁
- 在頁面已加載后從服務器請求數據
- 在頁面已加載后從服務器接收數據
- 在后台向服務器發送數據
2. Ajax對爬蟲有什么影響?
還是對應着上述的場景,我爬蟲肯定要爬取一個完整數據。但是你一次就只教我兩種找對象的方法。還不夠我舉一反三呢,萬一其中還有幾個段子,那這樣的數據不具有完整性,不夠全面。但是不滑動瀏覽器,數據不出來怎么辦?
更坑爹是什么,ajax加載出來的數據是通過瀏覽器渲染給我們的呀,源代碼不一定能找到我們要的數據。那該腫么辦!瀏覽器知道怎么加載, 我們不知道呀!
3.如何爬取這樣的ajax動態加載的網頁。
1. Selenium + PhantomJs
PhantomJS是一個無界面的,可腳本編程的WebKit瀏覽器引擎。它原生支持多種web 標准:DOM 操作,CSS選擇器,JSON,Canvas 以及SVG。它的作用是和瀏覽器類似,可以渲染js處理的頁面。
selenium是什么呢?它本來是個自動化測試工具,但是被廣泛的用戶爬蟲啊。它是一個工具,這個工具可以用代碼操作瀏覽器。比如控制瀏覽器的下滑之類。不過我並不是很熟悉,以前了解過一點。
不過,我沒用這種方法。為啥呢,因為慢。操作瀏覽器的時間加起來好多好多了唄,而且又不是沒有更好的辦法。
2. 自己找,找真實請求。
只要是有數據發送過來,那肯定是有發送到服務器的請求的吧。我們只需找出它悄悄加載出的頁面的真實請求在哪發送的。
尋找實例:爬取杭州蕭山機場一天的航班信息。
1)右鍵單擊查看網頁源碼,發現點擊“查看更多”之后的頁面源碼里沒有新出現的航班信息,所以猜測它是使用了Ajax技術。用Wireshark抓個包先。
2.尋找傳送XMLHttpRequest對象的參數。目測服務器是依據這個p值來選擇傳送的數據。
json格式檢測:http://www.bejson.com/