• Python网络爬虫(三)


    AJAX学习

    AJAX=Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。通俗来说,AJAX是一种无需加载整个网页的情况下,通过在后台与服务器进行少量数据交换,更新部分网页的技术,用于创建快速动态网页的技术。

    向服务器发送请求与服务器的响应

    发送请求可以利用XMLHttpRequest对象的open()和send()方法。

    方法 描述
    open(method,url,async) 规定请求的类型、URL 以及是否异步处理请求。method:请求的类型;GET 或 POST;url:文件在服务器上的位置;async:true(异步)或 false(同步)
    send(string) 将请求发送到服务器。string:仅用于 POST 请求

    服务器的响应需要使用XMLHttpRequest对象的responseText或responseXML属性。

    属性 描述
    responseText 获得字符串形式的响应数据。
    responseXML 获得 XML 形式的响应数据。

    下面有一段简单的代码:

    <html>
    <head>
    <script type="text/javascript">
    function loadXMLDoc()
    {
    var xmlhttp;
    if (window.XMLHttpRequest)
      {
      xmlhttp=new XMLHttpRequest();
      }
    
    xmlhttp.onreadystatechange=function()
      {
      if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
        document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
        }
    if(xmlhttp.status==404)
    {
    document.write("The file doesn't exist.");
    }
      }
    xmlhttp.open("POST","/ajax/demo.asp",true);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.send("fname=Bill&lname=Gates");
    }
    </script>
    </head>
    <body>
    
    <h2>我的一个测试案例</h2>
    <button type="button" onclick="loadXMLDoc()">发出请求</button>
    <div id="myDiv"></div>
     
    </body>
    </html>
    

    可以在w3wschool测试网站看到相应的用法。
    代码中有xmlhttp.onreadystatechange=function(),其中的onreadystatechange是一个事件,意思为当readyState发生改变时,onreadystatechange事件会自动触发。下面是XMLHttpRequest对象的三个重要的属性:

    属性 描述
    onreadystatechange 存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
    readyState 存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。0: 请求未初始化;1: 服务器连接已建立;2: 请求已接收;3: 请求处理中;4: 请求已完成,且响应已就绪
    status 200: "OK";404: 未找到页面

    xmlhttprequest.png

    网络爬虫相关

    python角度分析AJAX

    下面我们从python爬虫的角度对AJAX进行思考,可以分为发送请求->解析内容->渲染网页三个步骤。其中发送请求,是使用javascript的代码进行实现,新建了XMLHttpRequest对象,然后利用onreadystatechange属性设置了监听,然后再用open()和send()方法发送请求,而我们在python中是请求后直接可以得到响应结果。解析内容是在发送请求并收到服务器的响应后,onreadystatechange事件又再一次被触发,此时利用xmlhttp的responseText属性就可以获取响应的内容。类似于 Python 中利用 Requests向服务器发起了一个请求,然后得到响应的过程。那么返回内容可能是 HTML,可能是 Json,接下来只需要在方法中用 JavaScript 进一步处理即可。最后一个步骤是渲染网页,我们都知道javascript可以更改网页内容,而代码中document.getElementById().innerHTM这样的操作就是对某个元素内的源代码进行更改,这样网页显示的内容就发生了改变;这是对Document网页文档进行了操作,即DOM操作。在python中我们同样的也是利用beautifulsoup库解析了网页后,查找其中的节点然后进行提取,AJAX只不过在对应的节点处更改为服务器返回的内容,这样原网页的代码量很少,但是渲染的时候是通过服务器的响应进行渲染的。

    AJAX分析

    首先我们在浏览器中进入F12开发者模式,进入存储并刷新一个页面(这里以用FireFox打开微博为例),会出现很多请求,这实际上就是在页面加载过程中浏览器与服务器之间发送 Request 和接收 Response 的所有记录。
    document显示.png
    而AJAX请求类型为xhr,可以看到有下面3条请求,我们随便点进去一个进行查看:
    xhr.png

    响应格式为json.png
    而我们所有请求的第一个则是网页的源代码,基本上只是写出了节点,没有渲染的代码。当我们加载新内容的时候,会出现新的AJAX请求,比如笔者这里提供三个请求地址:

    https://m.weibo.cn/api/container/getIndex?type=uid&value=2145291155&containerid=1005052145291155
    
    https://m.weibo.cn/api/container/getIndex?type=uid&value=2145291155&containerid=1076032145291155
    
    https://m.weibo.cn/api/container/getIndex?type=uid&value=2145291155&containerid=1076032145291155&page=2
    

    每次更新都会有新的请求。所以我们需要利用python来实现AJAX请求的模拟,从而实现数据的抓取。

    Python提取AJAX数据

    首先分析一下上面笔者列出的三个请求地址,发现地址都包含有type、value、containerid与page,前两个地址加上page=1也是可以请求的,浏览器自动省略了而已。观察一下这些请求,发现它们的 type、value、containerid 始终如一。type 始终为 uid,value的值就是页面的链接中的数字,其实这就是用户的 id,另外还有一个containerid,经过观察发现它就是 107603 然后加上用户id。所以改变的值就是 page,很明显这个参数就是用来控制分页的,page=1 代表第一页,page=2 代表第二页,以此类推。
    mblog.png
    那么我们只需要以这些参数作为请求参数请求然后抓取json数据就行了。

    作者:YunLambert

    -------------------------------------------

    个性签名:一名会音乐、爱健身的不合格程序员

    可以Follow博主的Github哦(っ•̀ω•́)っ✎⁾⁾

  • 相关阅读:
    [CF1106E] 边界有问题
    UOJ 67 新年的毒瘤
    BZOJ 1093 [ZJOI2007]最大半连通子图
    codeforces round#510
    codeforces round#509
    杂谈
    BZOJ 3007 [SDOI2012]拯救小云公主
    BZOJ 1799
    BZOJ 3329
    BZOJ 3209 花神的数论题
  • 原文地址:https://www.cnblogs.com/yunlambert/p/8729419.html
Copyright © 2020-2023  润新知