Python爬取网易云音乐辑的图片、专辑名和专辑出版时间

Stella981 等级 200 0 0
标签: iframepython

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

作者:阿里波特

来源:CSDN

Python爬虫、数据分析、网站开发等案例教程视频免费在线观看

https://space.bilibili.com/523606542

Python爬取网易云音乐辑的图片、专辑名和专辑出版时间

一、前言

前文说过我的设计师小伙伴的设计需求,他想做一个披头士乐队历年专辑的瀑布图。

通过搜索,发现网易云音乐上有比较全的历年专辑信息加配图,图片质量还可以,虽然有大有小。

我的例子怎么都是爬取图片?(谁让你总是跟设计师小伙伴一起玩耍。。。)看来图片对于设计师来说还是有着很深的情节,那就看他用这些图片能做出什么样的作品啦,期待一下,后续会展示一下他的作品。

其实爬取网易云音乐跟之前爬取的网站稍稍有点不同,当然,爬虫写的多了就觉得套路都是固定的,见招拆招而已。

二、运行环境

我的运行环境如下:

  • 系统版本
    Windows10。
  • Python版本
    Python3.5,推荐使用Anaconda 这个科学计算版本,主要是因为它自带一个包管理工具,可以解决有些包安装错误的问题。去Anaconda官网,选择Python3.5版本,然后下载安装。
  • IDE
    我使用的是PyCharm,是专门为Python开发的IDE。

三、实战

上面提到过,网易云音乐的网页跟普通的网页相比主要有两点不同:

  • 网页是 js 动态加载的
  • 使用了iframe框架
    所以,首先,网页请求不能使用requests库,需要使用Selenium + PhatomJS。其次,使用Selenium + PhatomJS后,还需要针对 iframe 做特定处理。

废话不多说,看实际操作步骤:
首先打开网页 http://music.163.com

Python爬取网易云音乐辑的图片、专辑名和专辑出版时间

在右上角的搜索框中输入“The Beatles”,然后会有一个下拉选项,选择歌手 The Beatles (红框中的内容)。

Python爬取网易云音乐辑的图片、专辑名和专辑出版时间

然后看到如下页面,选择红框中的“所有专辑”,点击。

Python爬取网易云音乐辑的图片、专辑名和专辑出版时间

这样就会看见所有的专辑列表,以及下方的翻页按钮。

Python爬取网易云音乐辑的图片、专辑名和专辑出版时间

我们需要的就是所有专辑的图片、专辑名和专辑出版时间。看到这就可以构想一下爬虫的爬取逻辑了。定位到该页面,然后获取页码,然后挨个请求页面来爬取页面中的内容。
点击一下翻页按钮看看url 有没有什么规律。

Python爬取网易云音乐辑的图片、专辑名和专辑出版时间

点击第二页后,看到上面的地址栏!!!看到这个地址栏我都懒得翻页了。。。

limit 参数是限制一个页面加载专辑的个数
offset 参数是前面过滤多少个专辑,现在是一页12个专辑,所以第二页是offset=12,第三页offset=24,以此类推。。。

一共9页,一页12个,也不到120个。So… … 改一下url 就不用翻页了!!

limit 参数等于120,offset 参数 等于0,就搞定了!输入下面的url,看看是不是所有的专辑都加载出来了。

http://music.163.com/#/artist/album?id=101988&limit=120&offset=0

下面就开始爬虫代码了。
这里我们会用到上一篇博文中写好的几个工具方法:

    def save_img(self, url, file_name): ##保存图片
        print('开始请求图片地址,过程会有点长...')
        img = self.request(url)
        print('开始保存图片')
        f = open(file_name, 'ab')
        f.write(img.content)
        print(file_name,'图片保存成功!')
        f.close()

    def request(self, url):  #封装的requests 请求
        r = requests.get(url)  # 像目标url地址发送get请求,返回一个response对象。有没有headers参数都可以。
        return r

    def mkdir(self, path):  ##这个函数创建文件夹
        path = path.strip()
        isExists = os.path.exists(path)
        if not isExists:
            print('创建名字叫做', path, '的文件夹')
            os.makedirs(path)
            print('创建成功!')
            return True
        else:
            print(path, '文件夹已经存在了,不再创建')
            return False

    def get_files(self, path): #获取文件夹中的文件名称列表
        pic_names = os.listdir(path)
        return pic_names

