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. qt android 开发之wifi开发篇
  2. SQL Server-聚焦什么时候用OPTION(COMPILE)呢?
  3. create-react-app 配置scss,ant-design,装饰器,代理,node支持最新语法,express es6 后端,链接mongodb...
  4. 用python念数字_Python-数据类型之数字
  5. php+数组转换函数是,php数组与字符串的转换函数大全
  6. 你应该升级到SQL Server 2005还是SQL Server 2008?
  7. Oracle 12c 关于密码(password)的几个新特性小结
  8. python切片输出_Python语言之详解切片
  9. 内存越界访问保护 内存泄漏研究 未完待续
  10. java swing实现抖音上的表白程序
  11. 大数据组项目文档整理方案
  12. 博客园编辑器为Markdown时改变图片大小
  13. 微信公众号推广分享二维码,关联扫码关注的客户
  14. 计算机应用基础自学手写笔记,计算机应用基础第一章笔记.docx
  15. matlab毕业答辩会问什么,论文答辩必备:自述模板和注意问题
  16. (四) github分支的知识
  17. 易中天品汉代风云人物03:袁盎与士
  18. 一键生成 API 文档的妙招
  19. Chrome 刷新页面两次请求问题
  20. 2018.7.26第二次课及预习

热门文章

  1. es6删除对象的属性_javascript - 按对象属性从数组中删除对象
  2. flutterSDK的安装与使用
  3. 2022起重机司机(限桥式起重机)考试题模拟考试题库及模拟考试
  4. Linux系统测试工具-转
  5. Spring-Boot-Admin集成arthas环境部署-服务端
  6. python对excel进行筛选-python如何实现excel按颜色筛选功能
  7. GM Keil版本转换工具
  8. 理论物理 理论计算机科学,张阳:从理论物理到理论生命
  9. TypeError: add() argument after * must be an iterable, not Alien
  10. 如何隐藏nginx版本号