首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >网易云音乐歌曲下载

网易云音乐歌曲下载

作者头像
云雀叫了一整天
发布于 2019-09-29 09:59:41
发布于 2019-09-29 09:59:41
1.8K00
代码可运行
举报
文章被收录于专栏:Hi, PythonHi, Python
运行总次数:0
代码可运行

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_40313634/article/details/96611824

爬取过程中的问题解决

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
环境 :Windows + Python 3.7 + selenium

1. class 中含有空格,如何定位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <div class="u-cover u-cover-1">
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    browser.find_elements_by_css_selector('[class = "u-cover u-cover-1"]')

2. 定位信息好着,就是获取不到元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
原因:
    selenium 打开网页后, 默认是在父级 Frame 里, 直接搜索是搜不到子 Frame 里的信息的。
    需要切换 Frame。
方法:
    switch_to.frame('frameid')
    switch_to.parent_frame()
  • 类似问题
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
原因:点击后,浏览器新打开了个选项卡。没有切换过来,导致还是在旧的选项卡里查找
解决:
    browser.switch_to_window(browser.window_handles[1])
  • 例子如下
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <iframe name="contentFrame" id="g_iframe" class="g-iframe" scrolling="auto" frameborder="0" src="about:blank" allowfullscreen="true"></iframe>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    browser.switch_to.frame('g_iframe')

3. find_elements后点击不了抓取的元素

  • 问题: for 循环执行第二次时报错如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
       selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
  • 代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    we_gedans = self.browser.find_elements_by_css_selector('[class = "u-cover u-cover-1"]')

    for we_gedan in we_gedans:
        we_gedan.click()
  • 原因
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
官方给出解释如下:
The element has been deleted entirely.
The element is no longer attached to the DOM.
就是页面元素过期,引用的元素过时,不再依附于当前页面,需要重新定位获取元素对象

find_elements 查找到的是 WebElement 类型的数组数据,含有元素在当前页面的地址信息,调用 click() 方法就是使用了此地址信息。
切换页面后,此地址信息就失效了。所以不能在直接在循环中调用 click()

4. eyed3 pip 安装成功, import报错

  • 报错如下
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 import magic
  File "C:\Users\zuoy\AppData\Local\Programs\Python\Python37\lib\site-packages\magic.py", line 181, in <module>
    raise ImportError('failed to find libmagic.  Check your installation')
ImportError: failed to find libmagic.  Check your installation
  • 原因: eyed3 依赖 magic,必须安装上这个才能使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install pip install python-magic-bin
pip install eyed3

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python

'''
功能:访问网易云音乐网站,下载歌单里的所有免费歌曲
时间:2019/07/20
'''

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

import requests
import eyed3  # 给下载的MP3歌曲添加属性信息:专辑名、歌手等

import time
import json
import os

class Splider(object):
    def __init__(self):
        self.__url = 'https://music.163.com/'
        self.browser = webdriver.Chrome()

    def __get_gedans(self, url=None):
        gedans = []
        self.browser.get(self.__url)
        self.browser.switch_to.frame('g_iframe')
        we_gedans = self.browser.find_elements_by_css_selector('[class = "u-cover u-cover-1"]')
        for we_gedan in we_gedans:
            gedan = {}
            gedan = {
                'title': we_gedan.find_element_by_css_selector('a').get_attribute('title'),
                'url': we_gedan.find_element_by_css_selector('a').get_attribute('href'),
                'image': we_gedan.find_element_by_css_selector('img').get_attribute('src'),
                'click': we_gedan.find_element_by_css_selector('.nb').text
            }
            gedans.append(gedan)
        return gedans       

    def __get_songs(self, gedan):
        urls = []
        self.browser.get(gedan['url'])
        self.browser.switch_to.frame('g_iframe')
        we_songs = self.browser.find_elements_by_css_selector('[class = "even "]')
        for we_song in we_songs:
            url = {
                'id': we_song.find_element_by_css_selector('.left .hd span').get_attribute('data-res-id'),
                'name': we_song.find_element_by_css_selector('.f-cb b').get_attribute('title'),
                'songer': we_song.find_elements_by_css_selector('.text')[0].get_attribute('title'),
                'cd': we_song.find_elements_by_css_selector('.text')[1].find_element_by_css_selector('a').get_attribute('title')
            }
            # 清理掉其中的非显示字符
            for key, value in url.items():
                url[key] = ' '.join(value.split())
            urls.append(url)
        return urls

    def __download_song(self, song):
        base_url = "http://music.163.com/song/media/outer/url?id={0}"
        url = base_url.format(song['id'])
        re = requests.get(url)
        if re.status_code == 200:
            filename = song['name'] + '.mp3'
            with open(filename, 'wb') as f:
                f.write(re.content)
            at_song = eyed3.load(filename)
            at_song.tag.artist = song['songer']
            at_song.tag.album = song['cd']
            at_song.tag.title = song['name']
            at_song.tag.save()
            
        return

    def __save_json(self, strs, filename):
        filename = filename if os.path.splitext(filename)[1] == '.json' else os.path.splitext(filename)[0] + '.json'
        with open(filename, 'w', encoding='utf-8') as f:
            f.write(json.dumps(strs, indent=4, ensure_ascii=False))

    def __read_json(self, filename):
        data = []
        filename = filename if os.path.splitext(filename)[1] == '.json' else os.path.splitext(filename)[0] + '.json'
        with open(filename, 'r', encoding='utf-8') as f:
            data = json.loads(f.read())
        return data

    def run(self):
        gedans = self.__get_gedans()
        self.__save_json(gedans, 'gedans.json')
        for gedan in gedans:
            try:
                songs = self.__get_songs(gedan)
                self.__save_json(songs, 'songs.json')
            except Exception as e:
                print(e.args)
            os.chdir('songs')
            for song in songs:
                try:
                    self.__download_song(song)
                except Exception as e:
                    print(e.args)
            os.chdir('..')
        self.browser.close()


