【Python爬虫实战】使用Selenium爬取QQ音乐歌曲及评论信息

from selenium import webdriver

import csv

from time import sleep

import time

#

#  Author : ATFWUS

#  Date : 2021-03-21 20:00

#  Version : 1.0

#   爬取周杰伦最热门五首歌曲的基本信息,歌词,前五百条热门评论

#   此代码仅供交流学习使用

#

#1. 创建 Chrome 浏览器对象,这会在电脑上在打开一个浏览器窗口

driver=webdriver.Chrome(executable_path="C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")

#2. 打开 QQ 音乐 - 周杰伦页面

driver.get("https://y.qq.com/n/yqq/singer/0025NhlN2yWrP4.html")

#3. 配置

csv_file = open('songs.csv','w',newline='',encoding='utf-8')

writer = csv.writer(csv_file)

start = time.time()

# 取前 5 首歌曲

song_numer=5

song_url_list=[]

song_resourses=[]

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

# print(song_url_list)

print(" 已获取周杰伦热门歌曲列表前五首的 url")

print()

# 获取一首歌曲所需要的信息

def getSongResourse(url):

    song_resourse={}

    driver.get(url)

    # 这个 0.5 秒用于等待异步请求的完成

    sleep(0.8)

    # 获取歌曲名

    song_name=driver.find_element_by_class_name("data__name_txt").text

    print(" 开始获取歌曲《 "+song_name+" 》的基本信息 ")

    # 获取流派,发行时间,评论数

    song_liupai = driver.find_element_by_css_selector(".js_genre").text[3:]

    song_time = driver.find_element_by_css_selector(".js_public_time").text[5:]

    song_comment_num = driver.find_element_by_css_selector(".js_into_comment").text[3:-1]

    print(" 歌曲《 " + song_name + " 》外汇跟单gendan5.com基本信息获取完毕 ")

    print(" 开始获取歌曲《 " + song_name + " 》的歌词 ")

    # 点击展开歌词

    driver.find_element_by_partial_link_text("[ 展开 ]").click()

    sleep(0.3)

    lyic=""

    # 获取拼接歌词

    lyic_box=driver.find_element_by_id("lrc_content").find_elements_by_tag_name("p")

    for l in lyic_box:

        if l.text!="":

            lyic+=l.text+"\n"

    print(" 歌曲《 " + song_name + " 》的歌词获取完毕 ")

    print(" 开始获取歌曲《 " + song_name + " 》的第 1-15 条热门评论 ")

    # 获取 500 条评论

    comments=[]

    # 点击加载更多 29 次,每次多出 15 条评论

    for i in range(33):

        driver.find_element_by_partial_link_text(" 点击加载更多 ").click()

        print(" 开始获取歌曲《 " + song_name + " 》的第 "+str((i+1)*15+1)+"-"+str((i+2)*15)+" 条热门评论 ")

        sleep(0.5)

comments_list=driver.find_element_by_css_selector(".js_hot_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

        zan_num=com.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+" 》所有信息获取完毕 ")

    print()

    song_resourse.update({" 歌曲名 ":song_name})

    song_resourse.update({" 流派 ":song_liupai})

    song_resourse.update({" 发行时间 ":song_time})

    song_resourse.update({" 评论数 ":song_comment_num})

    song_resourse.update({" 歌词 ":lyic})

    song_resourse.update({"500 条精彩评论 ":comments})

    return song_resourse

for song_page in song_url_list:

    song_resourses.append(getSongResourse(song_page))

    # break

print(" 正在写入 CSV 文件 ...")

for i in song_resourses:

    writer.writerow([i[" 歌曲名 "],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)+" ")


请使用浏览器的分享功能分享到微信等