爬虫入门——爬取QQ音乐某一歌手前五首歌曲信息及相关评论

文章目录


前言

python课作业
请使用爬虫Selenium模拟浏览器获取爬取QQ音乐中你喜欢的某位歌手(可以是任意歌手)最受欢迎的前5首歌曲的歌词、流派、歌曲发行时间、评论条数、评论时间、评论点赞次数、评论内容具体(每一首歌的评论>=500条)。

一、查看信息

  1. 查看QQ音乐你喜欢的歌手的网页结构
    爬虫入门——爬取QQ音乐某一歌手前五首歌曲信息及相关评论

  2. 获取每首歌的url
    经观察可发现所有的歌曲都在 ul class=’songlist__list’ 下,所以我们就可以通过遍历其及其子标签得到前五首歌每首歌的url

  3. 获取歌曲基本信息
    爬虫入门——爬取QQ音乐某一歌手前五首歌曲信息及相关评论
    爬虫入门——爬取QQ音乐某一歌手前五首歌曲信息及相关评论

  4. 获取前500条评论
    爬虫入门——爬取QQ音乐某一歌手前五首歌曲信息及相关评论
    因观察发现热门评论为15条,每点一次“点击加载更多”就会再多加载15条,所以循环(500/15)约等于33次
    热评具体信息:包括热评内容、时间、点赞数

二、代码实现

完整代码如下:

from selenium import webdriver
import csv
from time import sleep
import time

#创建Chrome浏览器对象
driver=webdriver.Chrome()
#打开QQ音乐
driver.get("https://y.qq.com/n/yqq/singer/0022eAG537I1bg.html")
#csv文件配置
csv_file = open(r'C:\Users\玐玐子公主\Desktop\python\实验\Lab2\QQmusic.csv','w',newline='',encoding='utf-8-sig')
writer = csv.writer(csv_file)
#开始时间
start = time.time()

# 取前5首歌曲
song_numer=5
#前五首歌曲url列表
song_url_list=[]
#前五首歌曲所需要的信息
song_resourses=[]

#使用selenium找到songlist__item
songlist__item=driver.find_elements_by_class_name("songlist__item")
# 获取所有歌曲url
for song in songlist__item:
    song__url=song.find_element_by_class_name("js_song").get_attribute("href")
    song_url_list.append(song__url)
    song_numer-=1
    if(song_numer==0):
        break

# 获取一首歌曲所需要的信息
def getSongResourse(url):
    song_resourse={}
    driver.get(url)
    # 这2秒用于等待页面所有异步请求的完成
    sleep(2)

    # 获取歌曲名
    song_name=driver.find_element_by_class_name("data__name_txt").text
    # 获取流派,发行时间,评论数
    song_sect = driver.find_element_by_css_selector(".js_genre").text[3:]
    song_comment_num = driver.find_element_by_css_selector(".js_into_comment").text[3:-1]

    # 点击展开歌词
    button=driver.find_element_by_partial_link_text("[展开]")
    button.click()
    sleep(0.3)
    lyric=""
    # 获取拼接歌词
    lyic_box=driver.find_element_by_id("lrc_content").find_elements_by_tag_name("p")
    for l in lyic_box:
        if l.text!="":
            lyric+=l.text+"\n"


    # 获取500条评论
    comments=[]
    # 点击加载更多,每次多出25条评论
    for i in range(2):
        try:
            # 评论
            comments_list = driver.find_element_by_css_selector(".js_all_list").find_elements_by_tag_name("li")
            for com in comments_list:
                # 内容
                content = com.find_element_by_css_selector(".js_hot_text").text
                # 时间
                content_time = com.find_element_by_css_selector(".comment__date").text
                # 点赞数
                star_num = com.find_element_by_class_name("js_praise_num").text
                # 创建一个空的comment字典
                comment = {}
                # 更新内容、时间、点赞数
                comment.update({"评论内容": content})
                comment.update({"评论时间": content_time})
                comment.update({"评论点赞次数": star_num})
                # 将每一条comment存入总的comments中
                comments.append(comment)
            button=driver.find_element_by_class_name('next')
            button.click()
        except:
            break
        sleep(0.5)

    #更新每首歌信息并返回
    song_resourse.update({"歌曲名":song_name})
    song_resourse.update({"流派":song_sect})
    song_resourse.update({"评论数":song_comment_num})
    song_resourse.update({"歌词":lyric})
    song_resourse.update({"500条评论":comments})
    return song_resourse

for song_page in song_url_list:
    song_resourses.append(getSongResourse(song_page))
for i in song_resourses:
    writer.writerow([i["歌曲名"],i["流派"],i["评论数"],i["歌词"]])
    for j in i["500条评论"]:
        writer.writerow([j["评论内容"],j["评论时间"],j["评论点赞次数"]])
    writer.writerow([])


csv_file.close()
end = time.time()
print(str(end-start))

总结

之前做了一直有bug,今天改了。
一个是翻页问题,另一个是翻页后评论爬取写入问题。

上一篇:DataWhale 9月组队学习-动手学数据分析 task2_学习记录


下一篇:IOS 创建和使用多线程的6种方式