热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python3+scrapy爬取喜马拉雅音乐音乐和歌名最简单的爬虫

Python3+scrapy爬取喜马拉雅音乐音乐和歌名最简单的爬虫,Go语言社区,Golang程序员人脉社


Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。


一 、分析数据

1 https://www.ximalaya.com/yinyue/liuxing/p1/ 这个网址就是我们要爬取的的喜马拉雅网址
在这里插入图片描述

2 是要点击右键分析数据 你可以看到 在这里插入图片描述

3. 我把这个地址打开以后就会发现 这是json数据
在这里插入图片描述

4、我们看一下去掉会是什么样子

在这里插入图片描述

5 看到那个后面的id 我还好像在哪见过那 对啦就是在在这里插入图片描述

6 简单的分析结束啦 开始我们的代码之旅吧!


二 、分析完啦 话不多说 给各位看官上代码!

1、这是我们需要的模块 需要引一下
import scrapy
import re
import json
import requests

2

创建一个类并继承 最初的爬虫类 并在start_urls 里添加最初的URL 并将结果交给 parse 函数

class www_ximalaya_com(scrapy.Spider):
name = "www_ximalaya_com"
start_urls = [
"https://www.ximalaya.com/yinyue/liuxing/p1/"
]

3 接到 网页数据之后 开始解析我们要的 首先是 每个歌曲集合 的id 还有 下一页的 URL 并将获取的数据传到要掉用的parses 函数

页的URL 返回给本身 并进行下一次爬取

def parse(self, response):
"""
该函数负责提取下一页的a链接 并提取歌曲集合的id
拼接url 获取json数据
:param response: 将数据返回给回调函数 parses
:return:
"""
#提取下一页的href 数据 '/yinyue/liuxing/p2/'
a = response.css("li.page-next a.page-link::attr(href)").extract()[0]

#拼接下一页的url
a = "https://www.ximalaya.com" + a


#提取歌曲集合的a链接的href 并进行正则提取id /yinyue/460941/ 这是一个 列表
nums = response.css(" div.album-wrapper-card a::attr(href)").extract()


# 循环列表进行正则和 拼接URL
for val in nums:
# 正则提取id 460941
s = re.search("d+",val,re.S)
numd = s.group()
#拼接URL
url = "https://www.ximalaya.com/revision/play/album?albumId=" + numd
#发起请求并移交给回调函数 parses
yield scrapy.Request(url,callback=self.parses)

#页数
count = 2
#循环页数
while count <= 34:
#拼接下一页的URL
url = "https://www.ximalaya.com/yinyue/liuxing/p%d/" % count
# 发去请求并移交给本身
yield scrapy.Request(url,callback=self.parse)
count += 1

4 接到 parses 函数的调用时 解析 json数据 并保存文件

def parses(self,response):
"""
该函用于解析 数据 提取数据 发起请求获取数据
并将音乐保存在文件当中
:param response:
:return:
"""
# 获取数据
jsOns= response.text

#解析json数据
jslod = json.loads(jsons)


#循环数据

for val in jslod["data"]["tracksAudioPlay"]:
#获取URL
url = val["src"]
#获取歌名
name = val["trackName"]
file_name = val["albumName"]
lists = []
#设置列表
lists.append(file_name)
lists.append(url)
lists.append(name)
# #判断 URL是否为None
if lists[1] != None:
判断目录是否存在
if os.path.isdir(lists[0]) == False:
#不存在就创建目录
os.mkdir(lists[0])
#目录写入文件
with open("./"+ lists[0] + "/" + lists[2] + ".mp3", "wb+") as f:
#发起URL请求并获取内容
r = requests.get(lists[1])
#写入文件
f.write(r.content)
#生成错误日志
self.log("保存文件" + name)
else:
#如果存在直接打开目录写入文
with open("./" + lists[0] + "/" + lists[2] + ".mp3", "wb+") as f:
# 发起URL请求并获取内容
r = requests.get(lists[1])
# 写入文件
f.write(r.content)
# 生成错误日志
self.log("保存文件" + name)

