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

作者:阿里波特

来源:CSDN

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

https://space.bilibili.com/523606542

一、前言

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

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

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

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

二、运行环境

我的运行环境如下:

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

三、实战

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

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

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

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

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

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

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

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

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 rdef mkdir(self, path):  ##这个函数创建文件夹path = path.strip()isExists = os.path.exists(path)if not isExists:print('创建名字叫做', path, '的文件夹')os.makedirs(path)print('创建成功!')return Trueelse:print(path, '文件夹已经存在了,不再创建')return Falsedef 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”:

加载 iframe 框架中的内容:

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

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

根据上图的网页结构可以看出,所有的专辑信息都在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_sourceself.mkdir(self.folder_path)  # 创建文件夹print('开始切换文件夹')os.chdir(self.folder_path)  # 切换路径至上面创建的文件夹file_names = self.get_files(self.folder_path)  # 获取文件夹中的所有文件名,类型是listall_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 osclass 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 rdef mkdir(self, path):  ##这个函数创建文件夹path = path.strip()isExists = os.path.exists(path)if not isExists:print('创建名字叫做', path, '的文件夹')os.makedirs(path)print('创建成功!')return Trueelse:print(path, '文件夹已经存在了,不再创建')return Falsedef get_files(self, path):  # 获取文件夹中的文件名称列表pic_names = os.listdir(path)return pic_namesdef spider(self):print("Start!")driver = webdriver.PhantomJS()driver.get(self.init_url)driver.switch_to.frame("g_iframe")html = driver.page_sourceself.mkdir(self.folder_path)  # 创建文件夹print('开始切换文件夹')os.chdir(self.folder_path)  # 切换路径至上面创建的文件夹file_names = self.get_files(self.folder_path)  # 获取文件夹中的所有文件名,类型是listall_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 库创建文件夹和获取文件夹中的文件名称列表

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

  1. python爬取网易云音乐热评_python爬取网易云音乐评论

    本文实例为大家分享了python爬取网易云音乐评论的具体代码,供大家参考,具体内容如下 import requests import bs4 import json def get_hot_comme ...

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

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

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

    首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...

  4. Python爬取网易云音乐热歌榜(爬虫)

    Python爬取网易云音乐热歌榜歌曲,并下载到本地 找到要下载歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更 ...

  5. python爬取网易云音乐生成王力宏歌曲词云

    python爬取网易云音乐生成王力宏歌曲词云 # -*- coding:utf-8 -*- # 网易云音乐,通过歌手id生成词云 import requests import sys,re,os fr ...

  6. python爬取网易云音乐排行榜数据

    python爬取网易云音乐排行榜歌曲及评论 网易云音乐排行榜歌曲及评论爬取 主要注意问题:selenium 模拟登录.iframe标签定位.页面元素提取. 在利用selenium定位元素并取值的过程中 ...

  7. [爬虫]Python爬取网易云音乐搜索并下载歌曲!

    Python爬取网易云音乐搜索并下载歌曲! 文章目录 Python爬取网易云音乐搜索并下载歌曲! 1.准备工作 2."实地"观察 3.开始码代码! 4.搜索并下载 结束语 1.准备 ...

  8. 用Python爬取网易云音乐歌曲

    前天给大家分享了用Python网络爬虫爬取了网易云歌词,在文尾说要爬取网易云歌曲,今天小编带大家一起来利用Python爬取网易云音乐,分分钟将网站上的音乐down到本地. 跟着小编运行过代码的筒子们将 ...

  9. Python爬取网易云音乐歌手歌曲和歌单(爬虫)

    Python爬取网易云音乐歌手歌曲和歌单 是 仅供学习参考 Python爬取网易云音乐网易云音乐歌手歌曲和歌单,并下载到本地 ①找到要下载歌手歌曲的链接,这里用的是: https://music.16 ...

最新文章

  1. Mybatis遍历查询 ——foreach
  2. SpringBoot文件上传异常之temporary upload location not valid
  3. boost::variant2模块实现抛出异常的测试程序
  4. 2.Eclipse上mysql插件配置及远程连接云数据库测试
  5. 华为云MySQL数据库外网使用
  6. android融云自定义消息界面大小,融云自定义消息通知栏显示
  7. Jquery下拉效果
  8. comet4j简单应用、文档教程
  9. javaweb关于404、500等错误页面的处理
  10. Skype和LibFetion无法输入中文的解决方法
  11. pythonsdk_Python SDK下载
  12. 向日葵android客户端,向日葵安卓3.1客户端教程
  13. 基于crontab的服务器恶意程序
  14. 狐狸逮兔子——链式存储方式
  15. 音诺恒RK3568高性能智能商显安卓广告机主板解决方案
  16. 广州华锐互动提供商场AR大屏互动制作一站式解决方案
  17. 怎么将.txt改为任意文件格式
  18. 小海龟画图(小猪佩奇)
  19. 在隐身模式下使用 Chrome 扩展程序
  20. 数据分析案例:APP热点标签分析

热门文章

  1. docker compose安装redis集群、集群扩容、集群收缩
  2. js把毫秒数转为天,小时分钟秒,比如10130毫秒转换为xx天xx小时xx分钟
  3. vue实现前端登录验证码
  4. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于Web的小区物业管理系统2xjhe
  5. matlab资产投资组合计算,第5章matlab资产组合计算.ppt
  6. Python 实现 并行for循环
  7. 电视剧《陈真》1981主题曲大号是中华
  8. linux系统下每次git pull输入用户名密码
  9. 如何设计一个简易的工单系统
  10. 3-3画笔工具的使用