题目和代码
爬取https://www.kugou.com/yy/rank/home/1-8888.html?from=rank 排名情况、歌手、歌曲名和歌曲时间。
import requests
from bs4 import BeautifulSoup
import time
import pandas as pd
def get_links():
links_list = []
for i in range(1, 24):
link = "https://www.kugou.com/yy/rank/home/" + str(i) + "-8888.html?from=rank"
get_info(link)
time.sleep(1)
def get_info(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'referer': url}
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text, 'lxml')
ranks = soup.select('#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_num')
singers_songs = soup.select('#rankWrap > div.pc_temp_songlist > ul > li > a')
durations = soup.select('#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_tips_r > span')
for r, s, d in zip(ranks, singers_songs, durations):
rank = r.get_text().strip()
singer_song = s.get("title").split("-")
singer = singer_song[0]
song = singer_song[1]
duration = d.get_text().strip()
info_df.loc[rank] = [singer, song, duration]
if __name__ == "__main__":
info_df = pd.DataFrame(columns = ['singer', 'song', 'duration'])
get_links()
print(info_df)
info_df.to_excel("kugou_top500.xlsx")
singer song duration
1 海伦 桥边姑娘 3:03
2 要不要买菜 下山 2:53
3 阿冗 你的答案 3:39
4 张韶涵 欧若拉 4:22
5 en 嚣张 4:14
.. ... ... ...
496 BEYOND 真的爱你 4:37
497 刘德华 17岁 4:00
498 张敬轩 只是太爱你 4:14
499 尹毓恪、宋祖儿 欧若拉 (Live) 3:44
500 陈奕迅 陪你度过漫长岁月 4:02
[500 rows x 3 columns]
代码分析
getlinks()
函数,拼接了23个url,即Top500音乐所在的所有网页的url。- 用拼接好的url去调用
get_info(url)
函数,获得每个网页的内容。 - 每调用一次
get_info(url)
后,用time.sleep(1)
让程序暂停1秒,防止请求网页频率过快而导致爬虫失败。 - 注意获得排名时,不能使用
ranks = soup.select('#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_num > strong')
,因为只有前三首歌加了红色强调标记。 - 使用
singer_song = s.get("title").split("-")
分割字符串,得到歌手和歌名 info_df.to_excel("kugou_top500.xlsx")
,将爬取内容保存到kugou_top500.xlsx文件中- 构造多页URL:
urls = ['http://www.kugou.com/yy/rank/home/{}-8888.html'.format (str(i)) for i in range(1, 24)]