PyCharm下python爬虫准备

打开pycharm

点击设置

点击项目解释器,再点击右边+号

搜索相关库并添加,例如:requests

喜马拉雅全网递归下载

打开谷歌/火狐浏览器,按F12打开开发者工具—>选择【网络】

编辑器浏览器输入: https://www.ximalaya.com/yinyue/  点击【摇滚】

发现弹出新的URL:https://www.ximalaya.com/yinyue/yaogun/    [汉字转换拼音后的URL访问]

点击进入任意一个专辑[未播放]

点击播放音乐[播放中]

[是一个json格式的URL]访问搜索界面的源代码,查找albumId,通过这些albumid获取音频文件的url

https://www.ximalaya.com/revision/play/album?albumId=16372952&pageNum=1&sort=-1&pageSize=30

最后使用函数urllib.request.urlretrieve()下载音乐即可

附源码:

import re
import os
import json
import requests
import urllib
from urllib import request
from pypinyin import lazy_pinyin class XimaLaya(object):
# 模拟浏览器操作
def __init__(self):
self.header = {
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0'
} # 第一步: 根据输入的汉字转换为拼音
def han_pinyin(self, hanzi):
pin = lazy_pinyin(hanzi) # 汉转拼音
pin = "".join(pin) # 去除空格
return pin # 返回拼音 # 第二步: 根据REST格式去访问喜马拉雅,获取页面的HTML
def getHtml(self, pinyin):
url = 'https://www.ximalaya.com/yinyue/' + pinyin
print("访问的网站是: " + url)
html = requests.get(url, headers=self.header)
# apparent_encoding通过调用chardet.detect()来识别文本编码,有些消耗计算资源
html.encoding = html.apparent_encoding
# html.encoding = 'utf8' --> 直接改为UTF8也行
with open('D:\XiMaLaya\html\\' + str(pinyin + '.html'), 'a', encoding='utf-8') as f:
f.write(html.text)
return html # 第三步:根据页面的内容获取对应歌单的albumId的值
def getAlbumId(self, html):
albumIdAll = re.findall(r'"albumId":(.*)', (html).text) # 利用正则进行匹配,获取专辑ID
print("专辑信息", albumIdAll)
with open('D:\XiMaLaya\\albumIdAll\\' + str('albumIdAll.txt'), 'a', encoding='utf-8') as f:
for x in albumIdAll:
f.write(str(x))
myList = []
url3 = []
for i in (albumIdAll[:1]):
# 获取对应专辑ID的首页
url2 = 'https://www.ximalaya.com/revision/play/album?albumId=' + i
print(url2)
# 进入对应专辑ID的首页信息
html2 = requests.get(url2.split(',')[0], headers=self.header)
# 含有下载URL的集合
# src "http://audio.xmcdn.com/group12/M03/2C/AA/wKgDW1WJ7GqxuItqAB8e1LXvuds895.m4a"
url3 = (re.findall(r'"src":"(.*?)"', (html2).text))
# 记录信息用的
myList.append('获取对应专辑ID的首页\r\n' + url2 + '\n---------------------------------------')
myList.append('含有下载URL的集合\r\n' + html2.text + '\n---------------------------------------')
myList.append('下载专辑的URL集合\r\n' + str(url3) + '\n---------------------------------------')
with open('D:\XiMaLaya\\albumIdAll\\' + str('hhh.txt'), 'a', encoding='utf-8') as f:
f.write(json.dumps(myList))
print('done')
return url3 # 下载专辑的URL集合 # 第四步: 获取专辑名
def getTitle(self, html):
t = re.findall(r'"title":"(.*?)"', (html).text) # 获取titile(歌名)的值
with open('D:\XiMaLaya\\albumIdAll\\' + str('albumId_Name.txt'), 'a', encoding='utf-8') as f:
f.write(str(t))
return t # 第五步: 下载歌曲
def downLoad(self, url, title):
n = 0
for i in url:
try:
urllib.request.urlretrieve(i, 'D:\XiMaLaya\\'+str(title[n]+'.m4a'))
print(str(title[n]), '...【下载成功】')
n = n + 1
except:
print(str(title[n]) + "...【下载失败】") if __name__ == '__main__': fm = XimaLaya()
# 输入需要下载的歌曲类型
str1 = fm.han_pinyin("摇滚")
# 获取对应歌曲类型的首页信息
html = fm.getHtml(str1)
# 获取歌曲类型的首页里面的专辑名称
title = fm.getTitle(html)
# 获取歌曲类型的首页里面的专辑ID
url3 = fm.getAlbumId(html)
# 下载对应曲目
fm.downLoad(url3, title)

