python版本 python3
用到的三方库: requests,bs4,

requests是用来进行网络访问,就如同我们浏览网页,获取网页信息。

当我们用requests访问网站,网站服务器会根据我们的网络请求返回数据,这时我们就完成了关键的第一步。详见廖雪峰教程:https://www.liaoxuefeng.com/wiki/1016959663602400/1183249464292448

接下来是需要我们来分析数据。筛选出我们需要的资源信息。这就使用了bs库,它能方便的帮助我们解析html数据。


这次爬虫练习的对象是One应用里的短篇文章有声朗读,朗读者是帅气的马晓橙老师,非常喜欢,开车到公司半小时刚好可以听上一篇。但有的文章没有朗读,开车时要找到一篇合适的还是要操作一会的,并且One在我的米8上大概二十分钟就会被自动清后台,导致开车中途需要再操作一番。。。这里既然上手了爬虫就趁热打铁熟练技能。


这里我找到晓橙老师在荔枝FM平台的声音列表页
https://www.lizhi.fm/user/405513/p/1.html


尝试在python中访问它


在返回的结果中我们可以检索到列表等信息,但是并没有音频文件音频文件并不在这个页面(后面称为首页)中,我们在网页中分析下,我们点击列表旁的播放按钮,并不是直接播放,而是跳转到播放页。我们去看下播放页中有什么奥秘。

播放页并不是固定的,尝试通过流浪器的检查工具,可以捕获到媒体信息,一个mp3文件,这就是当前播放的音频

进而可以找到音频的url地址

Request URL: https://cdn5.lizhi.fm/audio/2021/02/01/5159387987610286086_hd.mp3
我发现这个URL地址应该有规律的。
多跑了几个音频,可以发现其中的常量与变量。
Request URL: https://cdn5.lizhi.fm/audio/2021/02/09/5160567329859107846_hd.mp3
其中的变量是更新日期与一串数字就管它叫音频ID


思考下,有眉目了吗?


到这里应该柳暗黄明了,我们需要抓取每个音频文件的URL,这些URL是有规律的,我们只要抓取每个音频的日期与ID,就可以组合得到完整的URL。


那么接下来就是如何获取每个音频的日期与ID?
在首页的获取结果中,我们就可以抓取到每个音频列表对应的ID与日期

使用python将信息提取出来。

在上一次的练习中,是直接re库使用正则表达式捕获特定语句。
但这一次会比较复杂,首先,在首页这一个页面中,有一个列表多个音频需要爬取,另外要爬取的也不止一个语句,需要有data-id和aduioTime信息
尝试用正则抓取id和日期

r = requests.get('https://www.lizhi.fm/user/405513/p/1.html')
# print(r.text)
print(re.findall('data-id="(.*?)"', r.text))
print(re.findall('"aduioTime">(.*?)', r.text))

得到的结果并不匹配

['5167514291178691078', '2578655273309859334', '2508544618237004806', '2527272019975833094', '5167514291178691078', '5165860868416970758', '5164364246303929350', '5162490163050613766', '5162490163049684486', '5160632063501297670', '5160567329859107846', '5160564149354061318', '5159387987610286086', '5157829940980139526', '2555698593525494784', '2564671546875421696', '18916788345438208', '24538828569813888', '23470052802058496', '9449341441341696', '2621269361033996800', '21361010991780480', '12931331289387392', '17782093660509568']
['播放量:0', '播放量:42954', '播放量:46032', '播放量:29274', '2021-03-17', '2021-03-08', '2021-02-27', '2021-02-19', '2021-02-17', '2021-02-10', '2021-02-09', '2021-02-09', '2021-02-01', '2021-01-24']

这是因为页面中的有较多干扰项,比如除了声音列表外还有最新声音与近期热播列表

这里我们尝试使用bs4库

bs4(Beautiful Soup)是一个可以从HTML或XML文件中提取数据的Python库
详见:https://blog.51cto.com/13992211/2353207

这里我先使用了检查工具找到声音列表对应的标签


bs4就像这样通过树形的方式去读取html,而不是文本形式

尝试 bs4 实例化

实例化bs对象是使用bs库的第一步

# 访问网页
response = requests.get('https://www.lizhi.fm/user/405513/p/1.html')
html = response.text
# bs4实例化
soup = BeautifulSoup(html, 'html.parser')

根据需求匹配节点或信息

