准备工作

首先找到url,分析页面:

通过分析发现直接用find_element_by_XXX的方法是提取不到内容的,首先要转换到iframe这个页面中,代码如下:

import time
from docx import Document
from selenium import webdriver
from multiprocessing import Process, Queuedocument = Document()
driver = webdriver.Chrome(r'D:\电脑软件\chromedriver\chromedriver.exe') # 创建对象
driver.implicitly_wait(10)  # 隐形等待
driver.get("https://music.163.com/#/discover/playlist")  # 发出请求
iframe = driver.find_element_by_id("g_iframe") # 通过id找到firame
driver.switch_to.frame(iframe) # 转换到iframe的网页

获得歌单名和链接

接下来就可以用find_element_by_XXX的方式来找想要的内容了,这里我们要提取的是a标签中的href属性,

我用的是xpath:

title = driver.find_elements_by_xpath('//a[@class="tit f-thide s-fc0"]')for i in title:music_dict[i.text] = i.get_attribute('href')

现在music_dict中保存的就是 “歌单名”:“链接” 了
接下来只要遍历该字典,得到链接,然后接着访问该链接,就可以进入到这个页面:

获得歌曲名和链接

这个页面同样为iframe,所以还需要再转换一下:

    for text, link in music_dict.items():print('当前爬取的歌单为', text)driver.get(link)# 转换iframe = driver.find_element_by_id("g_iframe")driver.switch_to.frame(iframe)# 寻找歌名和链接title_list = driver.find_elements_by_xpath('//span[@class="txt"]/a/b')link_list = driver.find_elements_by_xpath('//span[@class="txt"]/a')for i in range(len(title_list)):# 保存到songs_link_dict中songs_link_dict[title_list[i].get_attribute('title')] = link_list[i].get_attribute('href')

现在songs_link_dict中保存的就是 “歌曲名”:“链接”

获取歌词,并写入到docx文件中

有了歌曲的链接,我们同样直接访问就可以进入到下面的页面:

到了这个页面我们接着提取歌词就可以了,这里需要注意的一点是,只是通过find_by的方式是无法获取下面更多的歌词的,这里需要点击一下展开

点击展开的a标签:

driver_1.find_element_by_xpath('//a[text()="展开"]').click()

但是有时会报错,这是因为在我们寻找这个a标签的时候,网页代码还没有返回,所以找不到才会报错,这里我们可以用等待

time.sleep(3)
try:driver_1.find_element_by_xpath('//a[text()="展开"]').click()
except:# 如果报错代表还是没有找到, 这里我们再等两秒然后换一种方式找time.sleep(2)driver_1.find_element_by_id("flag_ctrl").click()

好了之后使用docx.Document写入word文档即可,这里自行百度用法,很简单

开启多进程

在这里因为上面等待的原因所以导致程序运行变慢,更改为隐形等待并不可以(也很有可能是我学艺不精),所以这里考虑用多进程来做,思路是通过多进程控制多个浏览器对象,用QUEUE来传输要请求的歌曲页面,最后保存。
所以要先把耗时操作封装成函数,一会方便开启进程:

def get_lryic(q):print('进程开始执行')driver_1 = webdriver.Chrome(r'D:\电脑软件\chromedriver\chromedriver.exe')while 1:# q就是队列,在之前put的是列表,所以用拆包的方式接受song_name, song_link = q.get()driver_1.get(song_link)iframe = driver_1.find_element_by_id("g_iframe")driver_1.switch_to.frame(iframe)time.sleep(3)try:driver_1.find_element_by_xpath('//a[text()="展开"]').click()except:# 如果报错代表还是没有找到, 这里我们再等两秒然后换一种方式找time.sleep(2)driver_1.find_element_by_id("flag_ctrl").click()lryic = driver_1.find_element_by_xpath('//div[@id="lyric-content"]')# 写入word文档,并打印状态document.add_heading(song_name, 1)document.add_paragraph(lryic.text)print(song_name,'的歌词保存完毕')document.save('歌词.docx')

因为queue开启是需要传递参数的,所以把刚才获取歌曲页面链接的for循环也单独封装成一个函数:

