今日学习(解析selenium爬取qq音乐,附带解析数据)
点此查看原博客
爬取QQ音乐官网指定歌手的前5首歌曲的基本信息和前五百条热门评论:
selenium中文网点此学习selenium
简而言之,selenium就是运行在浏览器上面,相当于用户本身在操作的一个测试框架,用selenium爬取网页信息,实用性更强
- 下载安装selenium:pip install selenium
- 下载与本Chrome浏览器相对应版本的webdriver
- webdriver要与Chrome在同一个路径之下
- 创建浏览器对象
driver=webdriver.Chrome(executable_path="C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
- 浏览器对象打开网页:
driver.get("https://y.qq.com/n/yqq/singer/0025NhlN2yWrP4.html")
- 获取所有歌曲,使用class name
songlist__item=driver.find_elements_by_class_name("songlist__item")
- 遍历所有歌曲,获取每一首歌曲的url (使用class name)存入之前创建的空列表当中,此操作为之后点击进入每一首歌曲的主界面,再进行获取的一些相关信息
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
- 创建函数,作用为获取一首歌的全部信息,以及相关歌词,前500条评论
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 + "》基本信息获取完毕")
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
以上长代码块中使用css选择器的情况如下(此js_genre中间没有其他符号)原代码表示:
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=2021032422032732.png
代码块如下:
# 获取流派,发行时间,评论数
song_liupai = driver.find_element_by_css_selector(".js_genre").text[3:] #css选择器
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]
- 展开歌词,以及拼接歌词
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"
- 定位评论,爬取评论
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})
- 写入csv文件
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)+"秒")