【12】Ajax的原理和解析

一、前言? ? ? ??

二、什么是Ajax

?三、Ajax的基本原理

3.1 發送請求

3.2 解析內容

3.3 渲染網頁

3.4 總結?

四、Ajax 分析

五、過濾請求-篩選所有Ajax請求


一、前言? ? ? ??

????????當我們在用 requests 抓取頁面的時候,得到的結果可能會和在瀏覽器中看到的不一樣:在瀏覽器中正常顯示的頁面數據,使用 requests 卻沒有得到結果。這是因為 requests 獲取的都是原始 HTML 文檔,而瀏覽器中的頁面則是經過 JavaScript 數據處理后生成的結果。這些數據的來源有多種,可能是通過 Ajax 加載的,可能是包含在 HTML 文檔中的,也可能是經過 JavaScript 和特定算法計算后生成的。

????????數據加載是一種異步加載方式,原始頁面不會包含某些數據,只有在加載完后,才會向服務器請求某個接口獲取數據,然后數據才被處理從而呈現到網頁上,這個過程實際上就是向服務器接口發送了一個 Ajax 請求。

????????網頁的原始 HTML 文檔不會包含任何數據,數據都是通過 Ajax 統一加載后再呈現出來的,這樣在 Web 開發上可以做到前后端分離(在后端專欄中我們就用的ajax實現前后端分離),并且降低服務器直接渲染頁面帶來的壓力。

????????所以如果你遇到這樣的頁面,直接利用 requests 等庫來抓取原始頁面,是無法獲取有效數據的。這時我們需要分析網頁后臺向接口發送的 Ajax 請求,如果可以用 requests 來模擬 Ajax 請求,就可以成功抓取了。

????????所以,本課時我們就來了解什么是 Ajax 以及如何去分析和抓取 Ajax 請求。

二、什么是Ajax

????????Ajax,全稱為 Asynchronous JavaScript and XML,即異步的 JavaScript 和 XML。它不是一門編程語言,而是利用 JavaScript 在保證頁面不被刷新、頁面鏈接不改變的情況下與服務器交換數據并更新部分網頁的技術。

????????傳統的網頁,如果你想更新其內容,那么必須要刷新整個頁面。有了 Ajax,便可以在頁面不被全部刷新的情況下更新其內容。在這個過程中,頁面實際上在后臺與服務器進行了數據交互,獲取到數據之后,再利用 JavaScript 改變網頁,這樣網頁內容就會更新了。

????????可以到 W3School 上體驗幾個 Demo 來感受一下:http://www.w3school.com.cn/ajax/ajax_xmlhttprequest_send.asp。

舉例:

????????瀏覽網頁的時候,我們會發現很多網頁都有下滑查看更多的選項。以cqc老師的微博的主頁為例:https://m.weibo.cn/u/2830678474。我們切換到微博頁面,發現下滑幾個微博后,后面的內容不會直接顯示,而是會出現一個加載動畫,加載完成后下方才會繼續出現新的微博內容,這個過程其實就是 Ajax 加載的過程,如圖所示:

頁面其實并沒有整個刷新,這意味著頁面的鏈接沒有變化,但是網頁中卻多了新內容,也就是后面刷出來的新微博。這就是通過 Ajax 獲取新數據并呈現的過程。

?三、Ajax的基本原理

????????初步了解了 Ajax 之后,我們再來詳細了解它的基本原理。發送 Ajax 請求到網頁更新的過程可以簡單分為以下 3 步:發送請求、解析內容、渲染網頁
????????下面我們分別詳細介紹一下這幾個過程。

3.1 發送請求

?????????JavaScript 可以實現頁面的各種交互功能,Ajax 也不例外,它是由 JavaScript 實現的,發送請求的過程實際上執行了如下代碼:

var xmlhttp;if (window.XMLHttpRequest) {//code for IE7+, Firefox, Chrome, Opera, Safarixmlhttp=new XMLHttpRequest();} else {//code for IE6, IE5xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}xmlhttp.onreadystatechange=function() {if (xmlhttp.readyState==4 && xmlhttp.status==200) {document.getElementById("myDiv").innerHTML=xmlhttp.responseText;}}xmlhttp.open("POST","/ajax/",true);xmlhttp.send();

????????這是 JavaScript 對 Ajax 最底層的實現,這個過程實際上是? ? ?①新建了 XMLHttpRequest 對象,然后? ? ? ?②調用 onreadystatechange 屬性設置監聽,? ?③最后調用 open() 和 send() 方法向某個鏈接(也就是服務器)發送請求

????????前面我們用 Python 實現請求發送之后,可以得到響應結果,但這里請求的發送由 JavaScript 來完成。由于設置了監聽,所以當服務器返回響應時,onreadystatechange 對應的方法便會被觸發,我們在這個方法里面解析響應內容即可。

3.2 解析內容

????????得到響應之后,onreadystatechange 屬性對應的方法會被觸發,此時利用 xmlhttp 的 responseText 屬性便可取到響應內容。這類似于 Python 中利用 requests 向服務器發起請求,然后得到響應的過程。

????????返回的內容可能是 HTML,也可能是 JSON,接下來我們只需要在方法中用 JavaScript 進一步處理即可。比如,如果返回的內容是 JSON 的話,我們便可以對它進行解析和轉化。

3.3 渲染網頁

?????????JavaScript 有改變網頁內容的能力,解析完響應內容之后,就可以調用 JavaScript 針對解析完的內容對網頁進行下一步處理。比如,通過 document.getElementById().innerHTML 這樣的操作,對某個元素內的源代碼進行更改,這樣網頁顯示的內容就改變了,這種對 Document 網頁文檔進行如更改、刪除等操作也被稱作 DOM 操作

????????上例中,document.getElementById("myDiv").innerHTML=xmlhttp.responseText這個操作便將 ID 為 myDiv 的節點內部的 HTML 代碼更改為服務器返回的內容,這樣 myDiv 元素內部便會呈現出服務器返回的新數據,網頁的部分內容看上去就更新了。


3.4 總結?

????????可以看到,發送請求、解析內容和渲染網頁這 3 個步驟其實都是由 JavaScript 完成的。

????????再回想微博的下拉刷新,這其實是 JavaScript 向服務器發送了一個 Ajax 請求,然后獲取新的微博數據,將其解析,并將其渲染在網頁中的過程

????????因此,真實的數據其實都是通過一次次 Ajax 請求得到的,如果想要抓取這些數據,我們需要知道這些請求到底是怎么發送的,發往哪里,發了哪些參數。如果我們知道了這些,不就可以用 Python 模擬這個發送操作,獲取到其中的結果了嗎?

四、Ajax 分析

????????拖動刷新的內容由 Ajax 加載,而且頁面的 URL 沒有變化,這時我們應該到哪里去查看這些 Ajax 請求呢?

????????這里還需要借助瀏覽器的開發者工具,下面以 Chrome 瀏覽器為例來介紹。

????????用 Chrome 瀏覽器打開微博鏈接 https://m.weibo.cn/u/2830678474,隨后在頁面中點擊鼠標右鍵,從彈出的快捷菜單中選擇“檢查” 選項,此時便會彈出開發者工具,如圖所示:

這里就是頁面加載過程中瀏覽器與服務器之間發送請求和接收響應的所有記錄。


????????Ajax 有其特殊的請求類型,它叫作 xhr。在圖中我們可以發現一個以 getIndex 開頭的請求,其 Type 為 xhr,這就是一個 Ajax 請求。用鼠標點擊這個請求,可以查看這個請求的詳細信息。

????????在右側可以觀察到 Request Headers、URL 和 Response Headers 等信息。Request Headers 中有一個信息為 X-Requested-With:XMLHttpRequest,這就標記了此請求是 Ajax 請求,如圖所示:


??????????隨后我們點擊 Preview,即可看到響應的內容,它是 JSON 格式的。這里 Chrome 為我們自動做了解析,點擊箭頭即可展開和收起相應內容。

????????我們可以觀察到,返回結果是cqc老師微博的個人信息,包括昵稱、簡介、頭像等,這也是用來渲染個人主頁所使用的數據。JavaScript 接收到這些數據之后,再執行相應的渲染方法,整個頁面就渲染出來了。


Response 選項卡,從中可以觀察到真實的返回數據,切回到第一個請求,觀察一下它的 Response 是什么,如圖所示:

????????這就是最原始鏈接?https://m.weibo.cn/u/2830678474?返回的結果,結構非常簡單,只是執行了一些 JavaScript。所以說,我們看到的微博頁面的真實數據并不是最原始的頁面返回的,而是在執行 JavaScript 后再次向后臺發送 Ajax 請求,瀏覽器拿到數據后進一步渲染出來的。

五、過濾請求-篩選所有Ajax請求

????????接下來,我們再利用 Chrome 開發者工具的篩選功能篩選出所有的 Ajax 請求。在請求的上方有一層篩選欄,直接點擊 XHR,此時在下方顯示的所有請求便都是 Ajax 請求了,如圖所示:

????????接下來,不斷滑動頁面,可以看到頁面底部有一條條新的微博被刷出,而開發者工具下方也不斷地出現 Ajax 請求,這樣我們就可以捕獲到所有的 Ajax 請求了。


????????隨意點開一個條目,都可以清楚地看到其 Request URL、Request Headers、Response Headers、Response Body 等內容,此時想要模擬請求和提取就非常簡單了。

下圖所示的內容便是某一頁微博的列表信息:

一段 JSON 結構化數據?:

ok: 1---表示 API 請求成功,返回了有效數據。

data:這是包含微博數據的主要對象。

  • cardlistInfo

    • ?????該對象包含列表的元信息,如微博數量、分頁參數等。

    • containerid: "1076032830678474"
      微博列表的唯一 ID(可能是用戶 ID)。

    • v_p: 42
      可能是版本或分頁相關的參數。

    • show_style: 1
      控制微博列表的顯示樣式。

    • total: 2090
      表示該用戶的總微博數為 2090 條。

    • autoLoadMoreIndex: 10
      自動加載的分頁索引。

    • since_id: 5128176110668256
      用于分頁的 since_id,下次請求可以用它獲取更早的微博。

  • cards(微博數據列表,每條微博有 ID、發布時間、URL 等)

  • scheme(微博 APP 內部跳轉鏈接)

????????到現在為止,我們已經可以分析出 Ajax 請求的一些詳細信息了,接下來只需要用程序模擬這些 Ajax 請求,就可以輕松提取我們所需要的信息了。

???????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75190.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75190.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75190.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【 <二> 丹方改良:Spring 時代的 JavaWeb】之 Spring Boot 中的安全性:使用 Spring Security 實現認證與授權

<前文回顧> 點擊此處查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、開篇整…

百元不入耳藍牙耳機哪個品牌好用?2025百元不入耳耳機品牌推薦

在選擇藍牙耳機時&#xff0c;許多用戶開始關注不入耳式設計&#xff0c;不僅能避免耳道不適&#xff0c;還能保持對環境音的感知&#xff0c;提升運動、通勤或日常使用的安全性。而在百元價位中&#xff0c;不入耳式耳機的品牌眾多&#xff0c;產品質量參差不齊&#xff0c;如…

如何加強 SSH 安全:內網和專用網絡環境下的防護策略

文章目錄 如何加強 SSH 安全&#xff1a;內網和專用網絡環境下的防護策略限制訪問來源通過防火墻或安全組限制網絡策略&#xff08;Network Policy&#xff09; 禁用密碼登錄&#xff0c;使用密鑰認證啟用 Fail2ban 或 SSH 防爆破限制 SSH 用戶更改 SSH 端口使用跳板機&#xf…

ngx_monotonic_time

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_monotonic_time函數-CSDN博客 定義在 src\core\ngx_times.c static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec) { #if (NGX_HAVE_CLOCK_MONOTONIC)struct timespec ts;#if defined(CLOCK_MONOTONIC_FAST)clock_get…

【Trick】論文畫圖的icon來源

0&#xff1a;起因 群友在群里發了這種很好看的論文主圖 其中不乏有很多icon&#xff0c;比如open-ai、機器人的 于是想知道應該如何找到&#xff0c;便有了后文 1&#xff1a;網址 阿里巴巴矢量圖標庫&#xff1a;iconfont-阿里巴巴矢量圖標庫 2&#xff1a;使用方法 可…

前端 技術棧

前端 技術棧 ChatGPT 說&#xff1a; 好咧&#xff0c;說到前端技術棧&#xff0c;這一塊現在確實百花齊放&#xff0c;有點卷&#xff0c;但也超靈活。下面我來給你梳理一套2025年主流、實用、好上手的前端技術棧組合&#xff0c;按層級分類&#xff0c;一目了然&#xff1a;…

vue3 根據城市名稱計算城市之間的距離

<template><div class"distance-calculator"><h1>城市距離計算器</h1><!-- 城市輸入框 --><div class"input-group"><inputv-model"city1"placeholder"請輸入第一個城市"keyup.enter"cal…

Java安全-FastJson反序列化分析

FastJson介紹 Fastjson 是阿里巴巴推出的一款高性能 JSON 序列化/反序列化庫&#xff0c;由于其便捷性被廣泛應用于 Java 項目中 FastJson使用 package org.example;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject;public class FastjsonDemo {…

查看npm安裝了哪些全局依賴

查看npm安裝了哪些全局依賴 在macOS上&#xff0c;如果你想要查看通過npm全局安裝的依賴包&#xff0c;你可以使用以下幾種方法&#xff1a; 方法1&#xff1a;使用命令行 打開你的終端&#xff08;Terminal&#xff09;&#xff0c;然后輸入以下命令&#xff1a; npm list -…

告別代碼Bug,GDB調試工具詳解

在軟件開發的漫漫長路上&#xff0c;Bug 就像隱藏在黑暗中的 “小怪獸”&#xff0c;時不時跳出來給開發者們制造麻煩。曾經&#xff0c;歐洲航天局&#xff08;ESA&#xff09;首次發射阿麗亞娜 5 號火箭&#xff0c;這本是太空探索史上的重要時刻&#xff0c;卻因一行代碼導致…

LangChain4j(2):整合SpringBoot

1 新建Springboot項目 1.1 引入依賴 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0…

移動端六大語言速記:第2部分 - 控制結構

移動端六大語言速記&#xff1a;第2部分 - 控制結構 本文繼續對比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift這六種移動端開發語言的控制結構&#xff0c;幫助開發者快速掌握各語言的語法差異。 2. 控制結構 2.1 條件語句 各語言條件語句的語法對比&#xff1a; …

Linux-線程概念與線程控制的常用操作

一.Linux線程概念 1-1.線程是什么 在Linux中&#xff0c;線程是基于Linux原有的進程實現的。本質是輕量級進程(LWP)。在?個程序?的?個執?路線就叫做線程&#xff08;thread&#xff09;。更準確的定義是&#xff1a;線程是“?個進程內部的控制序列”。 我們之前所學習的進…

dfs記憶化搜索刷題 + 總結

文章目錄 記憶化搜索 vs 動態規劃斐波那契數題解代碼 不同路徑題解代碼 最長遞增子序列題解代碼 猜數字大小II題解代碼 矩陣中的最長遞增路徑題解代碼 總結 記憶化搜索 vs 動態規劃 1. 記憶化搜索&#xff1a;有完全相同的問題/數據保存起來&#xff0c;帶有備忘錄的遞歸 2.記憶…

【HTML】驗證與調試工具

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;HTML CSS JavaScript 文章目錄 1. HTML 驗證工具概述1.1 驗證的重要性1.2 常見 HTML 錯誤類型 2. W3C 驗證服務2.1 W3C Markup Validation Service2.2 使用 W3C 驗證器2.3 驗證結果解讀 3. 瀏覽器開發者工具3.1 Chrome DevTools…

認識rand, srand, time函數,生成隨機數

要完成猜數字游戲&#xff0c;首先要生成隨機數&#xff0c;那么該怎么生成隨機數&#xff1f;、 1.rand函數 rand函數是庫函數&#xff0c;使用的時候要使用頭文件stdlib.h c語言中&#xff0c;提供了rand函數來生成隨機數&#xff0c;來看一下函數使用&#xff1a; 但是r…

BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多變量時序預測(Matlab)

BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多變量時序預測&#xff08;Matlab&#xff09; 目錄 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多變量時序預測&#xff08;Matlab&#xff09;預測效果基本介紹程序設計參考資料 預測效果 基本介紹 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多…

Go語言從零構建SQL數據庫引擎(2)

SQL標準與數據庫系統實現差異 在上一節中&#xff0c;我們了解了關系型數據庫的基礎概念。現在&#xff0c;讓我們深入探討SQL語言標準以及不同數據庫系統之間的實現差異。 SQL語言的誕生與演進 想象你經營的咖啡店生意蒸蒸日上&#xff0c;需要一個更強大的系統來管理數據。…

智能導診系統的技術體系組成

智能導診系統的技術體系由基礎支撐技術、核心交互技術、應用場景技術及安全保障技術構成&#xff0c;具體可歸納為以下六個維度&#xff1a; 一、基礎支撐技術 1、AI大模型與深度學習 醫療大模型&#xff1a;如騰訊醫療AI、DeepSeek等&#xff0c;通過海量醫學文獻和病例訓…

QML輸入控件: TextField(文本框)的樣式定制

目錄 引言示例簡介示例代碼與關鍵點示例1&#xff1a;基礎樣式定制示例2&#xff1a;添加圖標示例3&#xff1a;交互式元素&#xff08;清除按鈕&#xff09; 實現要點總結完整工程下載 引言 在Qt Quick應用程序開發中&#xff0c;文本輸入是最常見的用戶交互方式之一。TextFi…