喜马拉雅单一专辑的下载

打开谷歌/火狐浏览器,按F12打开开发者工具—>选择【网络】

编辑器浏览器输入: https://www.ximalaya.com/yinyue/12521114/

点击计入音乐[未播放前]

点击进入音乐[播放中]

[是一个json格式的URL]访问搜索界面的源代码,查找albumId,通过这些albumid获取音频文件的url

https://www.ximalaya.com/revision/play/album?albumId=12521114&pageNum=1&sort=-1&pageSize=30

最后使用函数urllib.request.urlretrieve()下载音乐即可

附源码:

import re
import json
import requests
import urllib
from urllib import request class XimaLaya(object):
# 模拟浏览器操作
def __init__(self):
self.header = {
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0'
} # 第一步:根据REST格式去访问喜马拉雅,获取页面的HTML
def getHtml(self, pinyin):
url = 'https://www.ximalaya.com/yinyue/' + pinyin
print("访问的网站是: " + url)
html = requests.get(url, headers=self.header)
# apparent_encoding通过调用chardet.detect()来识别文本编码,有些消耗计算资源
html.encoding = html.apparent_encoding
# html.encoding = 'utf8' --> 直接改为UTF8也行
print(html)
return html # 第二步:根据页面的内容获取对应歌单的albumId的值
def getAlbumId(self, html):
albumIdAll = re.findall(r'"albumId":(.*)', (html).text) # 利用正则进行匹配,获取专辑ID
print("专辑信息", albumIdAll)
with open('D:\XiMaLaya\\albumIdAll\\' + str('albumIdAll.txt'), 'a', encoding='utf-8') as f:
for x in albumIdAll:
f.write(str(x))
myList = []
url3 = []
for i in (albumIdAll[:1]):
# 获取对应专辑ID的首页
url2 = 'https://www.ximalaya.com/revision/play/album?albumId=' + i
print(url2)
# 进入对应专辑ID的首页信息
html2 = requests.get(url2.split(',')[0], headers=self.header)
# 含有下载URL的集合
# src "http://audio.xmcdn.com/group12/M03/2C/AA/wKgDW1WJ7GqxuItqAB8e1LXvuds895.m4a"
url3 = (re.findall(r'"src":"(.*?)"', (html2).text))
# 记录信息用的
myList.append('获取对应专辑ID的首页\r\n' + url2 + '\n---------------------------------------')
myList.append('含有下载URL的集合\r\n' + html2.text + '\n---------------------------------------')
myList.append('下载专辑的URL集合\r\n' + str(url3) + '\n---------------------------------------')
with open('D:\XiMaLaya\\albumIdAll\\' + str('hhh.txt'), 'a', encoding='utf-8') as f:
f.write(json.dumps(myList))
print('done')
return url3 # 下载专辑的URL集合 # 第三步: 获取专辑名
def getTitle(self, html):
t = re.findall(r'"title":"(.*?)"', (html).text) # 获取titile(歌名)的值
with open('D:\XiMaLaya\\albumIdAll\\' + str('albumId_Name.txt'), 'a', encoding='utf-8') as f:
f.write(str(t))
return t # 第四步: 下载歌曲
def downLoad(self, url, title):
n = 0
for i in url:
try:
urllib.request.urlretrieve(i, 'D:\XiMaLaya\\'+str(title[n]+'.m4a'))
print(str(title[n]), '...【下载成功】')
n = n + 1
except:
print(str(title[n]) + "...【下载失败】") if __name__ == '__main__': fm = XimaLaya()
# 输入需要下载的歌曲URL
str1 = "yinyue/12521114/"
# 获取对应歌曲类型的首页信息
html = fm.getHtml(str1)
# 获取歌曲类型的首页里面的专辑名称
title = fm.getTitle(html)
# 获取歌曲类型的首页里面的专辑ID
url3 = fm.getAlbumId(html)
# 下载对应曲目
fm.downLoad(url3, title)

