作者:氣質正妹_384 | 来源:互联网 | 2023-08-30 12:07
初学scrapy并爬取 喜马拉雅音乐想和大家分享分享
- 一 、分析数据
- 二 、分析完啦 话不多说 给各位看官上代码!
- 具体代码如下
- 这就是一个简单的爬虫爬取 喜马拉雅的歌曲 ? 本人仍在继续爬着!!!!!!
- 详细项目代码见gitup https://github.com/kong11213613/python3-
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)
这就是一个简单的爬虫爬取 喜马拉雅的歌曲 ? 本人仍在继续爬着!!!!!!