以某网站为例介绍抓取动态网页的数据【python爬虫入门进阶】(12)

举报
码农飞哥 发表于 2021/12/11 13:49:45 2021/12/11
【摘要】 爬取ajax接口的数据还是挺简单的

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦
😁 1. 社区逛一逛,周周有福利,周周有惊喜。码农飞哥社区,飞跃计划
💪🏻 2. Python基础专栏,基础知识一网打尽。 Python从入门到精通
❤️ 3. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 4. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门

为啥写这篇文章?

前两篇文章我们分别介绍了
用正则表达式爬取古诗文网站,边玩边学【python爬虫入门进阶】(09)
用生产者消费者模式爬取斗图吧,一次性收获超多表情包【python爬虫入门进阶】(11)
还没来得及看的小伙伴们可以再看一波。
本文以小饭桌网站为例,介绍如何如何抓取动态网页的数据。前面介绍的数据爬取都是针对哪些静态网页进行说明的,也就是接口直接返回一个Html页面。我们只需要通过Xpath等手段提取页面内容即可。
今天要讲的另一类网站就是页面数据是通过Ajax返回的,针对这类网站我们该如何对他的数据进行爬取呢?

分析页面

首先打开这个网站 ,经过简单的分析我们可以得到三条结论。

  1. 点击查看更多数据之后页面地址不变,页面不会重新刷新。
  2. 点击查看更多一次会请求一次https://www.xfz.cn/api/website/articles/?p=2&n=20&type= 接口。
  3. 页面的数据由https://www.xfz.cn/api/website/articles/?p=2&n=20&type= 接口以application/json的形式返回。通过p参数控制返回第几页的数据。n参数控制的是每页返回的数据条数。

什么是ajax

AJAX(Asynchronouse JavaScript And XML) 中文名为异步JavaScript和XML。主要用在前端与服务器进行少量的数据交互。ajax可以使网页实现异步加载,这就意味着可以在不重新加载整个网页的情况下,对网页的某部分进行局部更新。传统的网页(不使用Ajax)如果需要更新内容需要重载整个网页页面。
因为传统的在传输数据格式方面,使用的是XML语法,因此叫做AJAX,其实现在数据交互基本上都是使用JSON。使用AJAX加载的数据,即使使用了JS,将数据渲染到浏览器中,在右键---->查看网页源代码,还是不能看到通过ajax加载的数据,只能看到使用url加载的html代码。

获取ajax数据的方式

  1. 直接分析ajax调用的接口,然后通过代码请求这个接口。
  2. 使用Selenium+chromedriver 模拟浏览器行为获取数据。(后面的文章会详细介绍)

获取数据

这个小饭桌网站的接口比较简单,没有做加密鉴权啥的,直接通过requests请求就可以了。下面给出一个示例代码:

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36"
}

requests.packages.urllib3.disable_warnings()

if __name__ == '__main__':
    for i in range(1,10):
        url = "https://www.xfz.cn/api/website/articles/?p={0}&n=20&type=".format(str(i))
        resp = requests.get(url, headers=headers, verify=False)
        print(resp.json())

运行结果:
在这里插入图片描述

总结

本文以小饭桌网站为例,简单的介绍了如何抓取动态网页的数据。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。