今日学习(解析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-=1if(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").textprint("开始获取歌曲《"+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").textcontent_time=com.find_element_by_css_selector(".comment__date").textzan_num=com.find_element_by_class_name("js_praise_num").textcomment = {}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中间没有其他符号)原代码表示:

这里是定位元素之后的数据切片操作,源码为:

    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]

经过测试,此切片操作text[3:] 目的是去切除掉 流派: 这三个字符,留下的就是流派内容
text[5:]是切除 发行时间: 这五个字符,,text[3:-1] 是切除掉 评论()。切除掉前面3个字符和最后一个反括号


代码块如下:

# 获取流派,发行时间,评论数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]
  • 获取一首歌详细信息函数(相关解析写在代码注释里面):
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      #唯一的classname,可以使用此方法定位元素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)                            #先模拟点击29次加载更多,全部加载出来再读取歌词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                  #css选择器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             #返回每一首歌的以上信息,循环5次for song_page in song_url_list:      #song_resourses.append(getSongResourse(song_page))         #5手歌曲合并为1个列表# break
  • 写入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)+"秒")

. 爬虫重难点在于定位元素以及数据处理,这个项目是在列表中插入字典,再从此列表中遍历字典的键与值。再依次保存到csv文件中,也为今后爬取数据保存数据提供一个新思路。

csv文件打开乱码解决办法:

使用其它方式,选择记事本打开,另存为为一个文件(覆盖也行),存储格式选择为ANSI

selenium爬取qq音乐相关推荐

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

    本文对使用到的技术仅做简单的介绍,若想了解更多,请前往相应的官网网站进行学习. 本文适合对爬虫相关知识接触不多的新手,主要是普及Selenium如何做爬虫,大佬请跳过. 1.Selenium简单介绍 ...

  2. 【python】实验2项目2:使用爬虫Selenium模拟浏览器获取爬取QQ音乐中你喜欢的某位歌手(陈奕迅)

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

  3. 使用selenium操控浏览器爬取QQ音乐

    环境python3.6,工具pycharm 首先安装selenium框架,下载selenium框架需要的webdriver驱动放在谷歌浏览器bin目录- 一.webdriver的安装 1.下载地址: ...

  4. python爬虫爬取音乐单曲_Python爬取qq音乐的过程实例

    一.前言 qq music上的音乐还是不少的,有些时候想要下载好听的音乐,但有每次在网页下载都是烦人的登录什么的.于是,来了个qqmusic的爬虫.至少我觉得for循环爬虫,最核心的应该就是找到待爬元 ...

  5. python爬虫爬取qq音乐热歌榜的歌曲到本地

    文章目录 项目目标 具体实现步骤 完整代码 运行结果 项目目标 爬取qq音乐热歌榜https://y.qq.com/n/yqq/toplist/26.html到本地文件夹 具体实现步骤 程序思路:用s ...

  6. python爬取qq音乐标签_Python爬取qq音乐的过程实例

    一.前言 qq music上的音乐还是不少的,有些时候想要下载好听的音乐,但有每次在网页下载都是烦人的登录什么的.于是,来了个qqmusic的爬虫.至少我觉得for循环爬虫,最核心的应该就是找到待爬元 ...

  7. Python网络爬虫数据采集实战:Scrapy框架爬取QQ音乐存入MongoDB

    ​    通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本 ...

  8. Python网络爬虫数据采集实战(八):Scrapy框架爬取QQ音乐存入MongoDB

    通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本涵盖了爬虫 ...

  9. python爬取qq音乐歌曲链接为什么播放不出来_手把手教你使用Python抓取QQ音乐数据(第一弹)...

    原标题:手把手教你使用Python抓取QQ音乐数据(第一弹) [一.项目目标] 获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 由浅入深,层层递进,非常适合刚入门的同学练手. ...

最新文章

  1. 三流Java搞技术,二流Java搞框架,一流Java…
  2. Unidesk, Citrix 桌面虚拟化方案之新神器
  3. java 线程 Thread 使用介绍,包含wait(),notifyAll() 等函数使用介绍
  4. es每次结果不一样_电子血压计不准!每次测血压都不一样……
  5. 详解 Spring 3.0 基于 Annotation 的依赖注入实现--转载
  6. PHP判断上传文件类型
  7. 自定义sql_一个简单易用的开源BI软件,专为SQL用户设计的开源库
  8. sql 从ip列表中查询ip段_IP地址段查询深度优化案例
  9. linux 删除和安装java
  10. RecyclerView.Adapter的封装(RecyclerAdapter)
  11. 实现商品分类回显(笔记)
  12. Oracle标准成本差异,标准成本与实际成本比较
  13. Java输出字符串中的叠词_java中正则表达式的简单运用 | iamxiarui
  14. 织梦后台内容编辑器不显示
  15. 《Visual Prompting: Modifying Pixel Space to Adapt Pre-trained Models》论文阅读笔记
  16. 利用谷歌镜像网站编辑Latex的参考文献与doi链接
  17. Noip—p1309 瑞士轮
  18. Rebar:Erlang构建工具
  19. 【好书摘要】性能优化中CPU、内存、磁盘IO、网络性能的依赖
  20. java10进制数和16进制数字相互转换

热门文章

  1. 【人脸检测0】视频分解图片与图片合成视频
  2. css首字下沉_如何在Word 2013中创建首字下沉
  3. BES平台(恒玄) ANC调试笔记
  4. plt.figure()参数使用详解及运行演示
  5. Mono:从猴子到齐天大圣?
  6. 系统分析师学习笔记(二十一)
  7. Java-视频管理系统-毕业设计-SpringBoot-VUE-MyBatis
  8. “中国IT就业训练营”正式启动 首次校园公开课成功举办
  9. 机器学习(三)---Logistic回归
  10. 春花灿烂 我最迷人时