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)+" 秒 ")