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

初学scrapy并爬取 喜马拉雅音乐想和大家分享分享

    • 一 、分析数据
    • 二 、分析完啦 话不多说 给各位看官上代码!
    • 具体代码如下
    • 这就是一个简单的爬虫爬取 喜马拉雅的歌曲 ? 本人仍在继续爬着!!!!!!
    • 详细项目代码见gitup https://github.com/kong11213613/python3-

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

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

一 、分析数据

1 https://www.ximalaya.com/yinyue/liuxing/p1/ 这个网址就是我们要爬取的的喜马拉雅网址
Python3+scrapy 爬取喜马拉雅音乐 音乐和歌名 最简单的爬虫_第1张图片

2 是要点击右键分析数据 你可以看到 Python3+scrapy 爬取喜马拉雅音乐 音乐和歌名 最简单的爬虫_第2张图片
3. 我把这个地址打开以后就会发现 这是json数据
Python3+scrapy 爬取喜马拉雅音乐 音乐和歌名 最简单的爬虫_第3张图片
4、我们看一下去掉会是什么样子

Python3+scrapy 爬取喜马拉雅音乐 音乐和歌名 最简单的爬虫_第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
结果就是这样的 分目录存放

Python3+scrapy 爬取喜马拉雅音乐 音乐和歌名 最简单的爬虫_第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)

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

Python3+scrapy 爬取喜马拉雅音乐 音乐和歌名 最简单的爬虫_第6张图片

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

你可能感兴趣的:(Python3,Python3,-,scrapy,简单使用,爬取喜马拉雅音乐)