Selenium+Request+Beautifulsoup(周杰伦,林俊杰歌词爬取)

爬去JZ的歌词是为了做一个NlLP的任务,这里是在python上使用Selenuim+Requests+BeautifulSoup实现的。使用selenuim是因为会涉及到动态网页抓取,又使用Request的原因是selenium对网页抓取时是要先进行加载的因此很耗时间,而Request不需要网页加载。对网页解析既使用了selenium也是使用BeautifulSoup
爬取的网站是千千音乐

第一种方案:

千千音乐上面可以直接搜索:周杰伦 歌词,然后点击歌词,可以得到如下界面。每一页有二十首歌的g歌词,通过分析每一页的网址是规律可行变化的。:
第一页url:http://music.taihe.com/search/lrc?key=周杰伦 歌词&start=0&size=20&third_type=0
第二页url:http://music.taihe.com/search/lrc?key=周杰伦 歌词&start=20&size=20&third_type=0
第三页url:http://music.taihe.com/search/lrc?key=周杰伦 歌词&start=40&size=20&third_type=0
在这里插入图片描述在这里插入图片描述
可以看见URL的变化就是start后面的数字0,20,40,…。那么这样问题就变得简单了。
优点:这个方案优点是可以直接Requests进行静态网页抓取,然后使用BeautifulSoup进行解析.
缺点:网页显示歌词数量776,但实际上可能有重复,有的可能是由于出现周杰伦名字就被搜索出来,因此有很多嘈杂数据.下面介绍另一种方案以及实现代码。

第二种方案

我们直接进入JZ的界面,如下所示,可以看见这里列举的全是JZ的歌曲,一共有26页,每页15首。但是每一页加载是js动态加载的,也就是不可以通过网页规律获取。
在这里插入图片描述在这里插入图片描述
我们看一下上面这个页面的源代码(在“告白气球”,点击右键,选择查看元素),可以查看指定元素代码,如下图所示,可以看见“告白气球”歌名对应的标签是“<a><a/>”,其中包含有title也就是歌名,还有href包含有歌曲的ID。这里很重要的就是歌曲的ID,因为后面我们会通过ID变化来静态获取单个歌曲界面。
在这里插入图片描述在这个歌曲列表界面,需要点击下方的页码才能进入下一个歌曲列表界面,我们看一下其页码元素(也是单击右键,选择查看元素):
在这里插入图片描述

可以看见每一个页码对应一个"<a></a>” tag和一个事件event,这个就需要我们鼠标点击才能进入下页歌曲列表。因此获取歌曲ID时我们使用了selenium来进行动态获取。

我们再点击每一首歌,然后就会进入,该歌曲的界面,比如下面我们点击“告白气球”,就会进入如下界面:
在这里插入图片描述可以看见,这页有歌词显现,那么说明我们就可以通过分析单首歌的歌曲界面来获得其歌词。而这单首歌曲界面的url是有规律可循的我们来看一下:
告白气球URL:http://music.taihe.com/song/266322598
夜曲的URL:http://music.taihe.com/song/1191265
可以看出单首歌曲的界面的URL就是:“http://music.taihe.com/song/”+ID。

我们来分析一下该页面歌词块的源码元素(鼠标放在歌词处,单击右键),出现如下源码:
在这里插入图片描述
可以看见,“告白气球”的歌词也是动态加载的,并没有实际歌词出现在该处,那么我们可以看见歌词处对应个tag “div”包含歌词的数据链接data-lrclink,我们点击这个链接,可以直接获取该歌词的lrc文件.

这里我们就可以写出第二种方案的路径:
1.通过selenium动态获取歌词ID
2.通过requests静态获取单首歌界面
3.通过BeautifulSoup获取歌词链接
4.在通过requests获取歌词

代码

获取歌词ID:

