本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。
以下文章来源于罗罗攀 ,作者罗罗攀
刚接触Python的新手、小白,可以复制下面的链接去免费观看Python的基础入门教学视频
https://v.douyu.<a href="https://www.gaodaima.com/tag/com" title="查看更多关于com的文章" target="_blank">com</a>/author/y6AZ4jn9jwKW
www#gaodaima.com来源gaodai#ma#com搞*代#码网搞代码
前言
是否还记得断桥残雪,一听就是一下午 是否还记得认错,上课前必点歌曲 是否还记得素颜,同桌那清秀的脸庞
最近许嵩在开演唱会,几乎机会,听着许嵩的歌,做成这次分享,不禁唏嘘,我们在慢慢的长大,竟记不起当年模样。
网页分析
这里,我们进入网易云音乐官网,找到许嵩的个人单曲。
这里是post请求,而且参数较复杂,所以使用硒来进行爬虫,这里除了获取基本信息外,需要获取每首歌的id,用于歌词爬虫。
歌词爬虫,我们使用下面的网址即可,换不同的id,就是不同歌的歌词。
http://music.163.com/api/song/lyric?id=1309642305&lv=1&kv=1&tv=-1
爬虫代码
首先是所有歌曲的爬虫,使用硒,部分代码见下。
<span>from</span> selenium <span>import</span><span> webdriver </span><span>from</span> lxml <span>import</span><span> etree </span><span>import</span><span> time </span><span>import</span><span> csv </span><span>def</span><span> get_info(url): driver </span>=<span> webdriver.Chrome() driver.maximize_window() driver.get(url) driver.implicitly_wait(</span>10<span>) iframe </span>= driver.find_elements_by_tag_name(<span>"</span><span>iframe</span><span>"</span><span>)[0] driver.switch_to.frame(iframe) html </span>=<span> etree.HTML(driver.page_source) infos </span>= html.xpath(<span>"</span><span>//div[@class="srchsongst"]/div</span><span>"</span><span>) </span><span>for</span> info <span>in</span><span> infos: song_id </span>= info.xpath(<span>"</span><span>div[2]/div/div/a/@href</span><span>"</span>)[0].split(<span>"</span><span>=</span><span>"</span>)[-1<span>] song </span>= info.xpath(<span>"</span><span>div[2]/div/div/a/b/text()</span><span>"</span><span>)[0] singer1 </span>= info.xpath(<span>"</span><span>div[4]/div/a</span><span>"</span><span>)[0] singer </span>= singer1.xpath(<span>"</span><span>string(.)</span><span>"</span><span>) album </span>= info.xpath(<span>"</span><span>div[5]/div/a/@title</span><span>"</span><span>)[0] </span><span>print</span><span>(song_id,song,singer,album) writer.writerow([song_id, song, singer, album]) </span><span>if</span> <span>__name__</span> == <span>"</span><span>__main__</span><span>"</span><span>: fp </span>= open(<span>"</span><span>music.csv</span><span>"</span>, <span>"</span><span>w</span><span>"</span>, newline=<span>""</span>, encoding=<span>"</span><span>utf-8</span><span>"</span><span>) writer </span>=<span> csv. writer(fp) writer.writerow([</span><span>"</span><span>song_id</span><span>"</span>, <span>"</span><span>song</span><span>"</span>, <span>"</span><span>singer</span><span>"</span>, <span>"</span><span>album</span><span>"</span><span>]) url </span>= <span>"</span><span>https://music.163.com/#/search/m/?s=%E8%AE%B8%E5%B5%A9&type=1</span><span>"</span><span> get_info(url)</span>
在这些歌中,有些是cover的,而有些是伴奏,在下载歌词之前,我们对这些数据进行清洗,尽量保证是许嵩原创而且不是伴奏的。
<span>def</span><span> foo1(singer): </span><span>if</span> <span>"</span><span>许嵩</span><span>"</span> <span>in</span><span> singer: </span><span>return</span> <span>"</span><span>no cover</span><span>"</span> <span>else</span><span>: </span><span>return</span> <span>"</span><span>cover</span><span>"</span> <span>def</span><span> foo2(song): </span><span>if</span> <span>"</span><span>伴奏</span><span>"</span> <span>in</span><span> song: </span><span>return</span> <span>"</span><span>是</span><span>"</span> <span>else</span><span>: </span><span>return</span> <span>"</span><span>否</span><span>"</span><span> music[</span><span>"</span><span>原创</span><span>"</span>] = music[<span>"</span><span>singer</span><span>"</span><span>].apply(foo1) music[</span><span>"</span><span>伴奏</span><span>"</span>] = music[<span>"</span><span>song</span><span>"</span><span>].apply(foo2) music[(music[</span><span>"</span><span>原创</span><span>"</span>] == <span>"</span><span>no cover</span><span>"</span>) & (music[<span>"</span><span>伴奏</span><span>"</span>]== <span>"</span><span>否</span><span>"</span>)].to_csv(<span>"</span><span>music_original.csv</span><span>"</span>,index=None,encoding=<span>"</span><span>utf-8</span><span>"</span>
最后,我们根据前面的url,下载歌词。
<span>import</span><span> requests </span><span>import</span><span> re </span><span>import</span><span> json url </span>= <span>""</span><span> headers </span>=<span> { </span><span>"</span><span>user-agent</span><span>"</span>: <span>"</span><span>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36</span><span>"</span><span> } </span><span>def</span><span> get_info(id): res </span>= requests.get(<span>"</span><span>http://music.163.com/api/song/lyric?id={}&lv=1&kv=1&tv=-1</span><span>"</span>.format(id),headers=<span>headers) json_data </span>=<span> json.loads(res.text) lyric </span>= json_data[<span>"</span><span>lrc</span><span>"</span>][<span>"</span><span>lyric</span><span>"</span><span>] lyric </span>= re.sub(<span>"</span><span>[.*]</span><span>"</span>,<span>""</span><span>,lyric) </span><span>return</span><span> lyric </span><span>for</span> i <span>in</span><span> range(music_original.shape[0]): </span><span>try</span><span>: fp </span>= open(<span>"</span><span>song/{}.txt</span><span>"</span>.format(music_original.iloc[i,1]),<span>"</span><span>w</span><span>"</span>,encoding=<span>"</span><span>utf-8</span><span>"</span><span>) fp.write(get_info(music_original.iloc[i,0])) fp.close() </span><span>except</span><span>: </span><span>pass</span>
数据分析
01数据基本情况
许嵩歌曲共计175首,妥妥的原创高产歌手〜
02专辑单曲数
早期的许嵩,是一个网络歌手,所以都放在了许嵩单曲集中,随后发的苏格拉没有底,寻雾启示是很不错的优秀专辑。
03歌词词云
最后利用jieba分词,制作许嵩歌词的词云。
许嵩的歌偏悲伤爱情,通过词云也可以修剪来。