Python3爬蟲(chóng)中Ajax的用法
Ajax,全稱(chēng)為Asynchronous JavaScript and XML,即異步的JavaScript和XML。它不是一門(mén)編程語(yǔ)言,而是利用JavaScript在保證頁(yè)面不被刷新、頁(yè)面鏈接不改變的情況下與服務(wù)器交換數(shù)據(jù)并更新部分網(wǎng)頁(yè)的技術(shù)。
對(duì)于傳統(tǒng)的網(wǎng)頁(yè),如果想更新其內(nèi)容,那么必須要刷新整個(gè)頁(yè)面,但有了Ajax,便可以在頁(yè)面不被全部刷新的情況下更新其內(nèi)容。在這個(gè)過(guò)程中,頁(yè)面實(shí)際上是在后臺(tái)與服務(wù)器進(jìn)行了數(shù)據(jù)交互,獲取到數(shù)據(jù)之后,再利用JavaScript改變網(wǎng)頁(yè),這樣網(wǎng)頁(yè)內(nèi)容就會(huì)更新了。
可以到W3School上體驗(yàn)幾個(gè)示例來(lái)感受一下:http://www.w3school.com.cn/ajax/ajax_xmlhttprequest_send.asp。
1. 實(shí)例引入
瀏覽網(wǎng)頁(yè)的時(shí)候,我們會(huì)發(fā)現(xiàn)很多網(wǎng)頁(yè)都有下滑查看更多的選項(xiàng)。比如,拿微博來(lái)說(shuō),我們以我的個(gè)人的主頁(yè)為例:https://m.weibo.cn/u/2830678474,切換到微博頁(yè)面,一直下滑,可以發(fā)現(xiàn)下滑幾個(gè)微博之后,再向下就沒(méi)有了,轉(zhuǎn)而會(huì)出現(xiàn)一個(gè)加載的動(dòng)畫(huà),不一會(huì)兒下方就繼續(xù)出現(xiàn)了新的微博內(nèi)容,這個(gè)過(guò)程其實(shí)就是Ajax加載的過(guò)程,如圖6-1所示。