from selenium import webdriver
from bs4 import BeautifulSoup
import time
import csv
import requests
##为什么用S+R+B,因为页面是动态,先用selenium动态获取信息,用BeautifulSoup来解析.最后下载使用Requests,这是因为Selenium需要加载页面,而requests不需要driver=webdriver.Firefox()
url_init="http://music.taihe.com/artist/7994?pst=sug"
driver.get(url_init)
page_list=list(range(2,27))
file=open("ID_Name1.csv","w")
writer=csv.writer(file)def B_get_song_id(page,text):soup=BeautifulSoup(text,"html.parser")print("page:",page)if page==0:songs = soup.find_all("a", "songlist-songname")else:songs=soup.find_all("a","namelink gray")song=[]for a in songs:song_inf={}song_inf["name"]=a["title"]song_inf["id"]=a["href"].split("/")[-1]song.append(song_inf)print(song)return songdef S_get_page(driver):songs=[]data=B_get_song_id(0,driver.page_source)songs.extend(data)for page_num in page_list:a_list=driver.find_elements_by_css_selector("a.page-navigator-number")for a in a_list:if int(a.text)==page_num:page=int(a.text)a.click()time.sleep(10)#加载时间,保证加载完成data=B_get_song_id(page,driver.page_source)songs.extend(data)breakreturn songsdata=S_get_page(driver)
for song in data:writer.writerow(song.values())
file.close()
driver.close()

获取歌词:

import pandas as pddef R_get_text(url):try:print("url:",url)Response=requests.get(url)Response.raise_for_status()Response.encoding=Response.apparent_encodingreturn Response.textexcept:print("出现错误再Try一次")#这里再try一次是因为,我网速不稳定try:print("url:", url)Response = requests.get(url)Response.raise_for_status()Response.encoding = Response.apparent_encodingreturn Response.textexcept:print("出现错误")print("错误地点:", url)return Nonedef B_get_lrc_link(text):soup=BeautifulSoup(text,"html.parser")lrcbox=soup.find("div","lrc-list")if lrcbox:return lrcbox["data-lrclink"]def get_lrc_link_list(data,url):lrc_links=[]for ip in data["IP"]:id_link={}text=R_get_text(url+str(ip))time.sleep(3)#sleep一方面是为了让网页有充足时间加载(主要还是自己网速不稳定),另一方面避免请求过于频繁,对服务器造成负担if text:id_link["Link"]=B_get_lrc_link(text)id_link["IP"]=str(ip)lrc_links.append(id_link)return lrc_linksdef get_lrc(linklist,path):for ip_link in linklist:with open(path+ip_link["IP"]+".txt","w") as f:lrc=R_get_text(ip_link["Link"])if lrc:f.write(lrc)def main():data = pd.read_csv("ID_Name1.csv", names=["Name", "IP"])url = "http://music.taihe.com/song/"save_path = "LyrcFile/"lrc_links=get_lrc_link_list(data,url)get_lrc(lrc_links,save_path)main()

事实上任意歌手的歌词都可以通过此代码抓取,只需更换url_init

最后获得的歌词列表如下:
在这里插入图片描述
比如204421.txt打开是这样的:
在这里插入图片描述

简单词云分析

根据上面爬去的歌词文件,我们这里使用jieba做分词,然后统计词频,做一个简单的词云分析:

from collections import Counter
import jieba
import os
from wordcloud import  WordCloud
import numpy as np
import matplotlib.pyplot as pldef chulitext(lrc):lrc_pure=[]if "演唱:周杰伦" in lrc:lrc=lrc.split("\n")start = 0for sentence in lrc:if start==1:sentence=sentence.split("]")if (len(sentence)>=2) and (len(sentence[-1])>=2):lrc_pure.append(sentence[-1])if "演唱:周杰伦" in sentence:start=1return lrc_puredef get_pure_lrc(path):data=[]for ip in os.listdir(path):file=path+ipip=ip.split(".")[0]with open(file,"r") as f:song={}lrc_pure=chulitext(f.read())if len(lrc_pure)>0:song["IP"]=ipsong["Lrc"]=lrc_puredata.append(song)return datadef get_lrc_ci(lrc):ci=[]for sentence in lrc["Lrc"]:sentence=list(jieba.cut(sentence))sentence_del_stop=[]for word in sentence:if len(word)>1:sentence_del_stop.append(word)ci.extend(sentence_del_stop)return cidef get_all_ci(data):all_ci=[]for lrc in data:lrc_ci=get_lrc_ci(lrc)all_ci.extend(lrc_ci)return  all_cidef generate_ciyun(cipin):cipin_dict={}for ci in cipin:if ci[0] not in ["活活","四步","两步","这样","一个"]:cipin_dict[ci[0]]=ci[1]wc = WordCloud(font_path='msyh.ttf',max_words=100,background_color='white',width=600,height=400)wc.generate_from_frequencies(cipin_dict)wc.to_file('JZ.png')def zhuzhangtu(cipin):y=[]x_name=[]for ci in cipin:if ci[0] not in ["活活","四步","两步","这样","一个"]:y.append(ci[1])x_name.append(ci[0])if len(y)>=10:breakx=np.arange(len(y))pl.figure(1)pl.bar(x,y,facecolor = 'red', edgecolor = 'white')pl.xticks(x,x_name,fontproperties="SimHei")pl.show()path="LyrcFile/"
data=get_pure_lrc(path)
all_ci=get_all_ci(data)
generate_ciyun(Counter(all_ci).most_common())
zhuzhangtu(Counter(all_ci).most_common())