OK, 开始我们的爬虫逻辑部分:

这里值得注意的是,该页面使用frame 框架,使用Selenium + PhantomJS 后并不会加载iframe 框架中的网页内容。iframe 框架相当于在页面中又加载了一个页面,需要使用Selenium 的 switch_to.frame() 方法加载(官网给的方法是switch_to_frame(),但是IDE提醒使用前面的方法替代该方法)。

看下面的网页结构,iframe的id是“g_iframe”:

Python爬取网易云音乐辑的图片、专辑名和专辑出版时间

加载 iframe 框架中的内容:

driver = webdriver.PhantomJS()
driver.get(self.init_url)
driver.switch_to.frame("g_iframe")
html = driver.page_source

然后找到所有的封面元素:

Python爬取网易云音乐辑的图片、专辑名和专辑出版时间

根据上图的网页结构可以看出,所有的专辑信息都在ul 标签里面,每一个专辑在一个li 标签里。li 标签中包含了图片url、专辑名字、以及专辑时间。

抓取其中的内容就好了。

all_li = BeautifulSoup(html, 'lxml').find(id='m-song-module').find_all('li')

for li in all_li:
    album_img = li.find('img')['src']
    album_name = li.find('p', class_='dec')['title']
    album_date = li.find('span', class_='s-fc3').get_text()

这里获取到的图片url 依然是有图片宽高参数的,所以要过滤宽高参数:
http://p4.music.126.net/pLA1GX0KtU-vU4ZA6Cr-OQ==/1401877340532770.jpg?param=120y120

把问号后面的参数过滤掉:

end_pos = album_img.index('?')  #找到问号的位置
album_img_url = album_img[:end_pos]  #截取问号之前的内容

图片命名逻辑:专辑时间 + 专辑名。
专辑名可能有一些特殊字符,需要替换掉!
photo_name = album_date + ' - ' + album_name.replace('/','').replace(':',',') + '.jpg'

再使用上一篇博文例子中的去重逻辑,修改后的爬虫逻辑部分如下:

    def spider(self):
        print("Start!")
        driver = webdriver.PhantomJS()
        driver.get(self.init_url)
        driver.switch_to.frame("g_iframe")
        html = driver.page_source

        self.mkdir(self.folder_path)  # 创建文件夹
        print('开始切换文件夹')
        os.chdir(self.folder_path)  # 切换路径至上面创建的文件夹

        file_names = self.get_files(self.folder_path)  # 获取文件夹中的所有文件名,类型是list

        all_li = BeautifulSoup(html, 'lxml').find(id='m-song-module').find_all('li')
        # print(type(all_li))

        for li in all_li:
            album_img = li.find('img')['src']
            album_name = li.find('p', class_='dec')['title']
            album_date = li.find('span', class_='s-fc3').get_text()
            end_pos = album_img.index('?')
            album_img_url = album_img[:end_pos]

            photo_name = album_date + ' - ' + album_name.replace('/','').replace(':',',') + '.jpg'
            print(album_img_url, photo_name)

            if photo_name in file_names:
                print('图片已经存在,不再重新下载')
            else:
                self.save_img(album_img_url, photo_name)

其实相对于上篇博文的例子,这个爬虫的逻辑部分还是挺简洁的。

最后上一个完整的代码:也可以从GitHub下载

from selenium import webdriver
from bs4 import BeautifulSoup
import requests
import os