Python实例---爬取下载喜马拉雅音频文件的更多相关文章

  1. Python疫情爬取输出到txt文件

    在网上搬了一个代码,现在不适用了,改了改 import requestsimport jsondef Down_data(): url = 'https://view.inews.qq.com/g2/ ...

  2. Python爬虫|爬取喜马拉雅音频

    "GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...

  3. Python Scrapy 爬取煎蛋网妹子图实例(一)

    前面介绍了爬虫框架的一个实例,那个比较简单,这里在介绍一个实例 爬取 煎蛋网 妹子图,遗憾的是 上周煎蛋网还有妹子图了,但是这周妹子图变成了 随手拍, 不过没关系,我们爬图的目的是为了加强实战应用,管 ...

  4. python连续爬取多个网页的图片分别保存到不同的文件夹

      python连续爬取多个网页的图片分别保存到不同的文件夹 作者:vpoet mail:vpoet_sir@163.com #coding:utf-8 import urllib import ur ...

  5. Python爬虫 - 爬取百度html代码前200行

    Python爬虫 - 爬取百度html代码前200行 - 改进版,  增加了对字符串的.strip()处理 源代码如下: # 改进版, 增加了 .strip()方法的使用 # coding=utf-8 ...

  6. Python+Selenium爬取动态加载页面(1)

    注: 最近有一小任务,需要收集水质和水雨信息,找了两个网站:国家地表水水质自动监测实时数据发布系统和全国水雨情网.由于这两个网站的数据都是动态加载出来的,所以我用了Selenium来完成我的数据获取. ...

  7. 使用Python爬虫爬取网络美女图片

    代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...

  8. Python爬虫爬取全书网小说,程序源码+程序详细分析

    Python爬虫爬取全书网小说教程 第一步:打开谷歌浏览器,搜索全书网,然后再点击你想下载的小说,进入图一页面后点击F12选择Network,如果没有内容按F5刷新一下 点击Network之后出现如下 ...

  9. Scrapy教程——搭建环境、创建项目、爬取内容、保存文件

    1.创建项目 在开始爬取之前,您必须创建一个新的Scrapy项目.进入您打算存储代码的目录中,运行新建命令. 例如,我需要在D:\00Coding\Python\scrapy目录下存放该项目,打开命令 ...

随机推荐

  1. java web项目答辩答辩题总结(书本网上语言答辩+自己的语言答辩)

    答辩每个人的总分为1.5分.每个人主要问3个问题. 开发流程===>系统架构====>项目模块+功能===>项目得失重定向与转发:?九个隐式对象?get与post的区辨:?jsp有静 ...

  2. Checkpoints(第十一届河南省省赛真题)

    题目描述 As a landlocked country in central and southern Africa , the political situation has been relat ...

  3. HDU 1576 A/B(欧几里德算法延伸)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1576 题目: Problem Description 要求(A/B)%9973,但由于A很大,我们只 ...

  4. 数据存储之第三方FMDB

    上周四.周五在忙公司的事情和炒股,没来得及更新博客,这周就补一下,学习总结下FMDB. FMDB是对sqlite的封装,特别是在多线程情况下,使用sqlite是非常麻烦,而使用FMDB相对简单,下面是 ...

  5. 易错java知识点总结(持续更新)

    1. 2.java转义字符的理解 参考知乎大神:http://www.zhihu.com/question/29232624 正向和逆向处理转义字符 正向:把两个字符 \ n 识别为一个转义字符 ne ...

  6. C# Azure-让http自动跳转到https链接

    在项目的web.config下面加上下面的配置: <rewrite> <rules> <clear /> <rule name="Redirect ...

  7. 百度地图API,根据经纬度实现车辆移动轨迹绘制

    百度地图,实现车辆轨迹绘制 实现思路: 1.根据经纬度实现车辆轨迹绘制 2.使用百度地图API的两个覆盖物实现,Polyline(折线)绘制轨迹,Marker(图标)绘制小车图标 3.将每两个坐标间连 ...

  8. ubuntu 上安装ssh

    1. 执行 sudo apt-get update 2. 安装 sudo apt-get install openssh-server 3.查看ssh服务状态 sudo service ssh sta ...

  9. 转载--Json转换

    JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.XML也是一种数据交换格式,为什么没 ...

  10. 多线程系列(1)多线程基础和Thread

    因为现项目中有用到多线程和并发的知识,所以打算近期补习一下多线程相关的内容.第一篇文章从最基础的开始,就是如何开启一个线程,如何启动线程和阻塞线程等,这篇文章分以下几点进行总结. 多线程初印象 多线程 ...