输出结果:
在这里插入图片描述
柱状图显示词频最高的前十个词:
在这里插入图片描述

下面是使用代码爬取林俊杰歌词做的分析结果:

在这里插入图片描述在这里插入图片描述

这里由于爬取的歌词多,时间慢,因此我们可以使用多进程爬虫来提升爬取速度.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/61439.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬取QQ音乐(周杰伦)

首先呢&#xff0c;我们打开QQ音乐搜索周杰伦 https://y.qq.com/portal/search.html#page1&searchid1&remoteplacetxt.yqq.top&tsong&w周杰伦 一切做好准备后呢&#xff0c;我们需要找到歌曲清单&#xff0c;找到client_search&#xff08;客户端搜索&#xf…

【方向盘】轰动从未停止,感动从未消失。他,是周杰伦

不仅20年&#xff0c;不仅是青春。 本文已被https://yourbatman.cn收录&#xff1b;女娲Knife-Initializr工程可公开访问啦&#xff1b;程序员专用网盘https://wangpan.yourbatman.cn&#xff1b;公号后台回复“专栏列表”获取全部小而美的原创技术专栏 你好&#xff0c;我是方…

用Python分析周杰伦歌曲并进行数据可视化

大家好&#xff0c;今天我们用python分析下周杰伦歌曲。为了尽量完整地呈现从原始数据到可视化的过程&#xff0c;接下来我们会先简单讲解数据的预处理过程&#xff0c;即如何将 JSON 数据转化为Excel 格式&#xff0c;以及如何对周杰伦的歌曲进行分词。 本案例中的歌词数据来…

哪里可以免费听到周杰伦的歌曲?请看这里,教你免费听歌

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 小伙伴说想听周杰伦的音乐&#xff0c;有什么网站是可以免费听的&#xff0c;然后他发现咪咕音乐可以免费听周杰伦的歌曲&#xff0c;既然可以免费听&#xff0c;那…

计算机音乐谱大全告白气球,周杰伦《告白气球》钢琴曲谱

《告白气球》是由方文山作词&#xff0c;周杰伦作曲并演唱的歌曲&#xff0c;收录于周杰伦2016年6月24日发行的专辑《周杰伦的床边故事》中。2017年1月&#xff0c;这首歌曲获得Billboard Radio China 2016年度十大金曲奖。 创作背景 词作者方文山为周杰伦创作了《印地安老斑鸠…

周杰伦的歌里都有些啥?

周董的夕阳红粉丝团“被迫营业”&#xff0c;把蔡徐坤拉下了盘踞许久的微博超话人气榜第一&#xff0c;还一举破了亿。 当然&#xff0c;等我知道的时候&#xff0c;都战局已定了……作为当年会唱前三张专辑里所有歌曲的老粉&#xff0c;不想就这么躺赢&#xff0c;我今天也来给…

Python+pyecharts研究周杰伦歌词中的 秘密

一个朋友很喜欢周杰伦。 所以&#xff0c;前两天我跟别人去KTV&#xff0c;就唱的是“七里香”。 唱着唱歌&#xff0c;突然就好奇了起来。周杰伦的歌里&#xff0c;是不是还有很多的麻雀 后来发现&#xff0c;270首歌&#xff0c;140786个字&#xff0c;千言万语&#xff0…

周杰伦入局元宇宙,带你搞懂元宇宙怎么玩

自古以来&#xff0c;每个新兴产业的崛起&#xff0c;最关键、最重要的元素一定是流量&#xff0c;这对于元宇宙来说亦是如此。如果Facebook的入局元宇宙行业吸引了第一波市场流量&#xff0c;那么NBA球星史蒂芬库里、歌手林俊杰、周杰伦等明星入局的影响力就为“元宇宙”吸引了…

HTML网页设计:周杰伦网站

Hello朋友们&#xff01;我们又见面了&#xff01;是不是又到了焦头烂额忙期末设计的作业的时候了&#xff0c;不要担心&#xff0c;我来了&#xff0c;经过不懈的努力写出了一个比较容易懂的网页&#xff0c;完全足够应付你亲爱的老师的网页设计大作业&#xff01; 哦&#xf…

