一、创作背景
这学期的大作业是要根据这学期的学习内容做一个综合程序,这次是一个爬取酷狗音乐飙升榜单的信息,并下载下来。可以方便和我一样喜欢白嫖的人员免费下载音乐。
二、使用的库
主要使用了requests库、BeautifulSoup库用于爬取信息,pandas库用于将信息写入txt文件中,pyplot库和WordCloud库用于绘制词云。
requests库---Requests库是一个Python的第三方库,可以通过调用来帮助我们实现自动爬取HTML网页页面以及模拟人类访问服务器自动提交网络请求。Requests库只有一个核心方法,即request方法。而其余六个方法则是通过调用request方法来实现各种各样的操作。通过封装调用request方法,加之添加其他代码,减少编程人员的代码编写量。
获取HTML网页的主要方法
- url:欲获取网页的网址链接url
- params:可选参数,选择字典或者字节流格式
- **kwargs:12个控制访问的参数
调用requests.get(),会构造一个向服务器请求资源的request对象,然后返回一个包含服务器资源的response对象。
BeautifulSoup库---BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.BeautifulSoup会帮你节省数小时甚至数天的工作时间。
将一段文档传入BeautifulSoup 的构造方法,就能得到一个文档的对象, 可以传入一段字符串或一个文件句柄.
from bs4 import BeautifulSoup
soup = BeautifulSoup(open("index.html"))
soup = BeautifulSoup("data")
首先,文档被转换成Unicode,并且HTML的实例都被转换成Unicode编码
BeautifulSoup("Sacré bleu!")
Sacré bleu!
然后,Beautiful Soup选择最合适的解析器来解析这段文档,如果手动指定解析器那么Beautiful Soup会选择指定的解析器来解析文档。
pandas库---pandas含有使数据分析工作变得更快更简单的高级数据结构和操作工具。pandas是基于NumPy构建的,让以NumPy为中心的应用变得更加简单。pandas有两个主要的数据结构:Series 和 DataFrame。虽然它们并不能解决所有问题,但它们为大多数人提供了一种可靠的、易于使用的基础。在这里使用DataFrame进行数据保存,将爬取的数据保存到txt文件中。
pyplot库---matplotlib 是 Python 下著名的绘图库,matplotlib 通过 pyplot 模块提供了一套类似和 Matlab 类似的画图 API,将众多绘图对象所构成的复杂结构隐藏在这套 API 内部。只需调用 pyplot 模块所提供的函数就可快速绘图以及设置图表的各种细节。
matplotlib.pyplot 的引用方式:import matplot.pyplot as plt
pyplot 模块重命名为 plt,有助于提高代码的可读性,plt 代替 matplotlib.pyplot。
WordClude库---wordcloud库把词云当作一个WordCloud对象wordcloud.WordCloud()代表一个文本对应的词云,可以根据文本中词语出现的频率等参数绘制词云词云的绘制形状、尺寸和颜色都可以设定
三、设计概要
- 算法介绍
def func1(url):
dic = {}
for i in range(1,24):
html = requests.get(url,headers=headers)
soup = BeautifulSoup(html.text,'lxml')
titles = soup.select('.pc_temp_songname')
href = soup.select('.pc_temp_songname')
times = soup.select('.pc_temp_time')
data_all = []
for titles, times, href in zip(titles, times, href):
data = {
'歌曲名称': titles.get_text().replace('\n', '').replace('\t', '').replace('\r', '').split('-')[0],
'歌手': titles.get_text().replace('\n', '').replace('\t', '').replace('\r', '').split('-')[1],
'歌曲时长': times.get_text().strip().replace('\n', '').replace('\t', '').replace('\r', ''),
'歌曲链接': href.get('href')}
print(data)
cnt_songer(data['歌手'], dic)
data_all.append(data)
data_frame(data_all)
time.sleep(2)
return dic
例化一个BeautifulSoup对象,并且将网页源码数据加载到该对象中,获取音乐名称、音乐时间以及音乐链接。使用循环将获取的名称、时间、链接通过zip()压缩到data中。返回一个包含上述信息的字典dic。
def word_cloud(items): # 可视化之词云
color_mask = imageio.imread("kugou.jpg")
wc = WordCloud(
background_color="white", # 设置背景颜色
mask=color_mask, # 设置背景图片
max_words=400, #
width=600,
height=800,
# stopwords = "", #设置停用词
font_path="./simfang.ttf",
# 设置中文字体,使得词云可以显示(词云默认字体是“DroidSansMono.ttf字体库”,不支持中文),不加这个的话显示口型乱码
max_font_size=50, # 设置字体最大值
min_font_size=10,
random_state=30, # 设置有多少种配色方案
margin=2,
)
wc.generate_from_frequencies(items)
plt.figure(1)
plt.imshow(wc)
plt.axis('off')
plt.show()
wc.to_file("酷狗TOP500词云.png")
使用matplotlib绘制词云。Color_mask为词云的背景图片,在WordCloud()中设置其他的属性如词云的长宽高、字体颜色等。使用wc.generate_from_frequencies(items)为词云中内容。
四、部分功能介绍
1.获取歌曲信息
def func1(url):
dic = {}
for i in range(1,24):
html = requests.get(url,headers=headers)
soup = BeautifulSoup(html.text,'lxml')
titles = soup.select('.pc_temp_songname')
href = soup.select('.pc_temp_songname')
times = soup.select('.pc_temp_time')
data_all = []
for titles, times, href in zip(titles, times, href):
data = {
'歌曲名称': titles.get_text().replace('\n', '').replace('\t', '').replace('\r', '').split('-')[0],
'歌手': titles.get_text().replace('\n', '').replace('\t', '').replace('\r', '').split('-')[1],
'歌曲时长': times.get_text().strip().replace('\n', '').replace('\t', '').replace('\r', ''),
'歌曲链接': href.get('href')}
print(data)
cnt_songer(data['歌手'], dic)
data_all.append(data)
data_frame(data_all)
time.sleep(2)
return dic
此部分是通过BeautifulSoup例化一个BeautifulSoup对象,并且将网页源码数据加载到该对象中,获取音乐名称、音乐时间以及音乐链接。获取歌曲信息,并用循环保存到字典中,最后返回dic字典。字典中包含歌曲名称、歌手、歌曲时间长短以及歌曲链接使用循环将获取的名称、时间、链接。
2.歌曲下载
def func2(url):
response = requests.get(url=url, headers=headers)
response.encode = response.apparent_encoding
hashs = re.findall('"Hash":"(.*?)"', response.text, re.S)
album_ids = re.findall('"album_id":(.*?),"', response.text, re.S)
FileNames = re.findall('"FileName":"(.*?)"', response.text, re.S)
data = zip(hashs, album_ids, FileNames)
for i in data:
hash = i[0]
album_ids = i[1]
FileName = i[2].encode('utf-8').decode('unicode_escape')
#print(hash, album_ids, FileName)
download_url = 'https://wwwapi.kugou.com/yy/index.php'
params = {
'r': 'play/getdata',
'callback': 'jQuery19107150201841602037_1602314563329',
'hash': '{}'.format(hash),
'album_id': '{}'.format(album_ids),
'dfid': '3ve7aQ2XyGmN0yE3uv3WcaHs',
'mid': 'ac3836df72c523f46a85d8a5fd90fe59',
'platid': '4',
'_': '1602312793005',
}
print('.....正在下载 '+FileName)
download(download_url,FileName)
print('.....下载完成')
这里使用request库,对目标网址进行解析获取Hash、album_id、FileName三个信息并将其压缩到data中。使用循环将data中的数据调入download函数进行下载歌曲。
index.php指的是浏览器开发者模式下从network中获取的php文件中的信息。从php的data中可获取歌曲的hash值和album_id值,用于之后的下载。其中play_url可以之间打开一个网页用于播放音乐,可在这个界面下保存歌曲。
五、完整的代码
因版权原因,不能出现全部代码
六、运行结果
七、总结
酷狗音乐榜单爬虫是用于爬取酷狗音乐飙升榜单,具有绘制词云、爬取信息并保存到txt文件中、下载歌曲的功能
这里主要使用了requests库、BeautifulSoup库用于爬取信息,pandas库用于将信息写入txt文件中,pyplot库和WordCloud库用于绘制词云。