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


1. AJAX

1.1 什么是AJAX

AJAX即“Asynchronous JavaScript And XML”(異步JavaScript和XML)可以使網頁實現異步更新,就是不重新加載整個網頁的情況下,對網頁的某部分進行更新(局部刷新)。傳統的網頁(不使用AJAX)如果需要更新內容,必須重載整個網頁頁面。

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

1.2 同步和異步

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

異步現象:客戶端發送請求到服務器端,無論服務器是否返回響應,客戶端都可以隨意做其他事情,不會被卡死。

 

1.3 AJAX原理分析

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

1.2通過AJAX引擎確定請求路徑和請求參數

1.3通知AJAX引擎發送請求

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

2.1服務器獲得請求參數

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

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案例我會在下一章寫出來的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM