模拟Ajax请求实现动态数据爬取

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的属性。

分析请求

看请求:
在Chrome控制台中分析Ajax请求

看响应:
1202076-20190426103107428-153865314.png

模拟请求

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)       

转载于:https://www.cnblogs.com/lokvahkoor/p/10766168.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值