文章目录

  • (一)工欲善其事必先利其器-安装工具
    • Selenium
    • 浏览器
  • (二)实战

(一)工欲善其事必先利其器-安装工具

Selenium

Selenium是一个强大的网络数据采集工具,其最初是为网站自动化测试而开发的。近几年,它还被广泛用于获取精确的网站快照,因为它们可以直接运行在浏览器上。Selenium 库是一个在WebDriver 上调用的API。WebDriver 有点儿像可以加载网站的浏览器,但是它也可以像BeautifulSoup对象一样用来查找页面元素,与页面上的元素进行交互(发送文本、点击等),以及执行其他动作来运行网络爬虫。安装方式与其他Python第三方库一样。
pip install Selenium

浏览器

Selenium 自己不带浏览器,它需要与第三方浏览器结合在一起使用。例如,如果你在Firefox 上运行Selenium,可以直接看到一个Firefox 窗口被打开,进入网站,然后执行你在代码中设置的动作。虽然这样可以看得更清楚,但不适用于这个爬虫程序,爬一页就打开一页效率太低,所以我用一个叫PhantomJS的工具代替真实的浏览器。
PhantomJS:是一个“无头”(headless)浏览器。它会把网站加载到内存并执行页面上的JavaScript,但是它不会向用户展示网页的图形界面。把Selenium和PhantomJS 结合在一起,就可以运行一个非常强大的网络爬虫。
官方网站下载:http://phantomjs.org/download.html
然后把可执行文件拷贝到Python安装目录的Scripts文件夹。

(二)实战

1.爬取歌单的名字,播放量,链接放入一个csv文件;
2.将歌单封面和歌单中的歌曲下载到文件中。
网易云站外播放器链接:http://music.163.com/song/media/outer/url?id=
加上歌曲id号即可以获取歌曲,如:http://music.163.com/song/media/outer/url?id=476592630.mp3

网易云歌单链接(第一页):https://music.163.com/#/discover/playlist/?order=hot&cat=全部&limit=35&offset=0
“F12”分析一下:

播放数nb (number broadcast):59340

封面 msk (mask):有标题(title)和url

同理,也可以找到“下一页”的url,最后一页的url是“javascript:void(0)”

这就可以做一个循环,来获取数据:

url="https://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=0"
while url!='javascript:void(0)':

网易云有反爬虫机制:
1.User Agent:

找到User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6801.400 QQBrowser/10.3.2960.400
如果是使用入门的requests,BeautifulSoup来爬取数据就需要添加headers,不然服务器会识别爬虫,获取不到数据;

headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6788.400 QQBrowser/10.3.2714.400"}
html=requests.get(url,headers=headers)

2.frame框架:

网易云用了frame框架,使用BeautifulSoup的find()方法获取class和tag是获取不到数据的,只能使用xpath;
而这里使用Selenium,就直接使用switch_to.frame()方法;

先完成第1步:

from selenium import webdriver
import csv#准备好储存数据的csv文件
csv_file=open("playlist.csv","a",newline="",encoding='utf-8')
writer=csv.writer(csv_file)
writer.writerow(['歌单名','播放量','链接'])#歌单第一页
url="https://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=0"
#用PhantomJS接口创建一个Selenium的WebDriver
driver=webdriver.PhantomJS()#解析每一页,到最后一页
while url!='javascript:void(0)':print("访问地址:",url)#用WebDriver加载界面driver.get(url)#切换到内容的iframedriver.switch_to.frame("g_iframe")#获取歌单标签data=driver.find_element_by_id("m-pl-container").find_elements_by_tag_name("li")for i in range(len(data)):src=data[i].find_element_by_class_name("j-flag").get_attribute('src')a=data[i].find_element_by_class_name("msk")name=a.get_attribute('title')   #歌单名字print("歌单名:",name)nb=data[i].find_element_by_class_name("nb").text #播放量print("播放量:",nb)hf=a.get_attribute('href') #链接print("链接:",hf)#将数据写入csv文件writer.writerow([name,nb,hf])url=data[i].find_element_by_xpath('//*[@id="m-pl-pager"]/div/a[11]').get_attribute('href')csv_file.closed()

爬取数据结果:

完成第2步(网易云维护升级,站外播放器的链接失效了,访问都是404,所以将歌曲链接存为.txt文件):

from selenium import webdriver
import csv
import os
import requests
import re
import urllib#创建以歌单名为文件名的文件
def creatFile(url,name):if not os.path.isdir(os.getcwd()+"/"+name):os.mkdir(os.getcwd()+"/"+name)img=requests.get(url)with open(os.getcwd()+"/"+name+"/"+"封面.jpg",'wb') as f:f.write(img.content)#获得歌单内歌曲界面
def getMusicPage(name,url):driver=webdriver.PhantomJS()driver.get(url)driver.switch_to.frame("g_iframe")info=driver.find_element_by_xpath('//table[@class="m-table "]/tbody').find_elements_by_tag_name("tr")for i in range(len(info)):musicName=info[i].find_element_by_tag_name("b").get_attribute('title').replace('\xa0','')print(musicName)title=validateTitle(musicName)hf=info[i].find_element_by_tag_name("a").get_attribute('href')#song_id=hf.strip('https://music.163.com/song?id=85575')#song_url="http://music.163.com/song/media/outer/url?id="+song_id#print(song_url)downloadMusic(name,title,hf)#正则表达式处理创建文件夹文件名时的非法字符
def validateTitle(title):rstr=r"[\/\\\:\*\?\"\<\>\|]"  # '/ \ : * ? " < > |'new_title=re.sub(rstr,"_",title) #将非法字符替换为下划线return new_title#将歌曲链接存入文件
def downloadMusic(name,musicName,url):if not os.path.isdir(os.getcwd()+"/"+name+"/"+musicName):os.mkdir(os.getcwd()+"/"+name+"/"+musicName)with open(os.getcwd()+"/"+name+"/"+musicName+"/"+"链接.txt","w") as f:f.write(url)'''#下载歌曲(已失效)path=os.getcwd()+"/"+name+"/{}.mp3".format(musicName)with open(path,'wb') as f:try:urllib.request.urlretrieve(url,path)except BaseException:print("下载失败:"+musicName)pass'''if __name__=='__main__':csv_file=open("playlist.csv","a",newline="",encoding='utf-8')writer=csv.writer(csv_file)writer.writerow(['歌单名','播放量','链接'])#歌单第一页url="https://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=0"#用PhantomJS接口创建一个Selenium的WebDriverdriver=webdriver.PhantomJS()#解析每一页,到最后一页while url!='javascript:void(0)':print("访问地址:",url)#用WebDriver加载界面driver.get(url)#切换到内容的iframedriver.switch_to.frame("g_iframe")#获取歌单标签data=driver.find_element_by_id("m-pl-container").find_elements_by_tag_name("li")for i in range(len(data)):src=data[i].find_element_by_class_name("j-flag").get_attribute('src')a=data[i].find_element_by_class_name("msk")name=a.get_attribute('title')   #歌单名字fileName=validateTitle(name)#创建文件存储歌单creatFile(src,fileName)hf=a.get_attribute('href') #链接#获得歌单链接,获得歌曲信息getMusicPage(fileName,hf)url=data[i].find_element_by_xpath('//*[@id="m-pl-pager"]/div/a[11]').get_attribute('href')

创建文件夹时使用相对路径创建文件夹,爬取结果:

以歌单名创建的文件夹:

以歌曲名创建的文件夹:

文件夹中为歌曲播放链接:

Python爬虫-selenium爬取网易云歌单相关推荐

  1. Python爬虫——selenium爬取网易云评论并做词云

    大家好!我是霖hero 到点了上号网易云,很多人喜欢到夜深人静的时候,在网易云听音乐发表评论,正所谓:自古评论出人才,千古绝句随口来,奈何本人没文化,一句卧槽行天下!评论区集结各路大神,今天我们来爬取 ...

  2. Python爬虫实战: 爬取网易云歌单

    这篇文章,我们就来讲讲怎样爬取网易云歌单,并将歌单按播放量进行排序,下面先上效果图 1.用 requests 爬取网易云歌单 打开 网易云音乐 歌单首页,不难发现这是一个静态网页,而且格式很有规律,爬 ...

  3. 爬虫python代码网易云_爬虫实战(二) 用Python爬取网易云歌单

    最近,博主喜欢上了听歌,但是又苦于找不到好音乐,于是就打算到网易云的歌单中逛逛 本着 "用技术改变生活" 的想法,于是便想着写一个爬虫爬取网易云的歌单,并按播放量自动进行排序 这篇 ...

  4. python爬虫实例网易云-爬虫实战(二) 用Python爬取网易云歌单

    最近,博主喜欢上了听歌,但是又苦于找不到好音乐,于是就打算到网易云的歌单中逛逛 本着 "用技术改变生活" 的想法,于是便想着写一个爬虫爬取网易云的歌单,并按播放量自动进行排序 这篇 ...

  5. 爬虫实战(二) 用Python爬取网易云歌单

    最近,博主喜欢上了听歌,但是又苦于找不到好音乐,于是就打算到网易云的歌单中逛逛 本着 "用技术改变生活" 的想法,于是便想着写一个爬虫爬取网易云的歌单,并按播放量自动进行排序 这篇 ...

  6. python爬虫爬取音乐_利用python爬虫实现爬取网易云音乐热歌榜

    利用python爬虫实现爬取网易云音乐热歌榜 发布时间:2020-11-09 16:12:28 来源:亿速云 阅读:102 作者:Leah 本篇文章给大家分享的是有关利用python爬虫实现爬取网易云 ...

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

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

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

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

  9. 运用Python——爬取网易云歌单的全部歌曲热评_爬虫的简单应用

    导航 ·运用Python--爬虫_网易云音乐热评 ·运用Python--游戏_四子棋_劳拉下棋 文章目录 导航 1.展示截图 2.代码 3.分析 常量的定义.界面设计 依次爬取歌曲信息 创建表格 爬取 ...

最新文章

  1. 2022-2028年中国顺丁橡胶行业发展模式分析及市场分析预测报告
  2. 中国电子用LCP树脂市场未来发展展望及十四五规划咨询建议报告2022-2028年版
  3. nGQL-为什么路径越长,数量越多呢,直觉是条件越严格,路径数量会越少
  4. hdu 4513(manacher+dp)
  5. Linux 中的远程登陆
  6. Windows端口被占用处理方法
  7. scratch少儿编程第一季——07、人要衣装佛靠金装——外观模块
  8. java正则匹配非html字符串_java正则表达式去除html中所有的标签和特殊HTML字符(以开头的)...
  9. clickhouse 重启_篇一|ClickHouse快速入门
  10. ssh 配置文件中 maxsessions 与 MaxStartups
  11. c#目录以及子目录下图片批量缩放,像素不变,图像大小改变
  12. 使用 Linux 15 年后,我重新回到 Windows:感觉非常糟糕
  13. hadoop介绍及伪分布式搭建
  14. 砸黑板! 正则表达式!!!re 模块
  15. wordpress音乐播放器插件–PoiPlayer
  16. Oracle 11g详细安装介绍plsql下载和安装介绍
  17. 微信小程序开发常用功能
  18. Android自定义方式设置drawableleft图片大小
  19. alpha 冲刺 —— 十分之一
  20. [热键冲突]:Win10 输入法表情快捷键(Ctrl+Shift+B)如何关闭

热门文章

  1. 基于html家具装饰网站设计毕业设计.rar(含论文毕设+项目源码+答辩设计+成绩评分表+评定表)
  2. python中pandas.DataFrame如何对行与列求和以及如何添加新行与列的示例
  3. 浅谈响应式开发与自适应布局!
  4. 手机chrome禁止加载图片
  5. 使用BeautifulSoup爬取想要的标签(《python网络爬虫权威指南》笔记)
  6. 华硕h410m-f主板检测不到硬盘启动选项?
  7. 笔记本无线网老是掉线的解决方法
  8. 74cms|骑士cms|开源招聘系统,目录结构
  9. qsnctf 骑士CMS01 wp
  10. 水晶报表自定义纸张大小打印 (转)