class AlbumCover():

    def __init__(self):
        self.init_url = "http://music.163.com/#/artist/album?id=101988&limit=120&offset=0" #请求网址
        self.folder_path = "C:\D\TheBeatles" #想要存放的文件目录

    def save_img(self, url, file_name):  ##保存图片
        print('开始请求图片地址,过程会有点长...')
        img = self.request(url)
        print('开始保存图片')
        f = open(file_name, 'ab')
        f.write(img.content)
        print(file_name, '图片保存成功!')
        f.close()

    def request(self, url):  # 封装的requests 请求
        r = requests.get(url)  # 像目标url地址发送get请求,返回一个response对象。有没有headers参数都可以。
        return r

    def mkdir(self, path):  ##这个函数创建文件夹
        path = path.strip()
        isExists = os.path.exists(path)
        if not isExists:
            print('创建名字叫做', path, '的文件夹')
            os.makedirs(path)
            print('创建成功!')
            return True
        else:
            print(path, '文件夹已经存在了,不再创建')
            return False

    def get_files(self, path):  # 获取文件夹中的文件名称列表
        pic_names = os.listdir(path)
        return pic_names

    def spider(self):
        print("Start!")
        driver = webdriver.PhantomJS()
        driver.get(self.init_url)
        driver.switch_to.frame("g_iframe")
        html = driver.page_source

        self.mkdir(self.folder_path)  # 创建文件夹
        print('开始切换文件夹')
        os.chdir(self.folder_path)  # 切换路径至上面创建的文件夹

        file_names = self.get_files(self.folder_path)  # 获取文件夹中的所有文件名,类型是list

        all_li = BeautifulSoup(html, 'lxml').find(id='m-song-module').find_all('li')
        # print(type(all_li))

        for li in all_li:
            album_img = li.find('img')['src']
            album_name = li.find('p', class_='dec')['title']
            album_date = li.find('span', class_='s-fc3').get_text()
            end_pos = album_img.index('?')
            album_img_url = album_img[:end_pos]

            photo_name = album_date + ' - ' + album_name.replace('/', '').replace(':', ',') + '.jpg'
            print(album_img_url, photo_name)

            if photo_name in file_names:
                print('图片已经存在,不再重新下载')
            else:
                self.save_img(album_img_url, photo_name)

album_cover = AlbumCover()
album_cover.spider()

执行结果:
看看文件夹里面什么样:
历年的专辑封面已经到手啦,还有专辑的名称和发行日期。

四、后语

这个实战很好的运用了咱们之前讲解的知识:

  • 使用Selenium + PhatomJS 抓取动态页面
  • 使用Selenium 的switch_to.frame() 加载 iframe 中的内容
  • 使用requests 库获取图片
  • 使用BeautifulSoup 库解析抓取网页内容。
  • 使用os 库创建文件夹和获取文件夹中的文件名称列表

本文同步分享在 博客“松鼠爱吃饼干”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

收藏
评论区

相关推荐

