zoukankan      html  css  js  c++  java
  • 模拟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请求

    看响应:

    模拟请求

    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)       
    
  • 相关阅读:
    javascript:浮动div,可拖拽div,遮罩层(div和iframe实现)
    c#委托初探
    工业化生产:简单工厂、工厂方法和抽象工厂模式
    javascript:面向对象编程基础:多态
    sql server:自定义函数初探
    ajax:数据传输方式简介
    javascript:对cookie的基本操作
    javascript:内置对象学习笔记一
    保证一个类仅有一个实例:单例模式
    ajax:简单搜索实践篇
  • 原文地址:https://www.cnblogs.com/lokvahkoor/p/10766168.html
Copyright © 2011-2022 走看看