def get_links(q,songs_link_dict):for name, link in songs_link_dict.items():q.put([name, link])print('存放完毕')

接着就可以开启线程了:

q = Queue()p_list = []p1 = Process(target=get_links, args=(q,songs_link_dict))p_list.append(p1)for i in range(3):p2 = Process(target=get_lryic, args=(q,))p_list.append(p2)for i in p_list:i.start()

到这里就全部爬下来了,这个代码中肯定有好多技术上不足或者我不知道的方法,也希望各位朋友能够指正或把方法分享出来。 下滑为源代码↓

源代码

import time
from docx import Document
from selenium import webdriver
from multiprocessing import Process, Queuedocument = Document()def get_lryic(q):print('进程开始执行')driver_1 = webdriver.Chrome(r'D:\电脑软件\chromedriver\chromedriver.exe')while 1:# q就是队列,在之前put的是列表,所以用拆包的方式接受song_name, song_link = q.get()driver_1.get(song_link)iframe = driver_1.find_element_by_id("g_iframe")driver_1.switch_to.frame(iframe)time.sleep(3)try:driver_1.find_element_by_xpath('//a[text()="展开"]').click()except:# 如果报错代表还是没有找到, 这里我们再等两秒然后换一种方式找time.sleep(2)driver_1.find_element_by_id("flag_ctrl").click()lryic = driver_1.find_element_by_xpath('//div[@id="lyric-content"]')# 写入word文档,并打印状态document.add_heading(song_name, 1)document.add_paragraph(lryic.text)print(song_name,'的歌词保存完毕')document.save('歌词.docx')def get_links(q,songs_link_dict):for name, link in songs_link_dict.items():q.put([name, link])print('存放完毕')def run():global driverdriver = webdriver.Chrome(r'D:\电脑软件\chromedriver\chromedriver.exe')driver.implicitly_wait(10)driver.get("https://music.163.com/#/discover/playlist")iframe = driver.find_element_by_id("g_iframe")driver.switch_to.frame(iframe)music_dict = {}songs_link_dict = {}title = driver.find_elements_by_xpath('//a[@class="tit f-thide s-fc0"]')for i in title:music_dict[i.text] = i.get_attribute('href')for text, link in music_dict.items():print('当前爬取的歌单为', text)driver.get(link)# 转换iframe = driver.find_element_by_id("g_iframe")driver.switch_to.frame(iframe)# 寻找歌名和链接title_list = driver.find_elements_by_xpath('//span[@class="txt"]/a/b')link_list = driver.find_elements_by_xpath('//span[@class="txt"]/a')for i in range(len(title_list)):# 保存到songs_link_dict中songs_link_dict[title_list[i].get_attribute('title')] = link_list[i].get_attribute('href')# 因为测试所以只循环一次就好了,想要全部拔下来直接把break注释掉breakreturn songs_link_dictif __name__ == '__main__':songs_link_dict = run()q = Queue()p_list = []p1 = Process(target=get_links, args=(q,songs_link_dict))p_list.append(p1)for i in range(3):p2 = Process(target=get_lryic, args=(q,))p_list.append(p2)for i in p_list:i.start()driver.close()

