请使用爬虫Selenium模拟浏览器获取爬取QQ音乐中你喜欢的某位歌手(可以是任意歌手)最受欢迎的前5首歌曲的歌词、流派、歌曲发行时间、评论条数、评论时间、评论点赞次数、评论内容具体(每一首歌的评论>=500条)。QQ音乐地址https://y.qq.com/
如下图所示:
解题思路:1.首先是配置好谷歌驱动
2.第二步找到要查找的歌手
我选择了两种方式:
方法一:打开客户端的界面,因为会弹出窗口,且需要加载才会显示。
使用sleep,等待加载出来后点击关闭按钮
在输入框内输入“陈奕迅”并点击即可
方法二:因为网络问题,加载出要关闭的窗口需要一段时间,所以可以直接打开陈奕迅的界面。
配置CSV文件的存写。
利用循环分别找到我们定好的五首歌,获取歌曲名,歌词,流派,歌曲发行时间,评论数,500条评论。其中歌词需要进行展开,才能得到完整的歌词,进行拼接。
为了更加美观可以给CSV文件添加一行表头,CSV文件就清晰明了了。取得成功后存入即可。
使用Pandas模块创建5个Series,即一首歌的数据一个Series,统计每首歌的每个评论点赞次数(没有点赞则为0次),求5首歌的平均点赞次数和标准差。
平均值可以使用mean(),标准差可以使用var()。
使用Pandas模块创建5个DataFrame,分析其评论条数和点赞数量的相关性。
相关性使用corr()函数可以求得相关性。
from selenium import webdriver import csv wd=webdriver.Chrome(r'd:\chromedriver\chromedriver.exe') wd.implicitly_wait(10) ''' wd.get('https://y.qq.com') #关闭打开客户端界面 from time import sleep sleep(5) element=wd.find_element_by_css_selector('.popup__icon_close') element.click() #搜索歌手,陈奕迅 element1=wd.find_element_by_class_name("search_input__input") element1.send_keys('陈奕迅') element2=wd.find_element_by_class_name("search_input__btn") element2.click() ''' song_url_list=[] song_resourses=[] wd.get('https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=%E9%99%88%E5%A5%95%E8%BF%85') #配置 csv_file = open('qqyinyue1.csv','w',newline='',encoding='gb18030') writer = csv.writer(csv_file) #选择陈奕迅查看热门歌曲 element3=wd.find_element_by_css_selector('[href="https://y.qq.com/n/yqq/singer/003Nz2So3XXYek.html"]') element3.click() #获取URL num=2#歌曲数量 item=wd.find_elements_by_class_name("songlist__item") for song in item: song__url=song.find_element_by_class_name("js_song").get_attribute("href") song_url_list.append(song__url) num-=1 if(num==0): break '''#选择第一首热门歌曲 element4=wd.find_element_by_css_selector('[href="//y.qq.com/n/yqq/song/001OyHbk2MSIi4.html"]') webdriver.ActionChains(wd).move_to_element(element4).click(element4).perform()''' def getSongResourse(url): song_resourse={} wd.get(url) from time import sleep sleep(3) # 获取歌曲名 song_name=wd.find_element_by_class_name("data__name_txt").text print(song_name) #歌词 # 展开歌词 wd.find_element_by_partial_link_text("[展开]").click() from time import sleep sleep(1) lyic = "" # 获取拼接歌词 lyic_box = wd.find_element_by_id("lrc_content").find_elements_by_tag_name("p") for l in lyic_box: if l.text != "": lyic += l.text + "\n" # 获取流派,歌曲发行时间,评论数 song_liupai = wd.find_element_by_css_selector(".js_genre").text[3:] song_time = wd.find_element_by_css_selector(".js_public_time").text[5:] song_comment_num = wd.find_element_by_css_selector(".js_into_comment").text[3:-1] # 获取500条评论 comments=[] t=1#点击更多次数,40就超过500条 for i in range(t): try: wd.find_element_by_partial_link_text("点击加载更多").click() except: break sleep(1) comments_list=wd.find_element_by_css_selector(".js_hot_list").find_elements_by_tag_name("li") for j in comments_list: content=j.find_element_by_css_selector(".js_hot_text").text content_time=j.find_element_by_css_selector(".comment__date").text zan_num=j.find_element_by_class_name("js_praise_num").text comment = {} comment.update({"评论内容":content}) comment.update({"评论时间":content_time}) comment.update({"评论点赞次数":zan_num}) comments.append(comment) print( song_name + "热门评论获取结束") print(song_name+"所有信息获取完毕") song_resourse.update({"歌曲名": song_name}) song_resourse.update({"歌词":lyic}) song_resourse.update({"流派":song_liupai}) song_resourse.update({"歌曲发行时间":song_time}) song_resourse.update({"评论条数":song_comment_num}) song_resourse.update({"精彩评论":comments}) return song_resourse for song_page in song_url_list: song_resourses.append(getSongResourse(song_page)) for i in song_resourses: writer.writerow(["歌曲名", "歌词", "流派", "歌曲发行时间", "评论条数"]) writer.writerow([i["歌曲名"],i["歌词"],i["流派"],i["歌曲发行时间"],i["评论条数"]]) writer.writerow(["评论内容", "评论时间", "评论点赞次数"]) for j in i["精彩评论"]: writer.writerow([j["评论内容"],j["评论时间"],j["评论点赞次数"]]) writer.writerow([]) '''p=[] s=[] sum1=0 import pandas as pd #一维Series for j in song_resourses[0]["精彩评论"]: s=j["评论点赞次数"] for i in s: sum1+=eval(i) s1 = pd.Series(s) #使用pandas计算平均值 print("平均值:"+s1.mean()) #使用pandas计算标准差 print("标准差:"+s1.var()) #二维数组DataFrame d1=pd.DataFrame() #分析其评论条数和点赞数量的相关性 x1=d1.corr() print("相关性:"+x1)''' import pandas as pd import csv #创建Series se=[] names=[] # 先读取CSV文件的内容至内存中 with open("qqyinyue1.csv",'r',encoding='gb18030') as f: # 创建阅读器对象 reader = csv.reader(f) rows = [row for row in reader] index=0 for i in range(5): s1=[] names.append(rows[index].__str__().split(',')[0][2:-1]) index+=1 # 读取五百条评论的点赞消息 for j in range(510): try: s1.append(int(rows[index].__str__().split(',')[2][2:-2])) index+=1 except: break se.append(s1) # 读取掉空行 index+=1 print("CSV数据解析") likes=[] comments=[] # 创建的5个series for i in range(5): series=pd.Series(se[i]) likes.append(sum(se[i])) comments.append(len(se[i])) print(names[i]+"的平均点赞次数是:" + str(series.mean())) print(names[i] + "的标准差是:" + str(series.std())) #DataFrame df=pd.DataFrame(columns=()) df.insert(0,'likes',likes) df.insert(0,'comments',comments) print("点赞和评论原始数据") print(df) print("线性相关分析数据") print(df.corr()) csv_file.close() print("Tans.plt")