文章目录
前言
python课作业
请使用爬虫Selenium模拟浏览器获取爬取QQ音乐中你喜欢的某位歌手(可以是任意歌手)最受欢迎的前5首歌曲的歌词、流派、歌曲发行时间、评论条数、评论时间、评论点赞次数、评论内容具体(每一首歌的评论>=500条)。
一、查看信息
-
查看QQ音乐你喜欢的歌手的网页结构
-
获取每首歌的url
经观察可发现所有的歌曲都在 ul class=’songlist__list’ 下,所以我们就可以通过遍历其及其子标签得到前五首歌每首歌的url -
获取歌曲基本信息
-
获取前500条评论
因观察发现热门评论为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,今天改了。
一个是翻页问题,另一个是翻页后评论爬取写入问题。