Ajax的基本原理

菜鳥教程的程式碼為例:

  • XMLHTTPRequest物件是JS對Ajax的底層實現:
    var xmlhttp;
if (window.XMLHttpRequest)
{
// IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行程式碼
xmlhttp=new XMLHttpRequest();
}
else
{
// IE6, IE5 瀏覽器執行程式碼
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
  • 呼叫onreadystatechange屬性實現響應監聽:
    xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
  • 呼叫open()和send()方法向伺服器傳送請求:
	xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);
xmlhttp.send();

綜上,Ajax資料爬取的關鍵是JS分析,只要找到JS的請求引數,我們就能模擬Ajax請求,從而得到響應資料

Ajax分析方法

檢視請求

在開發者工具的“網路/Network”模組下檢視所有請求和響應,其中,type為xhr的就是Ajax請求。隨著我們與網頁的不斷互動,這些請求會不斷增加。

在請求的具體內容中,我們可以看到它的Request Headers中有一個X-Requested-With: XMLHttpRequest的屬性。

分析請求

看請求:

看響應:

模擬請求

from urllib.parse import urlencode  # 用來把引數字典快速轉化成url
import requests
from pyquery import PyQuery as pq base_url = 'https://m.weibo.cn/api/container/getIndex?' # 在Headers選項卡下的General欄中看到 headers = {
'Host': 'm.weibo.cn', # host引數指明瞭請求的目的地
'Referer': 'https://m.weibo.cn/u/2830678474', # 這個引數可以在控制檯的請求頭裡看到
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest', # 這個引數是Ajax請求的標誌
} def get_page(page):
params = {
'type': 'uid',
'value': '2830678474',
'containerid': '1005052830678474',
#'since_id': '4364324522484439', # 控制翻頁的引數
}
url = base_url + urlencode(params) # 利用urlencode把引數字典快速轉化成url
try:
response = requests.get(url, headers=headers) # 其他操作與普通請求一致
if response.status_code == 200:
return response.json()
except requests.ConnectionError as e:
print('Error', e.args) get_page(1)