Python爬虫练习(一):酷狗飙升榜前200_排行(使用select,find(),find_all()方法)
分析并构造请求网址
爬取酷狗音乐TOP500 的‘音乐名’,‘歌手’,‘歌名’,‘播放时间’,‘网址’这几个数据网址如下:https://www.kugou.com/yy/rank/home/1-8888.html?from=rank
,浏览器打开网址分析,第一页只显示了22首歌曲:
我们可以看到,其中有一个 1-8888 这个参数,打开上述网址后我们只能看到前 22 首歌,想继续查看后面的歌曲就得翻页,就像“淘宝”那样查看下一页商品需要翻页,这里也是一样的道理,把 1-8888 改成 2-8888 ,就会看到下一页的 22 首歌,如下:
翻到第 200首音乐那一页,可以看到页码如下有 10 页,那么可以如下构造URL地址:
"""将所有URL构造成一个列表集合"""
URLs=["https://www.kugou.com/yy/rank/home/{}-8888.html?from=rank".format(str(i)) for i in range(1,10)]
构造请求
try:res=requests.get(url)res.encoding=res.apparent_encoding # 转换编码,不然中文会显示乱码,也可以r.encoding = 'utf-8'if res.status_code== 200:html=res.textreturn htmlexcept:print("请求失败")
使用 requests
库的 get
方法,去访问网页,res
其中里面有很多结果:状态响应码,网页源码,二进制等。调用请求结果 res
中的 status_code
查看请求状态码response.status_code == 200
返回响应结果的 html
,代表返回网页 html
源码
解析数据
soup=BeautifulSoup(html,"lxml")"""html 表示被解析的html格式的内容lxml 表示解析用的解析器"""
提取数据
分析网页源代码:
可以看到需要的一些信息如‘音乐名’,‘歌手’,‘歌名’,‘播放时间’,‘网址’等分别在如图标注的地方,每个歌曲信息所在的标签结构如下:所有歌曲信息都在<div>
标签下,每首歌曲都在各自的<ul>
标签,然后歌曲自身的‘音乐名’,‘歌手’,‘歌名’等信息都分别由一个<li>
标签包裹。
把每首歌曲的‘音乐名’,‘歌手’,‘歌名’,‘播放时间’,‘网址’的值都取出来,并且把每组数据都各自装在一个列表中。
(1)使用select
方法定位
"""(1)使用`select`方法定位,提取数据 ,返回结果为列表,下面使用循环依次取出数据"""try:nums=soup.select('.pc_temp_num' ) #定位排名titles=soup.select('.pc_temp_songname') #定位歌手-歌名times=soup.select('.pc_temp_time' ) #定位播放时间except:print("位置定位失败")
select
方法主要采用的是CSS
定位,如果不熟悉的话,可以参考http://www.w3school.com.cn/cssref/css_selectors.asp
了解。常用的select
搜索:
.intro |
选择 class="intro" 的所有元素
|
---|---|
#firstname |
选择id="firstname" 的所有元素
|
div p |
选择<div> 元素内部的所有 <p> 元素
|
div>p |
选择父元素为<div> 元素的所有<p> 元素
|
这里因为排名class="pc_temp_num"
唯一,所以直接定位到该标签。歌手-可以通过class="pc_temp_songname"
定位到<a>
标签,然后在获取属性值。
(2)使用find
方法定位
"""(2)使用`find`方法定位,提取数据 ,返回结果为列表,下面使用循环依次取出数据"""try:div=soup.find("div",class_="pc_temp_songlist") #先定位 divlis=div.find("ul").children #获取 ul标签下面的 子标签->lifor li in lis: #通过循环获取每个 li 标签if isinstance(li,bs4.element.Tag): #确保 li 对象的类型是bs4.element.Tag,也就是标签对象。只有标签对象才能使用find方法nums=li.select(".pc_temp_num")titles=[li.a.attrs]times=li.find(class_="pc_temp_time")except:print("位置定位失败")
(3)使用find_all
方法定位
"""(3)使用`find_all`方法定位,提取数据 ,返回结果为列表,下面使用循环依次取出数据"""try:nums=soup.find_all(class_="pc_temp_num")titles=soup.find_all(class_="pc_temp_songname")times=soup.find_all(class_="pc_temp_time")except:print("位置定位失败")
获得数据
"""打印信息 """for num,title,time in zip(nums,titles,times):data={"排名":num.get_text().replace('\n','').replace('\t','').replace('\r',''),"歌手-歌名":title.string,"播放时间":time.string.replace('\n','').replace('\t','').replace('\r',''),"网址":title.attrs["href"]}print(data)
用了zip
函数,意思是把对应的排名,歌名歌手,播放时间打包,可以这样理解 zip
函数的结果是一个列表 [(排名,歌手歌名,播放时间),(排名,歌手歌名,播放时间)]
每一次循环的 num,title,time,href
对应一次元组中的元素
get_text()
我们提取到的是这个数据所在的标签信息,并不是实际数据,所以需要使用 get_text()
获得实际数据
.replace('\n','').replace('\t','').replace('\r','')
去掉实际数据中多余的字符串;
最后把数据打包成字典打印。
最终代码
from bs4 import BeautifulSoup
import requests
import bs4
def get_html(url):try:res=requests.get(url)res.encoding=res.apparent_encoding # 转换编码,不然中文会显示乱码,也可以r.encoding = 'utf-8'if res.status_code== 200:html=res.textreturn htmlexcept:print("请求失败")def get_infos(html):soup=BeautifulSoup(html,"lxml")"""html 表示被解析的html格式的内容lxml 表示解析用的解析器""""""(1)使用`select`方法定位,提取数据 ,返回结果为列表,下面使用循环依次取出数据"""try:nums=soup.select('.pc_temp_num' ) #定位排名titles=soup.select('.pc_temp_songname') #定位歌手-歌名times=soup.select('.pc_temp_time' ) #定位播放时间except:print("位置定位失败")# """(2)使用`find`方法定位,提取数据 ,返回结果为列表,下面使用循环依次取出数据"""# try:# div=soup.find("div",class_="pc_temp_songlist") #先定位 div# lis=div.find("ul").children #获取 ul标签下面的 子标签->li# for li in lis: #通过循环获取每个 li 标签# if isinstance(li,bs4.element.Tag): #确保 li 对象的类型是bs4.element.Tag,也就是标签对象。只有标签对象才能使用find方法# nums=li.select(".pc_temp_num")# titles=[li.a.attrs]# times=li.find(class_="pc_temp_time")# for num,title,time in zip(nums,titles,times):# data={"排名":num.get_text().replace('\n','').replace('\t','').replace('\r',''),# "歌手-歌名":title["title"],# "播放时间":time.string.replace('\n','').replace('\t','').replace('\r',''),# "网址":title["href"]}# print(data)# except:# print("位置定位失败")# """(3)使用`find_all`方法定位,提取数据 ,返回结果为列表,下面使用循环依次取出数据"""# try:# nums=soup.find_all(class_="pc_temp_num")# titles=soup.find_all(class_="pc_temp_songname")# times=soup.find_all(class_="pc_temp_time")# except:# print("位置定位失败")##"""打印信息时,供select和find_all共同使用,find方法需写在try里面,因为多了一个if判断,层级下了一级"""for num,title,time in zip(nums,titles,times):data={"排名":num.get_text().replace('\n','').replace('\t','').replace('\r',''),"歌手-歌名":title["title"],"播放时间":time.string.replace('\n','').replace('\t','').replace('\r',''),"网址":title["href"]}print(data)def main():"""主接口"""urls=["https://www.kugou.com/yy/rank/home/{}-6666.html?from=rank".format(str(i)) for i in range(1,10)]for url in urls:get_html(url)html=get_html(url)get_infos(html)if __name__ == '__main__':main()
Python爬虫练习(一):酷狗飙升榜前200_排行(使用select,find(),find_all()方法)相关推荐
- Python爬虫爬取酷狗音乐TOP500
Python大作业 内容简介: 用Python来爬取酷狗音乐TOP500的歌曲信息,统计这500首歌曲中出现的所有歌手,并做可视化处理生成词云 实验代码: import time import req ...
- python爬虫-爬取酷狗音乐top榜
酷狗音乐top500榜单就是我们今天需要爬取的对象,作为新手入门的代码,只需要将信息爬取下来即可,十分简单,不需要保存到数据库或保存到文件,仅当普通练习. https://www.kugou.com/ ...
- python爬虫爬取酷狗top5001
前言 这段时间正在学习python爬虫,今天分享一个关于酷狗音乐top500的爬虫 python库 标准库 time 第三方库 requests库 BeautifulSoup库 自建库 agent库( ...
- Python爬虫 爬取酷狗TOP500的数据
根据书籍<从零开始学Python网络爬虫>P41,综合案例2-爬取酷狗TOP500的数据修改而来. 使用模块requests和模块BeautifukSoup进行爬取. 不得不说,酷狗拿来跑 ...
- python爬虫——爬取酷狗音乐top500(BeautifulSoup使用方法)
酷狗音乐Top500 酷狗top500http://www.kugou.com/yy/rank/home/1-8888.html?from=rank 进入,并按F12打开开发者工具(本文以火狐浏览器为 ...
- python爬虫爬取酷狗音乐
老规矩,代码先行 # -*- codeing = utf-8 -*- # @Time : 2021/2/25 13:17 # @Author : 老七疯狂吸氧 # @file 酷狗音乐.py # @S ...
- 【Python爬虫项目】酷狗音乐附源码
一.复制歌曲链接 二.F12启动开发者工具找到音频标签查看src属性 三.复制src属性进行搜索进行查看发现时音频文件 四.了解流程开始编写程序 代码: import requests from se ...
- python爬虫:爬取酷狗音乐榜单中的音乐信息并存储到MySQL(附源码)
目录 具体思路 代码部分 获取歌曲名称和歌手 获取歌曲播放页的url 获取音乐下载地址 将获取到的音乐信息添加到MySQL中 完整代码 获取酷狗音乐榜单中的音乐信息,这里我以"网络红歌榜&q ...
- Python爬虫实例--新浪热搜榜[xpath语法]
Python爬虫实例--新浪热搜榜[xpath语法] 1.基础环境配置: requests-->版本:2.12.4 lxml-->版本:3.7.2 2.网页分析 很容易从html源码中看到 ...
最新文章
- angular.foreach 格式
- mssql sqlserver 模拟for循环的写法
- leetcode刷题总结(持续更新)
- 皮一皮:这个职业是我想得那样吗?
- 成功解决WARNING: Ignoring invalid distribution -illow (E:\program files\python\python36\lib\site-package
- Fabric学习笔记-PBFT算法
- 【BZOJ2908】又是nand 树链剖分+线段树
- golang 获取当天0点时间_golang使用webAssembly的方式
- php 字符串划线,php – 在elasticsearch中将整个字符串与短划线匹配
- oracle中累计求和_Excel中常见的7种求和公式
- [开发笔记]-使用jquery获取url及url参数的方法
- html+jquery翻页相册(原创)
- 软件测试文档测试用例,软件测试用例文档模板(带实例)
- P.W.N. CTF - MISC - Canadian FOI
- 如何查看计算机硬盘规格大小,台式机硬盘如何查看大小
- 国际化批量获取en-US.json,zn-CN.json字典内容
- 69、Android获取每日运动步数
- Android Framework:深入探索 AIDL 数据流动
- AI人工智能外呼机器人测试项目经历
- win7锁定计算机自动关机,Win7电脑老是自动关机怎么解决?
热门文章
- 李宏毅GAN学习——传统GAN(2014年首次提出的)
- 如何使用正则表达式验证电子邮件地址
- 路由器总是显示未连接到服务器,链接路由器但一直显示未连接服务器
- scp从服务器下载文件到本地或从本地上传文件到服务器
- python 手机号码_python 小练习之生成手机号码
- html手机扫描条形码,在HTML5/JavaScript中扫描条形码
- 计算机毕业设计源代码java项目开发实例ssm+mysql实现简单的物流快递管理系统[包运行成功]
- 00023 高等数学(工本) 公式
- OpenOffice.org中的XML应用
- 如何给latex加批注