用matlab演奏周杰伦的《七里香》

问题描述 前几天在学习matlab的时候&#xff0c;发现了一篇用matlab演奏音乐的文章&#xff0c;不禁感叹matlab居然还能这么玩&#xff01;于是我就学着用matlab演奏我最喜欢听的一首歌——周杰伦的《七里香》。最后成果我已经发到B站&#xff0c;链接为&#xff1a;用matlab演…

WPF 消息传递简明教程

WPF 消息传递简明教程 独立观察员 2023 年 4 月 24 日 0、说明 参考&#xff1a;https://www.cnblogs.com/cdaniu/p/16852620.html 使用包&#xff1a;CommunityToolkit.Mvvm&#xff08;8.1.0&#xff09; 1、订阅 让需要使用消息的 ViewModel 继承 ObservableRecipient&#…

VMware官网注册账号之验证码问题

VMware官网注册账号之验证码问题 首先上个官网注册账号链接&#xff5e; https://my.vmware.com/zh/web/vmware/registration 点我访问官网注册 然后不出意外都会看见中文版页面 这时候不要着急注册&#xff0c;因为你会发现验证码是这个造型的 抓狂的时候来了&#xff0c;不…

ChatGpt3.5 使用小记001

使用了一段时间的ChatGpt。主要的用途是向它咨询些学习的问题。因为有些它的分类是对话形式的&#xff0c;所以&#xff0c;一定问题多了&#xff0c;自己都不好找。故此想稍做整理&#xff0c;在此留存。 1.英语学习类 英语单词类&#xff0c;主要是因为有些近义词在中文的翻…

chatgpt赋能Python-python3_5怎么打开

Python 3.5怎么打开&#xff1f;教你几种方法 Python是目前非常流行的一种编程语言&#xff0c;几乎在所有行业都得到了广泛的应用。Python非常容易上手&#xff0c;且有强大的数据处理和科学计算能力。现在我们来说一下&#xff0c;如何在您的计算机上打开Python 3.5。 方法…

python-openCV实现银行卡卡号识别

实现效果&#xff1a; code import cv2 as cv import numpy as np# 轮廓排序 默认从左到右 # --cnts 待排序的轮廓列表 # --method 排序方法 自上而下&#xff0c;从左到右等 def sort_contours(cnts, method"left-to-right"):# 初始化反向标志和排序索引reverse F…

opencv之银行卡号识别

1.项目背景 1.1 项目介绍 这个一个opencv的经典应用,所以用它来熟悉之前的一些操作。 1.2 项目目的 通过此程序可以识别出银行卡图片中包括的银行卡卡号。 2.项目介绍 此项目主要分为两部分:模板图片处理,银行卡图片处理。 模板图片: 银行卡图片示例: 2.1 模板图片处…

【OpenCV】银行卡号识别

文章目录 前言一、环境二、代码总结 前言 本文引用其他作者代码&#xff0c;本文仅供记录用。详细内容可看此处 一、环境 如果提示没有imutils模块就pip install imutils 提供一个字体模板文件和银行卡图片。可以右键保存。 字体模板文件&#xff1a; 银行卡图片&#xff1b…

opencv-python 银行卡卡号识别

模板&#xff1a; 银行卡&#xff1a; 主要思路&#xff1a;用遮盖法 将无关紧要的上面和下面部分截掉&#xff0c;保留银行卡号差不多的位置&#xff0c;然后用opencv做图像处理&#xff0c;得到四个 连着数字的小框框&#xff0c;然后再在四个小框框里面提取出每一个单个的…

使用 OpenCV 和 Python 识别信用卡号

使用 OpenCV 和 Python 识别信用卡号 在之前的博文中&#xff0c;我们学习了如何安装 Tesseract 二进制文件并将其用于 OCR。 然后我们学习了如何使用基本的图像处理技术来清理图像以提高 Tesseract OCR 的输出。 但是&#xff0c;不应将 Tesseract 视为能够获得高精度的光学…

OpenCV-Python 模板匹配的银行卡号识别

目录 实现流程模板数字处理对模板图片进行二值化处理对二值化后的图片进行轮廓检测确定每个模板数字的图像 银行卡图片处理预处理确定每组数字轮廓检测每个数字提取数字组中的数字 模板匹配附录完整代码 实现流程 对数字模板进行处理&#xff0c;提取出单一数字的图片&#xf…