我們注意到頁(yè)面其實(shí)并沒(méi)有整個(gè)刷新,也就意味著頁(yè)面的鏈接沒(méi)有變化,但是網(wǎng)頁(yè)中卻多了新內(nèi)容,也就是后面刷出來(lái)的新微博。這就是通過(guò)Ajax獲取新數(shù)據(jù)并呈現(xiàn)的過(guò)程。
2. 基本原理
初步了解了Ajax之后,我們?cè)賮?lái)詳細(xì)了解它的基本原理。發(fā)送Ajax請(qǐng)求到網(wǎng)頁(yè)更新的這個(gè)過(guò)程可以簡(jiǎn)單分為以下3步:
(1) 發(fā)送請(qǐng)求; (2) 解析內(nèi)容; (3) 渲染網(wǎng)頁(yè)。
下面我們分別來(lái)詳細(xì)介紹這幾個(gè)過(guò)程。
發(fā)送請(qǐng)求
我們知道JavaScript可以實(shí)現(xiàn)頁(yè)面的各種交互功能,Ajax也不例外,它也是由JavaScript實(shí)現(xiàn)的,實(shí)際上執(zhí)行了如下代碼:
var xmlhttp;
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
} else {// code for IE6, IE5
xmlhttp=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對(duì)Ajax最底層的實(shí)現(xiàn),實(shí)際上就是新建了XMLHttpRequest對(duì)象,然后調(diào)用onreadystatechange屬性設(shè)置了監(jiān)聽(tīng),然后調(diào)用open()和send()方法向某個(gè)鏈接(也就是服務(wù)器)發(fā)送了請(qǐng)求。前面用Python實(shí)現(xiàn)請(qǐng)求發(fā)送之后,可以得到響應(yīng)結(jié)果,但這里請(qǐng)求的發(fā)送變成JavaScript來(lái)完成.由于設(shè)置了監(jiān)聽(tīng),所以當(dāng)服務(wù)器返回響應(yīng)時(shí),onreadystatechange對(duì)應(yīng)的方法便會(huì)被觸發(fā),然后在這個(gè)方法里面解析響應(yīng)內(nèi)容即可。
解析內(nèi)容
得到響應(yīng)之后,onreadystatechange屬性對(duì)應(yīng)的方法便會(huì)被觸發(fā),此時(shí)利用xmlhttp的responseText屬性便可取到響應(yīng)內(nèi)容。這類(lèi)似于Python中利用requests向服務(wù)器發(fā)起請(qǐng)求,然后得到響應(yīng)的過(guò)程。那么返回內(nèi)容可能是HTML,可能是JSON,接下來(lái)只需要在方法中用JavaScript進(jìn)一步處理即可。比如,如果是JSON的話(huà),可以進(jìn)行解析和轉(zhuǎn)化。
渲染網(wǎng)頁(yè)
JavaScript有改變網(wǎng)頁(yè)內(nèi)容的能力,解析完響應(yīng)內(nèi)容之后,就可以調(diào)用JavaScript來(lái)針對(duì)解析完的內(nèi)容對(duì)網(wǎng)頁(yè)進(jìn)行下一步處理了。比如,通過(guò)document.getElementById().innerHTML這樣的操作,便可以對(duì)某個(gè)元素內(nèi)的源代碼進(jìn)行更改,這樣網(wǎng)頁(yè)顯示的內(nèi)容就改變了,這樣的操作也被稱(chēng)作DOM操作,即對(duì)Document網(wǎng)頁(yè)文檔進(jìn)行操作,如更改、刪除等。
上例中,document.getElementById("myDiv").innerHTML=xmlhttp.responseText便將ID為myDiv的節(jié)點(diǎn)內(nèi)部的HTML代碼更改為服務(wù)器返回的內(nèi)容,這樣myDiv元素內(nèi)部便會(huì)呈現(xiàn)出服務(wù)器返回的新數(shù)據(jù),網(wǎng)頁(yè)的部分內(nèi)容看上去就更新了。
我們觀察到,這3個(gè)步驟其實(shí)都是由JavaScript完成的,它完成了整個(gè)請(qǐng)求、解析和渲染的過(guò)程。
再回想微博的下拉刷新,這其實(shí)就是JavaScript向服務(wù)器發(fā)送了一個(gè)Ajax請(qǐng)求,然后獲取新的微博數(shù)據(jù),將其解析,并將其渲染在網(wǎng)頁(yè)中。
因此,我們知道,真實(shí)的數(shù)據(jù)其實(shí)都是一次次Ajax請(qǐng)求得到的,如果想要抓取這些數(shù)據(jù),需要知道這些請(qǐng)求到底是怎么發(fā)送的,發(fā)往哪里,發(fā)了哪些參數(shù)。如果我們知道了這些,不就可以用Python模擬這個(gè)發(fā)送操作,獲取到其中的結(jié)果了嗎?
在下一節(jié)中,我們就來(lái)了解下到哪里可以看到這些后臺(tái)Ajax操作,去了解它到底是怎么發(fā)送的,發(fā)送了什么參數(shù)。
以上就是Python3爬蟲(chóng)中Ajax的用法的詳細(xì)內(nèi)容,更多關(guān)于Python3中Ajax是什么的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
通過(guò)pykafka接收Kafka消息隊(duì)列的方法
今天小編就為大家分享一篇通過(guò)pykafka接收Kafka消息隊(duì)列的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
python3.6利用pyinstall打包py為exe的操作實(shí)例
今天小編就為大家分享一篇python3.6利用pyinstall打包py為exe的操作實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
Python實(shí)現(xiàn)將內(nèi)容寫(xiě)入文件的五種方法總結(jié)
本篇帶你詳細(xì)看一下python將內(nèi)容寫(xiě)入文件的方法以及細(xì)節(jié),主要包括write()方法、writelines()?方法、print()?函數(shù)、使用?csv?模塊、使用?json?模塊,需要的可以參考一下2023-04-04
使用python查找替換PowerPoint演示文稿中的文本
演示文稿已成為商務(wù)會(huì)議、學(xué)術(shù)報(bào)告和教育培訓(xùn)中不可或缺的一部分,而PowerPoint演示文稿作為行業(yè)標(biāo)準(zhǔn)工具,更是承載著無(wú)數(shù)創(chuàng)意與信息的載體,本文將介紹如何使用Python來(lái)精確查找并替換PowerPoint演示文稿中的文本,需要的朋友可以參考下2024-07-07
Python使用JSON庫(kù)解析JSON數(shù)據(jù)的方法
這篇文章主要介紹了Python使用JSON庫(kù)解析JSON數(shù)據(jù),主要包括如何在網(wǎng)頁(yè)中獲取json數(shù)據(jù)及python內(nèi)置的json庫(kù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06

