【Python】【爬虫】爬取酷狗TOP500
好啦好啦,那我们来拉开我们的爬虫之旅吧~~~
这一只小爬虫是爬取酷狗TOP500的,使用的爬取手法简单粗暴,目的是帮大家初步窥探爬虫长啥样,后期会慢慢变得健壮起来的。
环境配置
在此之前需要下载一个谷歌浏览器,下好后由于谷歌搜索是需要翻墙的,可设置打开网页为百度来使用
我们用到的是bs4,要求这两个库来提取,这是简称,全称是BeautifulSoup库。中文名也叫“美丽的汤”,安装也很简单。
:cmd命令行(win + r),输入pip install bs4完成安装,如下图:
请求库同样,pip安装请求
可能遇到的安装错误
如果执行pip install bs4后报错为“ pip不是重置的命令”
这是因为没有把pip的路径加入“环境变量”,加入环境变量即可
构造请求网址
我们是爬取酷狗音乐TOP500的'音乐名','歌手','歌名','播放时间'这几个数据网址如下:
https://www.kugou.com/yy/rank/home/1-8888.html?from=rank
:后只能看到前22名的数据,如下:
网址也叫url,唯一资源定位符,我们观察url如下几个细分:
https:传输协议,一般都是http或https
www.kugou.com:为域名
yy / rank / home / abs:为域名下的子网页
.html:代表此网页是静态的,后面会讲
?:问号后面的一般都是一些请求参数
我们可以看到,其中有一个1-8888这个参数,打开上述网址后我们只能看到前22首歌,想继续查看后面的歌曲就得翻页,就像“淘宝”那样查看下一页商品需要翻页,这里也是一样的道理,把1-8888改成2-8888,就会看到下一页的22首歌,如下:
我们翻到第500首音乐那一页,可以看到页码如下有23页:
到这里我们我们需要提取的数据就知道在哪里了。
在知道了有多少页以及url的含义后,通过以下代码构造所有的url:
urls = ['https://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'
.format(str(i)) for i in range(1, 24)]
构造请求头
什么是请求头?
别人网页区别是人还是机器访问的一种手段,我们设置请求头为浏览器的请求头,对方就会认为我们是人为的访问,从而不会反爬,当然这只是最简单的一种防反爬的手段,一般我们都会带上,代码如下:
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/53\
7.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
这并不是一个一个手敲的!!!
我们来看看它在哪里,按F12出现开发者工具,再按F5刷新出现如下图:
按照红线提示,找到用户代理
最后复制粘贴得到上面的代码
请求访问网页
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text
else:
return
响应= request.get(URL,headers = headers)
使用请求库的get方法,去访问网页,第一个参数为网址,第二个参数为请求头,请求结果赋值给变量response,其中里面有很多结果,状态响应码,网页二进制代码,二进制等
response.status_code == 200
调用请求结果响应中的status_code查看请求状态码,200代表请求成功,就返回,否则返回一个None,状态码一般有2xx,4xx,3xx,5xx,分别代表请求成功,客户端访问失败,重定向,服务器问题。
返回response.text
返回响应结果的text,代表返回网页html源码
解析网页
在上面返回了一个响应后,我们需要解析网页html源码,需要结构化,可以提取
html = BeautifulSoup(html)
提取数据
我们来提取排名,鼠标放在排名这个元素这里,右键检查:
li:nth-child(1)需要改成li,因为nth-child(在右边可以看到一串二进制。其中有个高两个,就是刚刚那个排名的元素,快捷跟随提示选择然后复制过去,其中li:nth-child(1) 1)是获取li标签下的一条数据,我们是要获取这一页的所有排名
# 排名
ranks = html.select('#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_num')
同样的方法提取歌手歌名,播放时间
# 歌手 + 歌名
names = html.select('#rankWrap > div.pc_temp_songlist > ul > li > a')
# 播放时间
times = html.select('#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_tips_r > span')
获得数据
for r,n,t in zip(ranks,names,times):
r = r.get_text().replace('\n','').replace('\t','').replace('\r','')
n = n.get_text()
t = t.get_text().replace('\n','').replace('\t','').replace('\r','')
用了zip函数,意思是把对应的排名,歌名歌手,播放时间打包,可以这样理解zip函数的结果是一个列表[(排名,歌手歌名,播放时间),(排名,歌手歌名,播放时间)。。。。。]
每一次循环的r,n,t一次对应元组中的元素
get_text()
我们提取到的是这个数据所在的标签信息,并不是实际数据,所以需要使用get_text()获得实际数据
.replace('\ n','')。replace('\ t','')。replace('\ r','')
去掉实际数据中多余的字符串
最后把数据打包成字典打印
结束
到这里我们的关键步骤就完成了,大家好好理解一下,很容易的。
在这里说一下,这种提取方式是不会常见的,因为效果很不健壮,可能过几天被人网页改了改结构,就不能使用了,这里只是让大家初步了解一下爬虫的大致提取流程,后面会使用其他更健壮的方法的。
运行结果:
最终代码
import requests
import time
from bs4 import BeautifulSoup def get_html(url):
'''
获得 HTML
'''
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/53\
7.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text
else:
return def get_infos(html):
'''
提取数据
'''
html = BeautifulSoup(html)
# 排名
ranks = html.select('#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_num')
# 歌手 + 歌名
names = html.select('#rankWrap > div.pc_temp_songlist > ul > li > a')
# 播放时间
times = html.select('#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_tips_r > span') # 打印信息
for r,n,t in zip(ranks,names,times):
r = r.get_text().replace('\n','').replace('\t','').replace('\r','')
n = n.get_text()
t = t.get_text().replace('\n','').replace('\t','').replace('\r','')
data = {
'排名': r,
'歌名-歌手': n,
'播放时间': t
}
print(data) def main():
'''
主接口
'''
urls = ['https://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'
.format(str(i)) for i in range(1, 24)]
for url in urls:
html = get_html(url)
get_infos(html)
time.sleep(1) if __name__ == '__main__':
main()
【Python】【爬虫】爬取酷狗TOP500的更多相关文章
- 使用Xpath爬取酷狗TOP500的歌曲信息
使用xpath爬取酷狗TOP500的歌曲信息, 将排名.歌手名.歌曲名.歌曲时长,提取的结果以文件形式保存下来.参考网址:http://www.kugou.com/yy/rank/home/1-888 ...
- 爬虫实例学习——爬取酷狗TOP500数据
酷狗网址:https://www.kugou.com/yy/rank/home/1-8888.html?from=rank 环境:eclipse+pydev import requests from ...
- Java爬虫系列之实战:爬取酷狗音乐网 TOP500 的歌曲(附源码)
在前面分享的两篇随笔中分别介绍了HttpClient和Jsoup以及简单的代码案例: Java爬虫系列二:使用HttpClient抓取页面HTML Java爬虫系列三:使用Jsoup解析HTML 今天 ...
- python使用beautifulsoup4爬取酷狗音乐
声明:本文仅为技术交流,请勿用于它处. 小编经常在网上听一些音乐但是有一些网站好多音乐都是付费下载的正好我会点爬虫技术,空闲时间写了一份,截止4月底没有问题的,会下载到当前目录,只要按照bs4库就好, ...
- python爬取酷狗音乐排行榜
本文为大家分享了python爬取酷狗音乐排行榜的具体代码,供大家参考,具体内容如下
- Python爬取酷狗飙升榜前十首(100)首,写入CSV文件
酷狗飙升榜,写入CSV文件 爬取酷狗音乐飙升榜的前十首歌名.歌手.时间,是一个很好的爬取网页内容的例子,对爬虫不熟悉的读者可以根据这个例子熟悉爬虫是如何爬取网页内容的. 需要用到的库:requests ...
- Python爬虫 - 爬取百度html代码前200行
Python爬虫 - 爬取百度html代码前200行 - 改进版, 增加了对字符串的.strip()处理 源代码如下: # 改进版, 增加了 .strip()方法的使用 # coding=utf-8 ...
- 用Python爬虫爬取广州大学教务系统的成绩(内网访问)
用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code ...
- 使用Python爬虫爬取网络美女图片
代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...
随机推荐
- PUT方法写shell
前言: PUT是http的一个请求方法 PUT的前提,是了解HTTP协议.下面给出HTTP - PUT的一个模板: PUT /test.txt HTTP/1.1 Accept: */* Accept- ...
- JZOJ5988 珂学计树题
题意 liu_runda曾经是个喜欢切数数题的OIer,往往看到数数题他就开始刚数数题.于是liu_runda出了一个数树题.听说OI圈子珂学盛行,他就在题目名字里加了珂学二字.一开始liu_rund ...
- 题解 AT5632 【Sum of Two Integers】
在幼儿园的时候,我们就学习过把一个数分成\(a\)与\(b\),我们只需要用计算机来模拟这个过程就可以了. 我们先从奇数开始看起,以\(5\)为例: 我们可以发现,\(5\)可以分成\(1\)和\(4 ...
- 2019-2020-2 《网络对抗技术》Exp0 环境搭建-Kali Linux 的安装
2019-2020-2 20175334 环境搭建-Kali Linux 的安装 一.Kali的下载与安装 在Kali官网中下载镜像文件 打开Vmware开始创建新虚拟机 选择镜像文件 选择操作系统 ...
- 小白月赛22 F: 累乘数字
F:累乘数字 考察点: 思维,高精度 坑点 : 模拟就 OK 析题得侃: 如果你思维比较灵敏:直接输出这个数+ d 个 "00"就行了 当然,我还没有那么灵敏,只能用大数来搞了 关 ...
- git三剑客笔记
看了git三剑客视频总结的笔记,只给自己参考. 常用命令 查看分支:git branch 创建分支:git branch <name> 切换分支:git checkout <name ...
- Pascal运行错误表
(A)DOS错误代码 1:错误的功能代码尝试错误的操作系统调用.2:文件未找到程序试图删除.重命名和打开一个不存在的文件.3:目录未发现目录不存在或是错误,也有可能是访问一个不存在的文件.4:打开太多 ...
- 在Scala中免费验证
优锐课带你详细了解如何在Scala中实施免费的monad验证.抽丝剥茧,细说架构那些事! 由于业务数据的复杂性,已经在数据验证上花费了很多精力.在Scala中,提出了使用应用程序进行验证的方法,并被广 ...
- 熵权法(the Entropy Weight Method)以及MATLAB实现
按照信息论基本原理的解释,信息是系统有序程度的一个度量,熵是系统无序程度的一个度量:如果指标的信息熵越小,该指标提供的信息量越小,在综合评价中所起作用理当越小,权重就应该越低.因此,可利用信息熵这个工 ...
- numpy学习(一)
(一)基础学习 学习渠道:阿里天池AI学习——Numpy基础(传送门) (二)练习篇 练习渠道:Numpy基础100题(Part 1) 1. Import the numpy package unde ...