实例化后,我们就可以调用对象的方法进行查询

# 尝试访问
response = requests.get('https://www.lizhi.fm/user/405513/p/1.html')
html = response.text# 实例化bs对象
soup = BeautifulSoup(html, 'html.parser')
# 根据需求匹配节点或信息
print(soup.find('ul', class_="audioList fontYaHei js-audio-list"))

结果就只返回了声音列表的这部分内容,其余的杂项被过滤

继续往下获取到声音列表下的每一条信息

根据之前检查工具得到的信息,我们可以通过li标签来分离出列表下的每一条声音

# 尝试访问
response = requests.get('https://www.lizhi.fm/user/405513/p/1.html')
html = response.text# 实例化bs对象
soup = BeautifulSoup(html, 'html.parser')# 根据需求匹配节点或信息
# 查找声音列表标签
audio_list = soup.find('ul', class_="audioList fontYaHei js-audio-list")
# 查找声音列表标签下的li标签
print(audio_list.find_all('li'))

这里我使用了find_all函数是因为使用find函数结果只显示的是第一条声音就停止搜索了,

到这里我们得到了十个声音标签

接下来我们将循环遍历这些标签,抓取我们要的两个属性

这里可以思考下为什么这么写?

# 根据需求匹配节点或信息
# 查找声音列表标签
audio_list = soup.find('ul', class_="audioList fontYaHei js-audio-list")
# 查找声音列表标签下的li标签
audioLs = audio_list.find_all('li')
print(len(audioLs))
for audio in audioLs:print(audio.a["data-id"])print(audio.find("p", class_="aduioTime"))
10
5167514291178691078
<p class="aduioTime">2021-03-17   1评论</p>
5165860868416970758
<p class="aduioTime">2021-03-08   1评论</p>
5164364246303929350
<p class="aduioTime">2021-02-27   12评论</p>
5162490163050613766
<p class="aduioTime">2021-02-19   3评论</p>
5162490163049684486
<p class="aduioTime">2021-02-17   0评论</p>
5160632063501297670
<p class="aduioTime">2021-02-10   0评论</p>
5160567329859107846
<p class="aduioTime">2021-02-09   3评论</p>
5160564149354061318
<p class="aduioTime">2021-02-09   0评论</p>
5159387987610286086
<p class="aduioTime">2021-02-01   0评论</p>
5157829940980139526
<p class="aduioTime">2021-01-24   14评论</p>

因为分析html结构可以看出,data-id是标签li底下a标签的属性,触手可得,我们直接获取指定属性
而aduioTime所在标签还是比较深的,适合使用find函数抓取

抓取到的结果过滤下即可

# 根据需求匹配节点或信息
# 查找声音列表标签
audio_list = soup.find('ul', class_="audioList fontYaHei js-audio-list")
# 查找声音列表标签下的li标签
audioLs = audio_list.find_all('li')
for audio in audioLs:data_id = (audio.a["data-id"])data = (audio.find("p", class_="aduioTime")).get_text().split()[0].replace("-", "")print(data_id)print(data)
5167514291178691078
20210317
5165860868416970758
20210308
5164364246303929350
20210227
5162490163050613766
20210219
5162490163049684486
20210217
5160632063501297670
20210210
5160567329859107846
20210209
5160564149354061318
20210209
5159387987610286086
20210201
5157829940980139526
20210124

得到需要的条件后组合成完整的url即可

--END--