【小练习】使用selenium根据 歌单 多线程爬取网易云音乐的歌词相关推荐

  1. Python Scrapy 多线程爬取网易云音乐热门歌单信息(手把手教学)

    下面我将向大家介绍使用 Scrapy 爬虫获取 网易云音乐 的热门歌单信息. 这里是网易云音乐的歌单页面,可以看到歌单信息非常得结构化,是非常适合爬虫来爬取的. URL:全部歌单 - 歌单 - 网易云 ...

  2. python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜 python爬取网易云音乐热歌榜实例代码...

    想了解python爬取网易云音乐热歌榜实例代码的相关内容吗,FXL在本文为您仔细讲解python爬取网易云音乐热歌榜的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:python,网易热歌榜 ...

  3. Selenium解决动态渲染页面----爬取网易云音乐全部评论

    爬取网易云音乐全部评论,我们先随便找一首歌,这里以毛不易的水乡为例.毛不易–水乡 一.常规方法 1. 尝试直接爬取 先直接用歌曲链接直接爬取 import requests#URL url = 'ht ...

  4. python爬网易歌单_Python爬取网易云歌单

    1. 关键点 使用单线程爬取,未登录,爬取网易云歌单主要有三个关键点: url为https://music.163.com/discover/playlist/?order=hot&cat=% ...

  5. 多线程爬取网易云音乐热歌榜 200首音乐

    # 导入requests网络请求模块 import requests # 导入lxml标签匹配模块 from lxml import etree # 导入re 正则匹配模块 import re #导入 ...

  6. python爬取网易云歌单_详解python selenium 爬取网易云音乐歌单名

    目标网站: 首先获取第一页的数据,这里关键要切换到iframe里 打印一下 获取剩下的页数,这里在点击下一页之前需要设置一个延迟,不然会报错. 结果: 一共37页,爬取完毕后关闭浏览器 完整代码: u ...

  7. selenium切换iframe框架案例——翻页爬取网易云音乐歌单作者和名称

    翻页爬取网易云音乐歌单作者和标题 案例目的: 通过翻页selenium操作网易云音乐,介绍如何切换iframe框架以及如何使用selenium定位数据所在的节点. 代码功能: 输入下载的数据页数,自动 ...

  8. Python网络爬虫实践(1):爬取网易云音乐播放量大于1000万的歌单

    Python网络爬虫实践(1) 一.需求分析 爬取网易云音乐播放量大于1000万的歌单. 二.实施步骤 1.安装selenium selenium是一个用于Web应用自动化程序测试的工具,测试直接运行 ...

  9. python爬取网易云音乐排行榜歌单热评(完整版)

    完整版的爬取网易云音乐的排行榜单,和推荐榜单,热评 直接上代码,代码写的很清楚 为了防止被封我们先做个随机获取User_Agent """随机获取请求头"&qu ...

最新文章

  1. 2022-2028年中国激光切管机行业市场研究及前瞻分析报告
  2. python语言安装-Python语言脚本的安装和配置
  3. [收藏] 微软850位顶级人才不做Windows研发
  4. MySQL—delete和truncate的区别
  5. ajax请求成功后打开新开窗口(window.open())被拦截的解决方法
  6. WPF Image Binding Uri Source 失败解决办法
  7. 学python可以做什么职业-学完Python,能找到什么工作?工资多少?
  8. 毕设题目:Matlab机器人路径规划
  9. viper4android脉冲样本,V4A脉冲反馈样本第一弹 爽爆
  10. 复仇者联盟3:无限战争 | 细节-台词-镜头 详细分析复3预测复4结局
  11. 最新版010editor逆向分析
  12. usb key 开发(一)
  13. element提交图片限制一张_ElementUI 上传文件以及限制
  14. If-else与三目运算符的区别
  15. python编程师app_python大师编程课app
  16. 2022保研夏令营经验贴(中科大、华科、武大、国防科大、浙大软件、中科院)
  17. 骁龙780G和骁龙768G参数对比 骁龙780G和骁龙768G差距大不大
  18. WAV、PCM(波形文件)格式分析与详解
  19. 今年电商圈618活动很安静!
  20. 国内外有哪些数据分析相关的竞赛比赛网站?

热门文章

  1. Navicat 筛选或插入某个字段出现1060 - Duplicate column name ‘XXX‘错误,以及导入sql文件时数据丢失问题。
  2. 凌轩:公司面孔、公司精神让公司万古长存
  3. 「津津乐道播客」#267 津津有味:冬天必须吃羊肉,没有为什么
  4. ubuntu开机突然分辨率错误且双屏有一个不亮了
  5. Android framework源码MPEG4Writer.cpp学习
  6. flash粒子文字特效
  7. 滚动变色的文字js特效
  8. KeePass使用心得
  9. jQuery控制input不可编辑
  10. php结合阿里云(印刷文字识别-身份证识别)进行身份证真实性验证------识别图片中的信息进行验证