当前位置:   article > 正文

我的Python学习笔记:关于爬虫(四)

我的Python学习笔记:关于爬虫(四)

五、爬取Ajax数据

  • 为了实现前后端分离,越来越多的网站使用Ajax制作动态页面。
  • 在这种情况下,原始页面获取不到有效数据,需要模拟Ajax请求获取数据。
1. 关于Ajax
  • Ajax即异步的JavaScript和XML(Asynchronous JavaScript and XML), 是一种创建交互式网页应用的网页开发技术。
  • Ajax利用JS实现在页面不刷新,链接不改变的情况下与服务器交换数据并更新部分网页的能力。
  • 前台:HTML + JS + AJAX

**

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>sample</title>
    <script type="text/javascript">
        var xmlHttp;

        function createXmlHttpRequest()
        {
            //创建XMLHttpRequest对象的方法
            xmlHttp = new XMLHttpRequest();
            xmlHttp.onreadystatechange = readyStateChangeHandle;
            xmlHttp.open("GET","helloworld.xml",true);
            xmlHttp.send(null);
        }

        function readyStateChangeHandle()
        {   //如果完成读取
            if(xmlHttp.readyState == 4)
            {   //如果请求状态码为200
                if(xmlHttp.status == 200)
                {
                    var div = document.getElementById("div");
                    //接收服务器响应
                    var xmlDoc = xmlHttp.responseXML;
                    //解析服务器响应
                    var data = xmlDoc.getElementsByTagName("data")[0].firstChild.nodeValue;
                    div.innerHTML = "<i>"+data+"</i>";
                }
            }
        }
    </script>
  </head>
  <body>
    <div id="div" style="display:flex;align-items: center;justify-content: center"></div>
    <div align="center" style="width:100%">
      <input type="button" value="获取后台数据" id="btn1" onclick="createXmlHttpRequest()">
    </div>
  </body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 后台:xml

**

<?xml version="1.0" encoding="UTF-8"?>
<HelloWorld>
    <data>
        HelloWorld from server!
    </data>
</HelloWorld>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 效果