5

结果就是这样的 分目录存放

在这里插入图片描述


具体代码如下

import scrapy
import re
import json
import requests
import os
class www_ximalaya_com(scrapy.Spider):
name = "www_ximalaya_com"
start_urls = [
"https://www.ximalaya.com/yinyue/liuxing/p1/"
]
def parse(self, response):
"""
该函数负责提取下一页的a链接 并提取歌曲集合的id
拼接url 获取json数据
:param response: 将数据返回给回调函数 parses
:return:
"""
#提取下一页的href 数据 '/yinyue/liuxing/p2/'
a = response.css("li.page-next a.page-link::attr(href)").extract()[0]

#拼接下一页的url
a = "https://www.ximalaya.com" + a


#提取歌曲集合的a链接的href 并进行正则提取id /yinyue/460941/ 这是一个 列表
nums = response.css(" div.album-wrapper-card a::attr(href)").extract()
# 循环列表进行正则和 拼接URL
for val in nums:
# 正则提取id 460941
s = re.search("d+",val,re.S)
numd = s.group()
#拼接URL
url = "https://www.ximalaya.com/revision/play/album?albumId=" + numd
#发起请求并移交给回调函数
yield scrapy.Request(url,callback=self.parses)


# 页数
count = 2
#循环页数
while count <= 34:
#拼接下一页的URL
url = "https://www.ximalaya.com/yinyue/liuxing/p%d/" % count
# 发去请求并移交给本身
yield scrapy.Request(url,callback=self.parse)
count += 1



def parses(self,response):
"""
该函用于解析 数据 提取数据 发起请求获取数据
并将音乐保存在文件当中
:param response:
:return:
"""
# 获取数据
jsOns= response.text

#解析json数据
jslod = json.loads(jsons)


#循环数据

for val in jslod["data"]["tracksAudioPlay"]:
#获取URL
url = val["src"]
#获取歌名
name = val["trackName"]
file_name = val["albumName"]
lists = []
#设置列表 将歌曲集合 URL 歌名 追加进列表
lists.append(file_name)
lists.append(url)
lists.append(name)
# #判断 URL是否为None
if lists[1] != None:
#打开文件
if os.path.isdir(lists[0]) == False:
os.mkdir(lists[0])
with open("./"+ lists[0] + "/" + lists[2] + ".mp3", "wb+") as f:
#发起URL请求并获取内容
r = requests.get(lists[1])
#写入文件
f.write(r.content)
#生成错误日志
self.log("保存文件" + name)
else:
with open("./" + lists[0] + "/" + lists[2] + ".mp3", "wb+") as f:
# 发起URL请求并获取内容
r = requests.get(lists[1])
# 写入文件
f.write(r.content)
# 生成错误日志
self.log("保存文件" + name)

这就是一个简单的爬虫爬取 喜马拉雅的歌曲 ? 本人仍在继续爬着!!!!!!

在这里插入图片描述


详细项目代码见gitup https://github.com/kong11213613/python3-




推荐阅读
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
  • JavaWeb中读取文件资源的路径问题及解决方法
    在JavaWeb开发中,读取文件资源的路径是一个常见的问题。本文介绍了使用绝对路径和相对路径两种方法来解决这个问题,并给出了相应的代码示例。同时,还讨论了使用绝对路径的优缺点,以及如何正确使用相对路径来读取文件。通过本文的学习,读者可以掌握在JavaWeb中正确找到和读取文件资源的方法。 ... [详细]
  • 本文详细介绍了Python中正则表达式和re模块的使用方法。首先解释了转义符的作用,以及如何在字符串中包含特殊字符。然后介绍了re模块的功能和常用方法。通过学习本文,读者可以掌握正则表达式的基本概念和使用技巧,进一步提高Python编程能力。 ... [详细]
author-avatar
氣質正妹_384
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有