python爬虫练习2相关推荐

  1. 关于Python爬虫原理和数据抓取1.1

    为什么要做爬虫? 首先请问:都说现在是"大数据时代",那数据从何而来? 企业产生的用户数据:百度指数.阿里指数.TBI腾讯浏览指数.新浪微博指数 数据平台购买数据:数据堂.国云数据 ...

  2. python爬虫之Scrapy框架的post请求和核心组件的工作 流程

    python爬虫之Scrapy框架的post请求和核心组件的工作 流程 一 Scrapy的post请求的实现 在爬虫文件中的爬虫类继承了Spider父类中的start_urls,该方法就可以对star ...

  3. python爬虫抓取信息_python爬虫爬取网上药品信息并且存入数据库

    我最近在学习python爬虫,然后正好碰上数据库课设,我就选了一个连锁药店的,所以就把网上的药品信息爬取了下来. 1,首先分析网页 2,我想要的是评论数比较多的,毕竟好东西大概是买的人多才好.然后你会 ...

  4. python爬虫案例_推荐上百个github上Python爬虫案例

    现在学生都对爬虫感兴趣,这里发现一些好的github开源的代码,分享给各位 1.awesome-spider 该网站提供了近上百个爬虫案例代码,这是ID为facert的一个知乎工程师开源的,star6 ...

  5. Python培训分享:python爬虫可以用来做什么?

    爬虫又被称为网络蜘蛛,它可以抓取我们页面的一些相关数据,近几年Python技术的到来,让我们对爬虫有了一个新的认知,那就是Python爬虫,下面我们就来看看python爬虫可以用来做什么? Pytho ...

  6. 玩转 Python 爬虫,需要先知道这些

    作者 | 叶庭云 来源 | 修炼Python 头图 | 下载于视觉中国 爬虫基本原理 1. URI 和 URL URI 的全称为 Uniform Resource Identifier,即统一资源标志 ...

  7. 买不到口罩怎么办?Python爬虫帮你时刻盯着自动下单!| 原力计划

    作者 | 菜园子哇 编辑 | 唐小引 来源 | CSDN 博客 马上上班了,回来的路上,上班地铁上都是非常急需口罩的. 目前也非常难买到正品.发货快的口罩,许多药店都售完了. 并且,淘宝上一些新店口罩 ...

  8. 一个月入门Python爬虫,轻松爬取大规模数据

    如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样一个月入门Python爬虫,轻松爬的编程语言提供越来越多的优秀工具,让爬虫 ...

  9. Python爬虫获取文章的标题及你的博客的阅读量,评论量。所有数据写入本地记事本。最后输出你的总阅读量!

    Python爬虫获取文章的标题及你的博客的阅读量,评论量.所有数据写入本地记事本.最后输出你的总阅读量!还可以进行筛选输出!比如阅读量大于1000,之类的! 完整代码在最后.依据阅读数量进行降序输出! ...

  10. Python爬虫破解有道翻译

    有道翻译是以异步方式实现数据加载的,要实现对此类网站的数据抓取,其过程相对繁琐,本节我以有道翻译为例进行详细讲解. 通过控制台抓包,我们得知了 POST 请求的参数以及相应的参数值,如下所示: 图1: ...

最新文章

  1. 从源码和内核角度分析redis和nginx以及java NIO可以支持多大的并发
  2. 2020 年最值得学习的 5 大 AI 编程语言
  3. python组合数据类型有哪些_Python学习之组合数据类型
  4. 如何创建URL Mashup并插入到SAP Cloud for Customer标准页面里
  5. c语言用指针求Amn,[工学]第5章数据结构C语言描述耿国华.ppt
  6. pyqt 把控制台信息显示到_(基础篇 01)在控制台创建对应的应用
  7. HDU 4819 Mosaic(二维线段树)
  8. zoj 2706 线段树
  9. 阿里为什么推荐使用LongAdder?而不是AtomicLong?
  10. 深入理解JVM虚拟机读书笔记——垃圾回收算法
  11. myeclipse10破解补丁激活方法
  12. AIX系统中 .toc文件是做什么用的
  13. 基于数电的交通灯控制器
  14. 使用threejs开发微信小游戏全过程
  15. 这年头Windows电脑还需要杀毒软件吗?
  16. 蜗店SaaS系统功能介绍
  17. 智能座舱开启「万物交互」新革命,隐形冠军们如何突围?
  18. Java的反射机制?
  19. 加拿大曼尼托巴大学计算机专业几年,2020年加拿大曼尼托巴大学毕业时间是几月...
  20. 百度对“十进制网络”的官方态度

热门文章

  1. java创建对象时分配内存方式,是堆上分配还是栈上分配?
  2. e家数据挖掘_总结报告
  3. 新零售的下一个十年,会有什么样的发展?
  4. 游戏计算机重要参数,电脑新手村丨如何看懂CPU的性能参数?看完这篇就会了
  5. 利用 Excel 当中的 MATCH 和 XLOOKUP 函数实现集合与字典(映射)访问
  6. [算法前沿]--029-Transformers的生成任务-摘要生成
  7. IDEA:idea中的Git冲突解决(非常重要)
  8. 用 C 语言编写一个简单的垃圾回收器
  9. 梦想Android版CAD控件2022.11.14更新(安卓CAD控件,苹果CAD控件)
  10. 微信小程序实现时钟(实时获取当前时间)