ajax serverlet实现根据id查询_Ajax数据爬取小技巧

7ef4d85956f8e230cd3d06b95f94670b.png

前言

对于学习过爬虫的同学来说,如果要爬取的数据不在当前url地址所对应的网页源码中那真是比较痛苦了。这种情况下,数据要么是通过后期动态添加到网页中,要么就是通过ajax进行加载的。无论是哪一种对于初学者的同学来说都是异常的头疼。今天我们就以一种通俗简单的方式来分析一下ajax数据的特点(凡事有特殊,所以场景不同还需要特殊对待)

实战

先解决一个问题什么是ajax?下面引入百度百科的一段解释 Ajax即"Asynchronous Javascript And XML"(异步 JavaScript和XML),是一种创建交互式、快速动态网页应用的网页开发技术,无需重新加载整个网页的情况下,能够更新部分网页的技术。 在这段话里面有一个关键点就是无需加载整个网页,就可以更新部分网页的技术 例如下面是一个12306的车次列表

eae7bb7f03841af157c4451c3958b782.png

在这幅图中,我们可以看到12306的网页是这么一个样式。可是当我们点击一下"查询"按钮之后,我们在来观察这个网页的效果

5a4376e95cf7bd323c9e98df4e83d8ce.png

我们发现这个网页其实是没有进行刷新,但是局部结构就已经发生了变化。那么这个车次列表数据就是通过ajax加载出来的。那我们其实也就不太难理解,刚才这句"无需重新加载整个网页的情况下,能够更新部分网页的技术"话的含义了。 下面我们来通过一个案例,来对如何爬取ajax的数据进行进一步的分析和总结 下图是喜马拉雅音频网站,在这个网站当中,数据主要以音频为主。那么我们想要爬取网站上面的音频数据该如何去做呢?

42bf656e329168a2a02ae5f8c041b26d.png

我们把目标进一步的优化,下面有一个<>这么一个音频专题,今天我们就来爬取这个专题里面的数据

da2ef2b7d8a69efb988c242cdd28c22c.png

点击专辑进去之后我们发现有很多的音频数据,根据我们的思路只要找到每个音频的url就很容易来进行爬取了。

bf7e86527e0e9ad4bf5d7af92a830489.png

但是前提是这些数据是否在当前的这个URL地址之上呢?我们来查看下网页源码,这个也很简单,我们只要在源码中搜索mp3或者是m4a等音频格式就可以了。通过下图我们可以看到在网页中是没有这些音频格式的。那么我们就猜到了这些数据有可能是通过ajax来进行加载的。

8c2d71d38e2a2d56d3d3486f0a780d66.png

下面就要通过NetWork来分析下数据接口了。我们点击一首歌曲发现在NetWork中刷新出来一些数据。我们看下第一条数据

a761e89c02b3f3d342a3b486ee64b6a9.png

数据确实在这个接口里面

017bbc278bfad11463d6ce902eff024f.png

我们点开进一步去观察看看有没有类似于mp3或者m4a的音频格式。然而令我们失望的是并没有。那该怎么办呢?

933c31093b4041751b48dbdb31c8dbc9.png

在这个数据接口下面还有一条数据,我们来看一下它里面有什么内容呢?我们发现这个数据是个音频格式

2acf726789557309df4912883dfe248b.png

为了验证这个数据是否是我们要爬取的,我们可以查看一下。 OK,没有问题是我们要爬取的数据

5210b4bc5e5011911fc8137ee5a091eb.png

可是这个只是一首音频,我们要爬取其他的音频怎么办呢?我们发现,不同音频的id不一样。那么就简单了。我们先去访问第一个数据接口里面的内容,获取音频的id以及name。

bc127e813cd9305c38715712d6c86feb.png

然后我们在去第二个数据接口里面,到它的url动态的取替换音频的id就可以了

af9331b3792cb25689e62a4aedb6584d.png

代码演示

import requests
import json# 1.拿到统一的url
url = 'https://www.ximalaya.com/revision/play/v1/show?id=231012348&sort=1&size=30&ptype=1'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
r = requests.get(url,headers=headers)
ret = r.text# 2.拿到音乐的id# print(type(ret))
result = json.loads(ret)
content_list = result['data']['tracksAudioPlay']for content in content_list:
    t_id = content['trackId'] # 音频的id
    name = content['trackName'] # 音频的name# print(t_id,type(t_id))
    url = 'https://www.ximalaya.com/revision/play/v1/audio?id=%d&ptype=1'%t_id# print(url)# 请求音频的链接地址
    mus_response = requests.get(url,headers=headers)# 拿到音频的网页数据
    mus_html = mus_response.text# 把数据转换成字典
    mus_result = json.loads(mus_html)# print(mus_html,type(mus_result))# 3 拿到音频的url
    mus_src = mus_result['data']['src']# print(mus_src)# 4.保存所有的音频
    with open('img/%s.m4a'% name,'wb') as f:
        mus = requests.get(mus_src)
        f.write(mus.content)
运行效果

eb3b2ee7dfa43adadf37a3e84c5ff1da.png

a8b2f729e269b15a0792806ce9528f68.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值