爬蟲(十):AJAX、爬取AJAX數據

1. AJAX

1.1 什麼是AJAX

AJAX即「Asynchronous JavaScript And XML」(異步JavaScript和XML)可使網頁實現異步更新,就是不從新加載整個網頁的狀況下,對網頁的某部分進行更新(局部刷新)。傳統的網頁(不使用AJAX)若是須要更新內容,必須重載整個網頁頁面。html

AJAX = 異步JavaScript和XML,是一種新的思想,整合以前的多種技術,用於建立快速交互式網頁應用的頁面開發技術。ajax

1.2 同步和異步

同步現象:客戶端發送請求到服務器端,當服務器返回響應以前,客戶端都處於等待卡死狀態。chrome

異步現象:客戶端發送請求到服務器端,不管服務器是否返回響應,客戶端均可以隨意作其餘事情,不會被卡死。json

 

1.3 AJAX原理分析

1.1使用JavaScript得到瀏覽器內置的AJAX引擎(XMIHttpRequest對象)瀏覽器

1.2經過AJAX引擎肯定請求路徑和請求參數服務器

1.3通知AJAX引擎發送請求異步

AJAX引擎會在不刷新瀏覽器地址欄的狀況下,發送請求函數

2.1服務器得到請求參數工具

2.2服務器處理請求參數(添加、查詢等操做)post

2.3服務器響應數據給瀏覽器

AJAX引擎得到服務器響應的數據,經過執行JavaScript的回調函數將數據傳遞給瀏覽器頁面。

3.1經過設置給AJAX引擎的回調函數得到服務器響應的數據

3.2使用JavaScript在指定的位置,顯示響應數據,從而局部修改頁面的數據,達到局部刷新目。

2. 爬取AJAX數據

2.1 查看AJAX數據

目前不少網站都使用ajax技術動態加載數據,和常規的網站不同,數據時動態加載的,若是咱們使用常規的方法爬取網頁,獲得的只是一堆html代碼,沒有任何的數據。

import requests
from urllib.parse import urlencode

url = 'http://www.baidu.com/'
headers = {
    'USER-AGENT':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}

response = requests.get(url,headers=headers)
print(response.text)

上面的代碼是爬取百度首頁,並打印出get方法返回的文本內容以下圖所示,只有一堆網頁代碼,沒有任何新聞信息。

 

 內容過多,只截取部份內容,有興趣的朋友能夠執行上面的代碼看下效果。 

對於使用ajax動態加載數據的網頁要怎麼爬取呢?咱們先看下百度是如何使用ajax加載數據的。經過chrome的開發者工具來看數據加載過程。

首先打開chrome瀏覽器,打開開發者工具,點擊Network選項,點擊XHR選項,而後輸入網址:https://www.baidu.com/,點擊Preview選項卡,就會看到經過ajax請求返回的數據,Name那一欄就是ajax請求,當鼠標向下滑動時,就會出現多條ajax請求:

 

經過上圖咱們知道ajax請求返回的是json數據。

2.2 爬取AJAX數據

爬取AJAX有兩種方式:

1.直接分析AJAX調用的接口。而後經過代碼請求這個接口。

2.使用selenium+瀏覽器驅動模擬瀏覽器行爲獲取數據。

分析接口:

優勢:直接能夠請求到數據。不須要作一些解析工做。代碼量少,性能高。

缺點:分析接口比較負責,特別是一些經過JS混淆的接口,要有必定的JS功底。容易被發現是爬蟲。

selenium:

優勢:直接模擬瀏覽器的行爲。瀏覽器能請求到的,使用selenium也能請求到。爬蟲更穩定。

缺點:代碼量多。性能低。

分析接口的案例呢,就找了下大佬寫的案例了。

一塊兒學爬蟲——如何爬取經過ajax加載數據的網站

selenium案例我會在下一章寫出來的。

相關文章
相關標籤/搜索