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)