被“词云”包围的冰冰会更好看吗?安排
(https://imghelloworld.osscnbeijing.aliyuncs.com/b299933deefc692934e8cc6141ab3894.png) 大家好,我是小五🐶 昨天「凹凸数据」发了一篇张同学投稿的文章《用Python爬取王冰冰vlog弹幕并制作词云(https://mp.weixin.qq.com/
商业数据分析从入门到入职(9)Python网络数据获取
@toc 前言本文主要讲Python最常见的应用之一——网络数据获取,即爬虫:先介绍了网页和网络的基础知识,为从网页中获取数据打好基础;接下来以两个案例介绍从网络中获取数据和处理数据的不同方式,以进一步认识Python爬虫和数据处理。 一、网络和网页基础知识 1.数据来源数据源有很多,可以从数据库中获取,可以从文件中获取,也可以从
《Python3网络爬虫开发实战》
提取码:1028内容简介 · · · · · ·本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib、requests、正则表达式、Beautiful Soup、XPath、pyquery、数据存储、Ajax数据爬取等内容,接着通过多个案例介绍了不同场景下如何实现数据爬取,后介绍了pyspider框架、S
玩转python爬虫
     近几年来,python的热度一直特别火!大学期间,也进行了一番深入学习,毕业后也曾试图把python作为自己的职业方向,虽然没有如愿成为一名python工程师,但掌握了python,也让我现如今的工作开展和职业发展更加得心应手。这篇文章主要与大家分享一下自己在python爬虫方面的收获与见解。   
50 行代码教你爬取猫眼电影 TOP100 榜所有信息
对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天,恋习Python的手把手系列,手把手教你入门Python爬虫,爬取猫眼电影TOP100榜信息,将涉及到基础爬虫架构中的HTML下载器、HTML解析器、数据存储器三大模块: HTML下载器:利用requests模块下载HTML网页; HTML解析器:利用re正则表达
Python 使用selenium抓取网页文本和下载音频
Python 使用selenium抓取网页文本和下载音频 #!\usr\bin\env python # -*- coding: utf-8 -*- '一个自动从https://podcast.duolingo.com/spanish中下载音频并且爬取文本的程序' '需要配置下载以下所需库,并且配置好webdriv
Python3 网络爬虫:下载小说的正确姿势
点击上方“ **Python爬虫与数据挖掘** ”,进行关注 回复“**书籍**”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 少年心事当拂云。 ![](https://oscimg.oschina.net/oscnet/09902b71501b9e8c3cb656b5dfbbb0552e0.jpg) 1 **
Python基础练习(一)中国大学定向排名爬取
说好的要从练习中学习爬虫的基础操作,所以就先从容易爬取的静态网页开始吧! 今天要爬取的是最好大学网上的2018年中国大学排名。我个人认为这个是刚接触爬虫时用来练习的一个很不错的网页了。 在说这个练习之前,给新着手学习爬虫的同学提供一个中国MOOC上北京理工大学嵩天老师的视频, [Python网络爬虫与信息提取](https://www.oschina.n
Python实现王者荣耀小助手(一)
简单来说网络爬虫,是指抓取万维网信息的程序或者脚本,Python在网络爬虫有很大优势,今天我们用Python实现获取王者荣耀相关数据,做一个小助手: 前期准备,环境搭建: Python2.7 sys模块提供了许多函数和变量来处理 Python 运行时环境的不同部分; urllib模块提供了一系列用于操作URL的功能,爬虫所需要的功能,基本上在urll
Python爬取暴走漫画动态图
最近再之乎上看到比较好的Python爬虫教程,看过之后对爬虫有了大概的了解,随后自己写了个爬取[暴走漫画](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fbaozoumanhua.com%2Fcatalogs%2Fgif)动图的爬虫练练手,另外附上[Python爬虫教程](https://w
Python爬取网易云歌单
#### 基本配置: * Python版本:3.7 #### 相关模块: from urllib import parsefrom lxml import etreefrom urllib3 import disable_warningsimport requests #### 案例关键点: 使用单线程爬取,未登录,爬取网易云
Python爬取网易云音乐辑的图片、专辑名和专辑出版时间
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 作者:阿里波特 来源:CSDN **Python爬虫、数据分析、网站开发等案例教程视频免费在线观看** https://space.bilibili.com/523606542 ![](https://oscimg.oschina.net/
Python爬虫
Python爬虫-xpath ============== * Python爬虫-xpath * 说明 * 再说明 * 插件推荐 * 语法讲述 * 举栗子 * 代码里使用 * 实战句子迷 * 需要的总结: 说明 -- 关于Python爬虫请求数据方面的知
Scrapy框架
\[TOC\] 1\. Scrapy介绍 ============ 1.1. Scrapy框架 ------------- Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。 ![](http://ccszt.com.cn/python/%E7%88%AC%E8%99%AB/file/images/
python访问百度关键词和链接
前几天在Python交流群有个同学分享了一份Python网络爬虫代码,用来获取某度关键词和链接的。其实这个需求之前我也写过代码,不过网页结构变化之后,之前的提取器已经失效了,所以代码就作废了。今天这里给再给大家分享一个使用python获取某度关键词的实践。由于某度也是设置反爬安全策略的,所有同一IP下程序运行次数多了也是会被封IP的,所有在访问过程中我们需要