鱼C论坛

 找回密码
 立即注册
查看: 5418|回复: 8

这个喜马拉雅的cookies要插在那个位置

[复制链接]
发表于 2020-8-27 21:10:57 | 显示全部楼层 |阅读模式
20鱼币
如题,自己有喜马拉雅vip,想问一下在哪里添加一个vipcookies可以爬取vip音频。
  1. import requests
  2. import bs4
  3. import json
  4. import os
  5. import openpyxl


  6. class Ximalaya():
  7.     def __init__(self):
  8.         self.url = 'https://www.ximalaya.com'
  9.         self.headers = {
  10.             "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}

  11.     # 关键字搜索,返回一个列表 的字典数据
  12.     def search(self, kw):
  13.         res = requests.get(self.url + "/search/" + kw, headers=self.headers)
  14.         bs = bs4.BeautifulSoup(res.text, "html.parser")
  15.         # bs1放的是标题和网址  bs2放的是图片地址
  16.         bs1 = bs.find_all('a', class_="xm-album-title ellipsis-2")
  17.         bs2 = bs.find_all('a', class_="xm-album-cover")
  18.         # 图片
  19.         ls = []
  20.         for i in range(len(bs1)):
  21.             d = dict.fromkeys(("title", "albumId", "src", 'count'))
  22.             d['title'] = bs1[i]['title']  # 标题
  23.             d['albumId'] = bs1[i]['href'].split('/')[-2]  # 网址的albumId
  24.             d['src'] = "https:" + bs2[i].img['src']  # 图片
  25.             d['count'] = bs2[i].find('div', class_='listen-count').span.text  # 播放量
  26.             ls.append(d)

  27.         return ls

  28.     # 访问目标专辑的网页,然后获取所有的章节的列表字典数据+"p1/"
  29.     def get_album(self, albumId):
  30.         res = requests.get(f"{self.url}/revision/album/v1/getTracksList?albumId={albumId}&pageNum=1&sort=0&pageSize=30",
  31.                            headers=self.headers)
  32.         js = json.loads(res.text)
  33.         # 获取总页数 分页计算总页数算法
  34.         pageSize = 1000
  35.         totalRecord = int(js['data']['trackTotalCount'])
  36.         totalPageNum = int((totalRecord + pageSize - 1) / pageSize)
  37.         ls = []
  38.         for i in range(totalPageNum):
  39.             res = requests.get(
  40.                 f"{self.url}/revision/album/v1/getTracksList?albumId={albumId}&pageNum={i + 1}&sort=0&pageSize={pageSize}",
  41.                 headers=self.headers)
  42.             js1 = json.loads(res.text)
  43.             js1 = js1['data']['tracks']
  44.             for item in js1:
  45.                 d = dict.fromkeys(('title', 'trackId', 'playCount'))
  46.                 d["title"] = item['title']  # 标题
  47.                 d["playCount"] = item['playCount']  # 播放量
  48.                 d["trackId"] = item['trackId']  # 下载接口id
  49.                 ls.append(d)
  50.         return ls

  51.     # 下载音频文件,返回下载结果 需要提供章节字典 和目录名
  52.     def donwn(self, section, sname):
  53.         try:
  54.             # 如果没有这个目录则创建一个目录
  55.             if os.path.isdir(sname) == False:
  56.                 os.makedirs(sname)
  57.             sname = sname + r"/"
  58.             res = requests.get(f"https://www.ximalaya.com/revision/play/v1/audio?id={section['trackId']}&ptype=1",
  59.                                headers=self.headers)
  60.             js = json.loads(res.text)
  61.             res = requests.get(js['data']['src'], headers=self.headers).content
  62.             with open(sname + section['title'] + ".m4a", 'wb') as file:
  63.                 file.write(res)
  64.             print(section['title'] + " 下载成功!")
  65.         except:
  66.             print(section['title'] + " 下载失败!")


  67.     #将数据保存到excel表格中
  68.     def to_excel(self, sections, sname):
  69.         try:
  70.             wb = openpyxl.Workbook()
  71.             ws = wb.active  # 获取工作表
  72.             ws.freeze_panes = 'B2'
  73.             #设置行宽 高  width是字符数 height是像素
  74.             ws.row_dimensions[1].height = 25
  75.             ws.column_dimensions['A'].width = 50
  76.             ws.column_dimensions['B'].width = 90
  77.             ws.column_dimensions['C'].width = 20
  78.             ws.append(['title', 'm4aUrl', 'playCount'])


  79.             sname = sname + ".xlsx"
  80.             for item in sections:
  81.                 res = requests.get(f"https://www.ximalaya.com/revision/play/v1/audio?id={item['trackId']}&ptype=1",
  82.                                    headers=self.headers)
  83.                 js = json.loads(res.text)
  84.                 print(item['title'], js['data']['src'], item['playCount'])
  85.                 ws.append([item['title'], js['data']['src'], item['playCount']])
  86.             wb.save(sname)
  87.             print(f"保存到 {sname} 成功!")
  88.         except:
  89.             print(f"保存到 {sname} 失败!")


  90. if __name__ == "__main__":
  91.     while True:
  92.         xmly = Ximalaya()
  93.         while True:
  94.             try:
  95.                 kw = input("请输入您想搜索的关键字:(书名或者作者)\r\n")
  96.                 ls = xmly.search(kw)
  97.                 for i, item in enumerate(ls):
  98.                     txt = f"{i + 1}-{item['title']}-{item['count']}"
  99.                     print(txt)
  100.                 xh = input(f"请输入您想要下载的专辑的序号:1-{len(ls)}  返回上一步请输入'#'键\r\n")
  101.                 # 如果输入了#号键则继续循环问..不是则跳出循环
  102.                 if xh != '#':
  103.                     try:
  104.                         xh = int(xh) - 1
  105.                         break
  106.                     except:
  107.                         print("输入有误!回到开始位置")

  108.             except:
  109.                 print("关键字有误,或者没找到!")
  110.         print("正在遍历所有的章节,这需要些时间.......")
  111.         # 根据用户选的序号来选择遍历哪个有声书的所有章节
  112.         sections = xmly.get_album(ls[xh]["albumId"])
  113.         for i, item in enumerate(sections):
  114.             print(i + 1, item['title'])
  115.         ts = input(
  116.             f"           有几种交互方式,请参考!\r\n1.请输入需要下载的章节序号:1-{len(sections)} 支持范围下载 例如输入:10-100\r\n2.如果您要全部都下载,请输入'#'键\r\n3.如果您要全部打印到excel表格里请输入'e'键\r\n4.退出按x键\r\n")
  117.         name = ls[xh]["title"]
  118.         if ts == "#":  # 全部下载
  119.             for item in sections:
  120.                 xmly.donwn(item, name)
  121.         else:
  122.             if '-' in ts:  # 范围下载
  123.                 min, max = ts.split('-')
  124.                 for i in range(int(min), int(max) + 1):
  125.                     xmly.donwn(sections[i], name)
  126.             elif ts == 'e':  # 将数据保存到excel表格里
  127.                 xmly.to_excel(sections, name)
  128.             elif ts=='x':
  129.                 break
  130.             else:  # 按序号下载
  131.                 xmly.donwn(sections[int(ts) - 1], name)
  132.         ts=input("还要继续输入'j'键,退出输入任意键")
  133.         if ts!='j':
  134.             break


复制代码


我自己在head这儿添加cookeis,好像没效果,还是我的cookie方式错语,求指导。谢谢!
11.jpg

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-27 22:45:31 | 显示全部楼层
应该是格式问题吧
self.headers = {
            "user-agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
            "cookie" : "你的cookie",

}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-28 00:17:57 | 显示全部楼层
虽然无法解答楼主的问题,但是很感谢楼主分享了源码。。。。。。。。拿这个试了下,没用VIPcookie,就下载免费的音频,碰到一个问题,创建文件的时候,会有失败,原因在sname中有‘|’,无法创建文件夹和文件,名称不规范,所以失败了,可以改进下把这个split切割了,现在能下载成功了
  1. # 下载音频文件,返回下载结果 需要提供章节字典 和目录名
  2.     def donwn(self, section, sname):
  3.         
  4.         sname = sname.split('|')[0]
  5.         try:
  6.             # 如果没有这个目录则创建一个目录
  7.             if os.path.isdir(sname) == False:
  8.                 os.makedirs(sname)  #文件名有不符合创建标准的就会失败
  9.             sname = sname + r"/"
  10.             res = requests.get(f"https://www.ximalaya.com/revision/play/v1/audio?id={section['trackId']}&ptype=1",
  11.                                headers=self.headers)
  12.             #print(res)
  13.             js = json.loads(res.text)
  14.             res = requests.get(js['data']['src'], headers=self.headers).content
  15.             with open(sname + section['title'].split('|')[0] + ".m4a", 'wb') as file:
  16.                 file.write(res)
  17.             print(section['title'] + " 下载成功!")
  18.         except:
  19.             print(section['title'] + " 下载失败!")
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-28 00:21:08 | 显示全部楼层
这是吾爱破解上的一段源码,发帖人说改下cookie就能下载VIP,楼主可以参考下
  1. import requests
  2. from lxml import etree
  3. import os
  4. import time
  5. import json


  6. def Get_ID_Name(url, headers):
  7.     Contents_IDS = []
  8.     r = requests.get(url, headers=headers)
  9.     print(r)
  10.     r.encoding = r.apparent_encoding
  11.     html = etree.HTML(r.text)
  12.     Titles = html.xpath('//div[@class="sound-list _Qp"]/ul/li/div[2]/a/@title')
  13.     Contents_lists = html.xpath('//div[@class="sound-list _Qp"]/ul/li/div[2]/a/@href')
  14.     for Contents_list in Contents_lists:
  15.         links_Cache = str(Contents_list).split('/')[-1]
  16.         JsonURL = 'https://www.ximalaya.com/revision/play/v1/audio?id={}&ptype=1'.format(links_Cache)
  17.         Contents_IDS.append(JsonURL)
  18.     return Titles, Contents_IDS


  19. def Json_Get_links(Contents_IDS, headers):
  20.     Itemlists = []
  21.     n = 0
  22.     for Contents_ID in Contents_IDS:
  23.         contents = {}
  24.         time.sleep(1.5)
  25.         r1 = requests.get(Contents_ID, headers=headers)
  26.         r1.encoding = r1.apparent_encoding
  27.         results = json.loads(r1.text)
  28.         id = results['data']['trackId']
  29.         m4alinks = results['data']['src']
  30.         contents['ID'] = id
  31.         contents['M4aLinks'] = m4alinks
  32.         Itemlists.append(contents)
  33.         n += 1
  34.         print('已采集{}个链接!'.format(n))
  35.     # print(Itemlists)
  36.     return Itemlists


  37. def DownLoadM4A(Itemlists, filename):
  38.     headers = {
  39.         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3775.400 QQBrowser/10.6.4208.400',
  40.         # 'If-None-Match': '"llN9ISnSdOkEmb835lC9NQ_j47Kl"',
  41.         # 'Host': 'fdfs.xmcdn.com',
  42.     }
  43.     if not os.path.exists('./XMLYFM'):
  44.         os.mkdir('./XMLYFM')
  45.     count = 0
  46.     for filename1, Itemlist in zip(filename, Itemlists):
  47.         srclinks = Itemlist['M4aLinks']
  48.         print(srclinks)
  49.         r2 = requests.get(srclinks, headers=headers)
  50.         print(r2)
  51.         # print(r2.raise_for_status())
  52.         with open('./XMLYFM/' + str(filename1) + '.m4a', 'wb')as f:
  53.             f.write(r2.content)
  54.             count += 1
  55.             print('已下载{}个音频文件!'.format(count))
  56.     print("{}个音频文件已全部下载完成!".format(count))


  57. if __name__ == '__main__':
  58.     print('正在加载...')
  59.     url = 'https://www.ximalaya.com/gerenchengzhang/29391994/'  #更换URL下载页面内所有链接
  60.     headers = {
  61.         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3775.400 QQBrowser/10.6.4208.400',
  62.         'Cookie': '_xmLog=xm_kecz048az1wpks; s&e=8dc4e1b92c46d738b6942a843f86a855; x_xmly_traffic=utm_source%253A%2526utm_medium%253A%2526utm_campaign%253A%2526utm_content%253A%2526utm_term%253A%2526utm_from%253A; Hm_lvt_4a7d8ec50cfd6af753c4f8aee3425070=1598542624; Hm_lpvt_4a7d8ec50cfd6af753c4f8aee3425070=1598543278; s&a=B%0F%08W%0BR%1DZL%0C[Y%0AXL[%1CQVWX%02CWM%01WY%0F[NVV%5CCRBT@OK^XYBXLS',
  63.         # 'Referer': 'https://www.ximalaya.com/gerenchengzhang/29391994/',
  64.         # 'Host': 'www.ximalaya.com'
  65.     }
  66.     data1 = Get_ID_Name(url, headers)
  67.     IDlinks = data1[1]
  68.     fileName = data1[0]
  69.     DownLoadM4A(Json_Get_links(IDlinks, headers), fileName)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-28 15:41:58 | 显示全部楼层
疾风怪盗 发表于 2020-8-28 00:21
这是吾爱破解上的一段源码,发帖人说改下cookie就能下载VIP,楼主可以参考下

下载时暂时还会出错,我等会有空在研究。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-28 15:47:06 | 显示全部楼层
miku520 发表于 2020-8-27 22:45
应该是格式问题吧
self.headers = {
            "user-agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) ...

按照你的方法添加cookies进去,下载vip音频还是失败的,不知道是不是我添加的喜马拉雅cookies方式不对,不知道喜马拉雅的cookies是要全部添加进去还是只要添加1&_token=后面的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-28 19:44:34 | 显示全部楼层
ChinaLee 发表于 2020-8-28 15:47
按照你的方法添加cookies进去,下载vip音频还是失败的,不知道是不是我添加的喜马拉雅cookies方式不对, ...

也有可能是楼上的 cookie 失效了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-28 19:49:28 | 显示全部楼层
liuzhengyuan 发表于 2020-8-28 19:44
也有可能是楼上的 cookie 失效了

自己的cookie,刚捉的,网站还登陆着,不知道是不是cookie填写的方式不对,是只要填1&_token=后面的还是全部都要,三种都试了好像还是不行。不知道怎么回事。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-28 19:53:59 | 显示全部楼层
ChinaLee 发表于 2020-8-28 19:49
自己的cookie,刚捉的,网站还登陆着,不知道是不是cookie填写的方式不对,是只要填1&_token=后面的还是全 ...


全都要,cookie 放 headers 里
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-6 11:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表