if __name__ == '__main__':
    splider = Splider()
    splider.run()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/07/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python爬取网易云音乐并分析:用户有什么样的音乐偏好?
发现自己有时候比挖掘别人来的更加有意义,自己到底喜欢谁的歌,自己真的知道么?习惯不会骗你。 搭建爬虫环境 1.安装selenium pip install selenium # anaconda环境的可用conda install selenium # 网速不好的可用到https://pypi.python.org/pypi/selenium下载压缩包,解压后使用python setup.py install 2.安装Phantomjs Mac版本 步骤一下载包:去这里下载对应版本http://pha
机器学习AI算法工程
2018/03/15
5.6K1
python爬取网易云音乐并分析:用户有什么样的音乐偏好?
Selenium实战-同步网易云音乐歌单到qq音乐
  本文主要介绍selenium在爬虫脚本的实际应用。适合刚接触python,没使用过selenium的童鞋。(如果你是老司机路过的话,帮忙点个star吧)
顾翔
2019/12/11
1.3K0
Selenium实战-同步网易云音乐歌单到qq音乐
源码 | Python爬虫之网易云音乐下载
偶然的一次机会听到了房东的猫的《云烟成雨》,瞬间迷上了这慵懒的嗓音和学生气的歌词,然后一直去循环听她们的歌。然后还特意去刷了动漫《我是江小白》,好期待第二季…
昱良
2018/10/23
2.6K0
下载歌曲的时候嫌麻烦?打造专属你的音乐下载器
之前大家有没有过从电脑上下载歌曲MP3文件放到手机内存卡的经历,随着时代发展,现在的各大音乐软件已经成为播放器,下载音乐是要收费的,现在教大家从零开始可以通过python通过爬虫爬取音乐,教大家打造自己的音乐下载器。
松鼠爱吃饼干
2020/09/15
5530
下载歌曲的时候嫌麻烦?打造专属你的音乐下载器
Selenium自动化爬虫
Selenium 打开页面后,默认是在父级 Frame 里面操作,如果页面中还有子 Frame,Selenium 是不能获取到子 Frame 里面的节点的。这时就需要使用 switch_to.frame 方法来切换 Frame。
北山啦
2022/11/27
1.3K0
Selenium自动化爬虫
爬取《Five Hundred Miles》在网易云音乐的所有评论
在使用 Ajax 技术加载数据的网站中, JavaScript 发起的 HTTP 请求通常需要带上参数,而且参数的值都是经过加密的。如果我们想利用网站的 REST API 来爬取数据,就必须知道其使用的加密方式。破解过程需要抓包,阅读并分析网站的 js 代码。这整个过程可能会花费一天甚至更长的时间。
猴哥yuri
2018/08/16
8580
自动化测试工具Selenium的基本使用方法
由于requests模块是一个不完全模拟浏览器行为的模块,只能爬取到网页的HTML文档信息,无法解析和执行CSS、JavaScript代码,因此需要我们做人为判断;
江一铭
2022/06/17
2.9K0
python爬虫从入门到放弃(八)之 Selenium库的使用
本文主要介绍了如何通过Python的Selenium库来自动化操作浏览器,包括打开浏览器、输入网址、获取页面元素、模拟用户操作等。同时,还介绍了如何通过调用JavaScript来实现更复杂的操作。
coders
2018/01/04
3.2K0
python爬虫从入门到放弃(八)之 Selenium库的使用
python爬虫学习教程,爬取网易云音乐!
Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及相关电子版书籍,欢迎前来领取!
python学习教程
2019/07/18
9660
python爬虫学习教程,爬取网易云音乐!
Python Selenium库的使用「建议收藏」
Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器。
全栈程序员站长
2022/07/29
4.6K0
Python Selenium库的使用「建议收藏」
一文搞懂浏览器自动化测试框架selenium!
1、selenium是什么? Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Per
石晓文
2018/04/11
1.7K0
Python网易云音乐爬虫进阶篇
年前写过一篇爬网易云音乐评论的文章,爬不了多久又回被封,所以爬下来那么点根本做不了什么分析,后面就再改了下,加入了多线程,一次性爬一个歌手最热门50首歌曲的评论,算是进阶版了~
Awesome_Tang
2018/09/11
2.8K0
Python网易云音乐爬虫进阶篇
爬虫实例七:网易云音乐
网易云在线播放每首歌曲时,都有一个外链地址,这是不会变的,跟每首歌的唯一一个id绑定在一起,而每首歌audio文件的URL如下:
远方的星
2021/03/01
4.4K1
爬虫实例七:网易云音乐
如何用 Python 爬取网易云音乐歌单
首先修改配置文件setting.py 1.关闭机器人协议 2.取消禁用cookie的功能
逆锋起笔
2021/05/18
2K0
如何用 Python 爬取网易云音乐歌单
selenium的使用(有点意思)
安装配置很简单,只需要下载对应的版本后将chromedriver.exe文件复制python路径下的Scripts路径下即可。
不断折腾
2019/09/23
1.3K0
selenium的使用(有点意思)
selenium库的基本使用
上述代码运行后,会自动打开Chrome浏览器,并登陆百度打印百度首页的源代码,然后关闭浏览器
用户3621210
2020/09/08
9470
Selenium的使用方法简介
Selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬。对于一些JavaScript动态渲染的页面来说,此种抓取方式非常有效。本节中,就让我们来感受一下它的强大之处吧。 1. 准备工作 本节以Chrome为例来讲解Selenium的用法。在开始之前,请确保已经正确安装好了Chrome浏览器并配置好了ChromeDriver。另外,还需要正确安装好Python的Selenium库,详细的安装和配置过程可以参考第
崔庆才
2018/04/02
5.4K0
Selenium的使用方法简介
四、请求库之selenium模块
一 介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器 from selenium import webdriver browser=webdriver.Chrome() browser=webdriver.Firefox() browser=webdriver.PhantomJS() b
用户1214487
2018/01/24
3.1K0
用python操作浏览器的三种方式
第一种:selenium导入浏览器驱动,用get方法打开浏览器,例如: import time from selenium import webdriver def mac():     driver = webdriver.Firefox()     driver.implicitly_wait(5)     driver.get("http://huazhu.gag.com/mis/main.do") 第二种:通过导入python的标准库webbrowser打开浏览器,例如: >>> import webbrowser >>> webbrowser.open("C:\\Program Files\\Internet Explorer\\iexplore.exe") True >>> webbrowser.open("C:\\Program Files\\Internet Explorer\\iexplore.exe") True  第三种:使用Splinter模块模块 一、Splinter的安装 Splinter的使用必修依靠Cython、lxml、selenium这三个软件。所以,安装前请提前安装 Cython、lxml、selenium。以下给出链接地址: 1)http://download.csdn.net/detail/feisan/4301293 2)http://code.google.com/p/pythonxy/wiki/AdditionalPlugins#Installation_no 3)http://pypi.python.org/pypi/selenium/2.25.0#downloads 4)http://splinter.cobrateam.info/ 二、Splinter的使用   这里,我给出自动登录126邮箱的案例。难点是要找到页面的账户、密码、登录的页面元素,这里需要查看126邮箱登录页面的源码,才能找到相关控件的id.   例如:输入密码,密码的文本控件id是pwdInput.可以使用browser.find_by_id()方法定位到密码的文本框, 接着使用fill()方法,填写密码。至于模拟点击按钮,也是要先找到按钮控件的id,然后使用click()方法。 #coding=utf-8   import time   from splinter import Browser  def splinter(url):   browser = Browser()      #login 126 email websize    browser.visit(url)       #wait web element loading   time.sleep(5)      #fill in account and password   browser.find_by_id('idInput').fill('xxxxxx')  browser.find_by_id('pwdInput').fill('xxxxx')      #click the button of login    browser.find_by_id('loginBtn').click()       time.sleep(8)       #close the window of brower       browser.quit()   if __name__ == '__main__':       websize3 ='http://www.126.com'       splinter(websize3)  WebDriver简介 selenium从2.0开始集成了webdriver的API,提供了更简单,更简洁的编程接口。selenium webdriver的目标是提供一个设计良好的面向对象的API,提供了更好的支持进行web-app测试。从这篇博客开始,将学习使用如何使用python调用webdriver框架对浏览器进行一系列的操作 打开浏览器 在selenium+python自动化测试(一)–环境搭建中,运行了一个测试脚本,脚本内容如下: from selenium import webdriver import time driver = webdriver.Chrome() driver.get("http://www.baidu.com") print(driver.title) driver.find_element_by_id("kw").send_keys("s
py3study
2020/01/06
8.5K0
用python操作浏览器的三种方式
selenium抓取网易云音乐评论及歌曲信息
最近在研究springboot,就想着结合爬虫做个网易云音乐在线搜索的功能,先上波效果图把
code2roc
2023/07/19
5310
selenium抓取网易云音乐评论及歌曲信息
相关推荐
python爬取网易云音乐并分析:用户有什么样的音乐偏好?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验