【小练习】使用selenium根据 歌单 多线程爬取网易云音乐的歌词
准备工作
首先找到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根据 歌单 多线程爬取网易云音乐的歌词相关推荐
- Python Scrapy 多线程爬取网易云音乐热门歌单信息(手把手教学)
下面我将向大家介绍使用 Scrapy 爬虫获取 网易云音乐 的热门歌单信息. 这里是网易云音乐的歌单页面,可以看到歌单信息非常得结构化,是非常适合爬虫来爬取的. URL:全部歌单 - 歌单 - 网易云 ...
- python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜 python爬取网易云音乐热歌榜实例代码...
想了解python爬取网易云音乐热歌榜实例代码的相关内容吗,FXL在本文为您仔细讲解python爬取网易云音乐热歌榜的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:python,网易热歌榜 ...
- Selenium解决动态渲染页面----爬取网易云音乐全部评论
爬取网易云音乐全部评论,我们先随便找一首歌,这里以毛不易的水乡为例.毛不易–水乡 一.常规方法 1. 尝试直接爬取 先直接用歌曲链接直接爬取 import requests#URL url = 'ht ...
- python爬网易歌单_Python爬取网易云歌单
1. 关键点 使用单线程爬取,未登录,爬取网易云歌单主要有三个关键点: url为https://music.163.com/discover/playlist/?order=hot&cat=% ...
- 多线程爬取网易云音乐热歌榜 200首音乐
# 导入requests网络请求模块 import requests # 导入lxml标签匹配模块 from lxml import etree # 导入re 正则匹配模块 import re #导入 ...
- python爬取网易云歌单_详解python selenium 爬取网易云音乐歌单名
目标网站: 首先获取第一页的数据,这里关键要切换到iframe里 打印一下 获取剩下的页数,这里在点击下一页之前需要设置一个延迟,不然会报错. 结果: 一共37页,爬取完毕后关闭浏览器 完整代码: u ...
- selenium切换iframe框架案例——翻页爬取网易云音乐歌单作者和名称
翻页爬取网易云音乐歌单作者和标题 案例目的: 通过翻页selenium操作网易云音乐,介绍如何切换iframe框架以及如何使用selenium定位数据所在的节点. 代码功能: 输入下载的数据页数,自动 ...
- Python网络爬虫实践(1):爬取网易云音乐播放量大于1000万的歌单
Python网络爬虫实践(1) 一.需求分析 爬取网易云音乐播放量大于1000万的歌单. 二.实施步骤 1.安装selenium selenium是一个用于Web应用自动化程序测试的工具,测试直接运行 ...
- python爬取网易云音乐排行榜歌单热评(完整版)
完整版的爬取网易云音乐的排行榜单,和推荐榜单,热评 直接上代码,代码写的很清楚 为了防止被封我们先做个随机获取User_Agent """随机获取请求头"&qu ...
最新文章
- 2022-2028年中国激光切管机行业市场研究及前瞻分析报告
- python语言安装-Python语言脚本的安装和配置
- [收藏] 微软850位顶级人才不做Windows研发
- MySQL—delete和truncate的区别
- ajax请求成功后打开新开窗口(window.open())被拦截的解决方法
- WPF Image Binding Uri Source 失败解决办法
- 学python可以做什么职业-学完Python,能找到什么工作?工资多少?
- 毕设题目:Matlab机器人路径规划
- viper4android脉冲样本,V4A脉冲反馈样本第一弹 爽爆
- 复仇者联盟3:无限战争 | 细节-台词-镜头 详细分析复3预测复4结局
- 最新版010editor逆向分析
- usb key 开发(一)
- element提交图片限制一张_ElementUI 上传文件以及限制
- If-else与三目运算符的区别
- python编程师app_python大师编程课app
- 2022保研夏令营经验贴(中科大、华科、武大、国防科大、浙大软件、中科院)
- 骁龙780G和骁龙768G参数对比 骁龙780G和骁龙768G差距大不大
- WAV、PCM(波形文件)格式分析与详解
- 今年电商圈618活动很安静!
- 国内外有哪些数据分析相关的竞赛比赛网站?
热门文章
- Navicat 筛选或插入某个字段出现1060 - Duplicate column name ‘XXX‘错误,以及导入sql文件时数据丢失问题。
- 凌轩:公司面孔、公司精神让公司万古长存
- 「津津乐道播客」#267 津津有味:冬天必须吃羊肉,没有为什么
- ubuntu开机突然分辨率错误且双屏有一个不亮了
- Android framework源码MPEG4Writer.cpp学习
- flash粒子文字特效
- 滚动变色的文字js特效
- KeePass使用心得
- jQuery控制input不可编辑
- php结合阿里云(印刷文字识别-身份证识别)进行身份证真实性验证------识别图片中的信息进行验证