分析并构造请求网址

爬取酷狗音乐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()方法)相关推荐

  1. Python爬虫爬取酷狗音乐TOP500

    Python大作业 内容简介: 用Python来爬取酷狗音乐TOP500的歌曲信息,统计这500首歌曲中出现的所有歌手,并做可视化处理生成词云 实验代码: import time import req ...

  2. python爬虫-爬取酷狗音乐top榜

    酷狗音乐top500榜单就是我们今天需要爬取的对象,作为新手入门的代码,只需要将信息爬取下来即可,十分简单,不需要保存到数据库或保存到文件,仅当普通练习. https://www.kugou.com/ ...

  3. python爬虫爬取酷狗top5001

    前言 这段时间正在学习python爬虫,今天分享一个关于酷狗音乐top500的爬虫 python库 标准库 time 第三方库 requests库 BeautifulSoup库 自建库 agent库( ...

  4. Python爬虫 爬取酷狗TOP500的数据

    根据书籍<从零开始学Python网络爬虫>P41,综合案例2-爬取酷狗TOP500的数据修改而来. 使用模块requests和模块BeautifukSoup进行爬取. 不得不说,酷狗拿来跑 ...

  5. python爬虫——爬取酷狗音乐top500(BeautifulSoup使用方法)

    酷狗音乐Top500 酷狗top500http://www.kugou.com/yy/rank/home/1-8888.html?from=rank 进入,并按F12打开开发者工具(本文以火狐浏览器为 ...

  6. python爬虫爬取酷狗音乐

    老规矩,代码先行 # -*- codeing = utf-8 -*- # @Time : 2021/2/25 13:17 # @Author : 老七疯狂吸氧 # @file 酷狗音乐.py # @S ...

  7. 【Python爬虫项目】酷狗音乐附源码

    一.复制歌曲链接 二.F12启动开发者工具找到音频标签查看src属性 三.复制src属性进行搜索进行查看发现时音频文件 四.了解流程开始编写程序 代码: import requests from se ...

  8. python爬虫:爬取酷狗音乐榜单中的音乐信息并存储到MySQL(附源码)

    目录 具体思路 代码部分 获取歌曲名称和歌手 获取歌曲播放页的url 获取音乐下载地址 将获取到的音乐信息添加到MySQL中 完整代码 获取酷狗音乐榜单中的音乐信息,这里我以"网络红歌榜&q ...

  9. Python爬虫实例--新浪热搜榜[xpath语法]

    Python爬虫实例--新浪热搜榜[xpath语法] 1.基础环境配置: requests-->版本:2.12.4 lxml-->版本:3.7.2 2.网页分析 很容易从html源码中看到 ...

最新文章

  1. angular.foreach 格式
  2. mssql sqlserver 模拟for循环的写法
  3. leetcode刷题总结(持续更新)
  4. 皮一皮:这个职业是我想得那样吗?
  5. 成功解决WARNING: Ignoring invalid distribution -illow (E:\program files\python\python36\lib\site-package
  6. Fabric学习笔记-PBFT算法
  7. 【BZOJ2908】又是nand 树链剖分+线段树
  8. golang 获取当天0点时间_golang使用webAssembly的方式
  9. php 字符串划线,php – 在elasticsearch中将整个字符串与短划线匹配
  10. oracle中累计求和_Excel中常见的7种求和公式
  11. [开发笔记]-使用jquery获取url及url参数的方法
  12. html+jquery翻页相册(原创)
  13. 软件测试文档测试用例,软件测试用例文档模板(带实例)
  14. P.W.N. CTF - MISC - Canadian FOI
  15. 如何查看计算机硬盘规格大小,台式机硬盘如何查看大小
  16. 国际化批量获取en-US.json,zn-CN.json字典内容
  17. 69、Android获取每日运动步数
  18. Android Framework:深入探索 AIDL 数据流动
  19. AI人工智能外呼机器人测试项目经历
  20. win7锁定计算机自动关机,Win7电脑老是自动关机怎么解决?

热门文章

  1. 李宏毅GAN学习——传统GAN(2014年首次提出的)
  2. 如何使用正则表达式验证电子邮件地址
  3. 路由器总是显示未连接到服务器,链接路由器但一直显示未连接服务器
  4. scp从服务器下载文件到本地或从本地上传文件到服务器
  5. python 手机号码_python 小练习之生成手机号码
  6. html手机扫描条形码,在HTML5/JavaScript中扫描条形码
  7. 计算机毕业设计源代码java项目开发实例ssm+mysql实现简单的物流快递管理系统[包运行成功]
  8. 00023 高等数学(工本) 公式
  9. OpenOffice.org中的XML应用
  10. 如何给latex加批注