2. 观察Ajax请求
  • Ajax请求的类型为XHR,在header中可以找到x-requested-with: XMLHttpRequest

  • 打开浏览器 -> 打开网页 -> 按f12 - > 切换到netword选项卡 -> 切换到xhr子选项卡 -> 触发Ajax- > 获得请求

  • 以头条网搜索(https://www.toutiao.com/search)为例。

  • 通过观察请求内容,可以获得请求的url和参数。

4. 爬取Ajax数据
  • 用Python模拟浏览器发出Ajax请求:

**

>>>import requests
>>>from urllib.parse import urlencode

>>>base_url = 'https://www.toutiao.com/api/search/content/?'
>>>headers={
>>>    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
>>>    'x-Requested-With':'XMLHttpRequest'
>>>}

>>>def get_page():
>>>    # 获取ajax数据
>>>    params = {
>>>        'aid':'24',
>>>        'app_name':'web_search',
>>>        'offset':'0',
>>>        'format':'json',
>>>        'keyword':'天问',
>>>        'autoload':'true',
>>>        'count':'20',
>>>        'en_qc':'1',
>>>        'cur_tab':'1',
>>>        'from':'search_tab',
>>>        'pd':'synthesis',
>>>        'timestamp':'1595555856284',
>>>        '_signature':'dmnSBgAgEBCwPmuLZGUZj3ZokxAACl20erea8yVotjl6bt0QyPm3C0IitmjZPdNLeqVl - m. - Anc.JeDoNUPwmgSxIQAjLH87GiPqebGl3ewifL.FLPgoxpud29vpujvqaIt'
>>>    }
>>>    url = base_url + urlencode(params)
>>>    try:
>>>        response = requests.get(url,headers=headers)
>>>        if(response.status_code == 200):
>>>            return response.json()
>>>    except requests.ConnectionError as e:
>>>        print('Error',e.args)

>>>if __name__ == '__main__':
>>>    data = get_page()
>>>    print(len(data))
26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 解析数据:

**

>>>import requests
>>>from urllib.parse import urlencode

>>>base_url = 'https://www.toutiao.com/api/search/content/?'
>>>headers={
>>>    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
>>>    'x-Requested-With':'XMLHttpRequest'
>>>}

>>>def parse_page(func):
>>>    # 解析数据
>>>    def deco(*args, **kwargs):
>>>        data = filter(lambda x:x.get('abstract'),func(*args, **kwargs).get('data')) # 获取并过滤数据
>>>        result = []
>>>        for d in data:
>>>            message = {}
>>>            message['title'] = d.get('title')
>>>            message['from'] = d.get('media_name')
>>>            message['datetime'] = d.get('datetime')
>>>            message['read_count'] = d.get('read_count')
>>>            result.append(message)
>>>        return result
>>>    return deco

>>>@parse_page
>>>def get_page():
>>>    # 获取ajax数据
>>>    params = {
>>>        'aid':'24',
>>>        'app_name':'web_search',
>>>        'offset':'0',
>>>        'format':'json',
>>>        'keyword':'天问',
>>>        'autoload':'true',
>>>        'count':'20',
>>>        'en_qc':'1',
>>>        'cur_tab':'1',
>>>        'from':'search_tab',
>>>        'pd':'synthesis',
>>>        'timestamp':'1595555856284',
>>>        '_signature':'dmnSBgAgEBCwPmuLZGUZj3ZokxAACl20erea8yVotjl6bt0QyPm3C0IitmjZPdNLeqVl - m. - Anc.JeDoNUPwmgSxIQAjLH87GiPqebGl3ewifL.FLPgoxpud29vpujvqaIt'
>>>    }
>>>    url = base_url + urlencode(params)
>>>    try:
>>>        response = requests.get(url,headers=headers)
>>>        if(response.status_code == 200):
>>>            return response.json()
>>>    except requests.ConnectionError as e:
>>>        print('Error',e.args)

>>>if __name__ == '__main__':
>>>    data = get_page()
>>>    for index,value in enumerate(data):
>>>        print(f'第{index}条 标题:<<{value.get("title")}>> 媒体:{value.get("from")} 日期:{value.get("datetime")} 阅读量:{value.get("read_count")} ')
第0条 标题:<<屈原的天问及译文>> 媒体:律界诗者 日期:2020-07-23 21:14:28 阅读量:181 
第1条 标题:<<上古奇文《天问》原文,屈原向上苍叩问宇宙本源>> 媒体:水煮歷史 日期:2018-10-24 14:21:55 阅读量:6850 
第2条 标题:<<千古奇文:屈原《楚辞》中的《天问》>> 媒体:泽光书院 日期:2020-05-01 19:43:47 阅读量:491 
第3条 标题:<<火星探测器为什么取名“天问”?第一时间解读火星探索 4 大问题>> 媒体:科学声音 日期:2020-07-24 10:27:47 阅读量:18 
第4条 标题:<<屈原《天问》原文与释文>> 媒体:书画鉴赏典评收藏 日期:2019-05-04 21:05:38 阅读量:835 
第5条 标题:<<天问一号成功发射,马斯克发推祝贺:令人惊叹>> 媒体:观察者网 日期:2020-07-23 18:01:08 阅读量:7764 
第6条 标题:<<中国历史性一天!火星探测器“天问一号”发射成功,领先美国>> 媒体:智东西 日期:2020-07-23 14:03:21 阅读量:9509 
第7条 标题:<<中国首次火星探测任务“天问一号”探测器成功发射,马斯克发推:令人惊叹>> 媒体:环球网 日期:2020-07-23 20:00:44 阅读量:1718 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

关于Python的技术储备

在这里给大家分享一些免费的课程供大家学习,下面是课程里面的截图,扫描最下方的二维码就能全部领取,如果图片失效点击蓝色字体便可跳转哦~点这里哦

1.Python所有方向的学习路线

在这里插入图片描述

2.学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
在这里插入图片描述

3.学习资料

在这里插入图片描述

4.实战资料

实践是检验真理的唯一标准。这里的压缩包可以让你再闲暇之余帮你提升你的个人能力。
在这里插入图片描述

5.视频课程

在这里插入图片描述

好啦今天的分享就到这里结束了,快乐的时光总是短暂呢,想学习更多课程的小伙伴不要着急,有更多惊喜哦~在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/538701
推荐阅读
相关标签
  

闽ICP备14008679号