【python】实验2项目2:使用爬虫Selenium模拟浏览器获取爬取QQ音乐中你喜欢的某位歌手(陈奕迅)

请使用爬虫Selenium模拟浏览器获取爬取QQ音乐中你喜欢的某位歌手(可以是任意歌手)最受欢迎的前5首歌曲的歌词、流派、歌曲发行时间、评论条数、评论时间、评论点赞次数、评论内容具体(每一首歌的评论>=500条)。QQ音乐地址https://y.qq.com/
如下图所示:
【python】实验2项目2:使用爬虫Selenium模拟浏览器获取爬取QQ音乐中你喜欢的某位歌手(陈奕迅)

  1. 用CSV模块将数据存储下来(文件名:QQMusic.csv)
  2. 使用Pandas模块创建5个Series,即一首歌的数据一个Series,统计每首歌的每个评论点赞次数(没有点赞则为0次),求5首歌的平均点赞次数和标准差。
  3. 使用Pandas模块创建5个DataFrame,分析其评论条数和点赞数量的相关性。
  4. (选做)统计5首歌歌词、评论的词频,画出词云,分析歌词、歌曲流派、评论(前五个高词频)关键词的相关性。
  5. (选做)按照时间轴画出每一首评论的时间,分析用户喜欢什么时候听这首歌。

解题思路: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")
上一篇:i9 12900参数 i912900怎么样


下一篇:修改Anaconda镜像地址