python爬虫练习2
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相关推荐
- 关于Python爬虫原理和数据抓取1.1
为什么要做爬虫? 首先请问:都说现在是"大数据时代",那数据从何而来? 企业产生的用户数据:百度指数.阿里指数.TBI腾讯浏览指数.新浪微博指数 数据平台购买数据:数据堂.国云数据 ...
- python爬虫之Scrapy框架的post请求和核心组件的工作 流程
python爬虫之Scrapy框架的post请求和核心组件的工作 流程 一 Scrapy的post请求的实现 在爬虫文件中的爬虫类继承了Spider父类中的start_urls,该方法就可以对star ...
- python爬虫抓取信息_python爬虫爬取网上药品信息并且存入数据库
我最近在学习python爬虫,然后正好碰上数据库课设,我就选了一个连锁药店的,所以就把网上的药品信息爬取了下来. 1,首先分析网页 2,我想要的是评论数比较多的,毕竟好东西大概是买的人多才好.然后你会 ...
- python爬虫案例_推荐上百个github上Python爬虫案例
现在学生都对爬虫感兴趣,这里发现一些好的github开源的代码,分享给各位 1.awesome-spider 该网站提供了近上百个爬虫案例代码,这是ID为facert的一个知乎工程师开源的,star6 ...
- Python培训分享:python爬虫可以用来做什么?
爬虫又被称为网络蜘蛛,它可以抓取我们页面的一些相关数据,近几年Python技术的到来,让我们对爬虫有了一个新的认知,那就是Python爬虫,下面我们就来看看python爬虫可以用来做什么? Pytho ...
- 玩转 Python 爬虫,需要先知道这些
作者 | 叶庭云 来源 | 修炼Python 头图 | 下载于视觉中国 爬虫基本原理 1. URI 和 URL URI 的全称为 Uniform Resource Identifier,即统一资源标志 ...
- 买不到口罩怎么办?Python爬虫帮你时刻盯着自动下单!| 原力计划
作者 | 菜园子哇 编辑 | 唐小引 来源 | CSDN 博客 马上上班了,回来的路上,上班地铁上都是非常急需口罩的. 目前也非常难买到正品.发货快的口罩,许多药店都售完了. 并且,淘宝上一些新店口罩 ...
- 一个月入门Python爬虫,轻松爬取大规模数据
如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样一个月入门Python爬虫,轻松爬的编程语言提供越来越多的优秀工具,让爬虫 ...
- Python爬虫获取文章的标题及你的博客的阅读量,评论量。所有数据写入本地记事本。最后输出你的总阅读量!
Python爬虫获取文章的标题及你的博客的阅读量,评论量.所有数据写入本地记事本.最后输出你的总阅读量!还可以进行筛选输出!比如阅读量大于1000,之类的! 完整代码在最后.依据阅读数量进行降序输出! ...
- Python爬虫破解有道翻译
有道翻译是以异步方式实现数据加载的,要实现对此类网站的数据抓取,其过程相对繁琐,本节我以有道翻译为例进行详细讲解. 通过控制台抓包,我们得知了 POST 请求的参数以及相应的参数值,如下所示: 图1: ...
最新文章
- qt android 开发之wifi开发篇
- SQL Server-聚焦什么时候用OPTION(COMPILE)呢?
- create-react-app 配置scss,ant-design,装饰器,代理,node支持最新语法,express es6 后端,链接mongodb...
- 用python念数字_Python-数据类型之数字
- php+数组转换函数是,php数组与字符串的转换函数大全
- 你应该升级到SQL Server 2005还是SQL Server 2008?
- Oracle 12c 关于密码(password)的几个新特性小结
- python切片输出_Python语言之详解切片
- 内存越界访问保护 内存泄漏研究 未完待续
- java swing实现抖音上的表白程序
- 大数据组项目文档整理方案
- 博客园编辑器为Markdown时改变图片大小
- 微信公众号推广分享二维码,关联扫码关注的客户
- 计算机应用基础自学手写笔记,计算机应用基础第一章笔记.docx
- matlab毕业答辩会问什么,论文答辩必备:自述模板和注意问题
- (四) github分支的知识
- 易中天品汉代风云人物03:袁盎与士
- 一键生成 API 文档的妙招
- Chrome 刷新页面两次请求问题
- 2018.7.26第二次课及预习
热门文章
- es6删除对象的属性_javascript - 按对象属性从数组中删除对象
- flutterSDK的安装与使用
- 2022起重机司机(限桥式起重机)考试题模拟考试题库及模拟考试
- Linux系统测试工具-转
- Spring-Boot-Admin集成arthas环境部署-服务端
- python对excel进行筛选-python如何实现excel按颜色筛选功能
- GM Keil版本转换工具
- 理论物理 理论计算机科学,张阳:从理论物理到理论生命
- TypeError: add() argument after * must be an iterable, not Alien
- 如何隐藏nginx版本号