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: ...
最新文章
- 从源码和内核角度分析redis和nginx以及java NIO可以支持多大的并发
- 2020 年最值得学习的 5 大 AI 编程语言
- python组合数据类型有哪些_Python学习之组合数据类型
- 如何创建URL Mashup并插入到SAP Cloud for Customer标准页面里
- c语言用指针求Amn,[工学]第5章数据结构C语言描述耿国华.ppt
- pyqt 把控制台信息显示到_(基础篇 01)在控制台创建对应的应用
- HDU 4819 Mosaic(二维线段树)
- zoj 2706 线段树
- 阿里为什么推荐使用LongAdder?而不是AtomicLong?
- 深入理解JVM虚拟机读书笔记——垃圾回收算法
- myeclipse10破解补丁激活方法
- AIX系统中 .toc文件是做什么用的
- 基于数电的交通灯控制器
- 使用threejs开发微信小游戏全过程
- 这年头Windows电脑还需要杀毒软件吗?
- 蜗店SaaS系统功能介绍
- 智能座舱开启「万物交互」新革命,隐形冠军们如何突围?
- Java的反射机制?
- 加拿大曼尼托巴大学计算机专业几年,2020年加拿大曼尼托巴大学毕业时间是几月...
- 百度对“十进制网络”的官方态度
热门文章
- java创建对象时分配内存方式,是堆上分配还是栈上分配?
- e家数据挖掘_总结报告
- 新零售的下一个十年,会有什么样的发展?
- 游戏计算机重要参数,电脑新手村丨如何看懂CPU的性能参数?看完这篇就会了
- 利用 Excel 当中的 MATCH 和 XLOOKUP 函数实现集合与字典(映射)访问
- [算法前沿]--029-Transformers的生成任务-摘要生成
- IDEA:idea中的Git冲突解决(非常重要)
- 用 C 语言编写一个简单的垃圾回收器
- 梦想Android版CAD控件2022.11.14更新(安卓CAD控件,苹果CAD控件)
- 微信小程序实现时钟(实时获取当前时间)