通过GitHub探索Python爬虫技术

1.检索爬取内容案例。

 2.找到最近更新的。(最新一般都可以直接运行)

 3.选择适合自己的项目,目前测试下面画红圈的是可行的。

4.方便大家查看就把代码粘贴出来了。

#图中画圈一代码
import requests
import os
import rewhile True:music_id = input("请输入歌曲id或歌曲链接: ")if music_id.startswith("http"):music_id = re.search(r"id=(\d+)", music_id).group(1)get_lyric = requests.get(url="https://music.163.com/api/song/lyric", params={"id": music_id, "lv": 1, "kv": 1, "tv": -1}).json()print(get_lyric)if get_lyric.get("lrc").get("lyric") == "":print("该歌曲没有歌词")else:if not os.path.exists("./OutLyric"):os.makedirs("./OutLyric")with open(f"./OutLyric/{music_id}.lrc", "w", encoding="utf-8") as save_lyric:if get_lyric.get("tlyric").get("lyric") == "":save_lyric.write(get_lyric.get("lrc").get("lyric"))else:zh_cn_lyric = re.sub(r'\[[^0-9]*:[^0-9.]*]\n', '', get_lyric.get("tlyric").get("lyric"))save_lyric.write(f'{get_lyric.get("lrc").get("lyric")}\n{zh_cn_lyric}')print(f"下载成功,可将该文件重命名至与歌曲相同的名字使用,lrc文件保存至./OutLyric/{music_id}.lrc")
#图中画圈2代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests as rq
from requests import exceptions
from bs4 import BeautifulSoup as BS
import os
import re
import csvSONG_NUM = 0def getMusic(ID, path, num):cloud = 'http://music.163.com/song/media/outer/url?id='kv = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'}try:url = cloud+ID+'.mp3'tmp = rq.get(url, headers=kv)tmp.raise_for_status()print(num+"、歌曲正在下载...")with open(path, 'wb') as f:f.write(tmp.content)f.close()print(num+"、歌曲下载成功!")except exceptions.HTTPError as e:print(e)except Exception as e:print(e)def getMusicText(ID, path, num):muTextUrl = 'http://music.163.com/api/song/lyric?id=' + ID + '&lv=1&kv=1&tv=-1'headers = {'Referer': 'https://music.163.com','Host': 'music.163.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'}try:res = rq.get(muTextUrl, headers=headers)res.raise_for_status()false = False  # 解决eval报错 name 'false' is not definedtrue = Truenull = Nonelrc_dict = eval(res.text)  # 转换为dict字典lrc_dict = lrc_dict['lrc']music_lyric = lrc_dict['lyric']print(num+"、歌词正在下载...")with open(path, 'w', encoding="utf-8") as f:f.write(music_lyric)f.close()print(num+"、歌词下载成功!")except exceptions.HTTPError as e:print(e)except Exception as e:print(e)def create_csv_head():headers = ['song_num', 'song_name', 'singer', 'song_duration']with open("./music/musicMsg.csv", "a", newline="", encoding="utf-8") as f:writer = csv.DictWriter(f, fieldnames=headers)head = {'song_num': '榜单序号', 'song_name': '歌曲名称','singer': '歌手', 'song_duration': '歌曲时长'}writer.writerow(head)def save_musicMsg(music_dict):headers = ['song_num', 'song_name', 'singer', 'song_duration']with open("./music/musicMsg.csv", "a", newline="", encoding="utf-8") as f:writer = csv.DictWriter(f, fieldnames=headers)writer.writerow(music_dict)def split_Msg(msg):msg = msg.split('"')item = msg[1]return itemdef getMusicMsg(ID):global SONG_NUMsong_url = 'https://music.163.com/song?id=' + IDheaders = {'Referer': 'https://music.163.com','Host': 'music.163.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'}try:s = rq.session()res = s.get(song_url, headers=headers)soup = BS(res.content, 'lxml')# 获取歌手singer = str(soup.find('meta', {'property': 'og:music:artist'}))singer = split_Msg(singer)# 获取歌曲名song_name = str(soup.find('meta', {'property': 'og:title'}))song_name = split_Msg(song_name)# 获取歌曲时长song_duration = str(soup.find('meta', {'property': 'music:duration'}))song_duration = split_Msg(song_duration)m, s = divmod(int(song_duration), 60)song_duration = ("%02d:%02d" % (m, s))music_dict = {'song_num': SONG_NUM,'song_name': song_name,'singer': singer,'song_duration': song_duration}save_musicMsg(music_dict)# 歌曲名中/\\替换为空if '/' in song_name or '\\' in song_name or ':' in song_name:song_name = song_name.replace('/', '')song_name = song_name.replace('\\', '')song_name = song_name.replace(':', '')# 歌手名中/\\替换为&if '/' in singer or '\\' in singer or ':' in singer:singer = singer.replace('/', '&')singer = singer.replace('\\', '&')singer = singer.replace(':', '')dirName = singer+'-'+song_nameprint(dirName)return dirNameexcept exceptions.HTTPError as e:print(e)except Exception as e:print(e)def getMusicList():headers = {'Referer': 'https://music.163.com','Host': 'music.163.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'}base_url = 'https://music.163.com/discover/toplist's = rq.session()url = base_urlresponse = s.get(url, headers=headers)soup = BS(response.content, "lxml")main = soup.find('ul', {'class': 'f-hide'})ls = main.find_all('a')songID_dic = {}  # key song_name ,value songIDprint('一共有'+str(len(ls))+'首歌')a = 1for music in ls:name = music.textID = str(music['href'].replace('/song?id=', ''))name = name+'_'+str(a)a += 1songID_dic[name] = IDprint("Name:{:30}\tID{:^10}".format(name, ID))print('一共有'+str(len(songID_dic))+'')return songID_dicdef main():global SONG_NUMsongID_dic = getMusicList()rootDir = 'music'if os.path.exists(rootDir):print(rootDir+"文件夹已存在")else:os.mkdir(rootDir)print("创建文件夹"+rootDir)create_csv_head()for item in songID_dic:item_clear = item.split('_')[0]SONG_NUM += 1dirName = getMusicMsg(songID_dic[item])if dirName[-2:-1] == '.':dirName = dirName.replace('.', '·')musicDir = './'+rootDir+'/' + dirNameif os.path.exists(musicDir):print(musicDir+"文件夹已存在")else:os.mkdir(musicDir)print("创建文件夹"+musicDir)if len(item_clear) > 75:item_clear = item_clear[:70]+'···'elif '.' in item_clear:item_clear = item_clear.replace('.', '·')print(item_clear, end="    \n")mp3_path = musicDir+'/'+item_clear+'.mp3'm4a_path = musicDir+'/'+item_clear+'.m4a'lyric_path = musicDir+'/'+item_clear+'.txt'num = str(SONG_NUM)print('='*50)getMusic(songID_dic[item], mp3_path, num)getMusic(songID_dic[item], m4a_path, num)print('*'*50)getMusicText(songID_dic[item], lyric_path, num)print('='*50)if __name__ == '__main__':main()# getMusicList()# getMusicText("1994955842", "path")# getMusicMsg("1998931166")

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/269518.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openGauss学习笔记-236 openGauss性能调优-SQL调优-Query执行流程

文章目录 openGauss学习笔记-236 openGauss性能调优-SQL调优-Query执行流程236.1 Query执行流程236.1.1 调优手段之统计信息236.1.2 调优手段之GUC参数236.1.3 调优手段之底层存储236.1.4 调优手段之SQL重写 openGauss学习笔记-236 openGauss性能调优-SQL调优-Query执行流程 S…

Java 解决异步 @Async 失效问题

1.问题描述 使用Async进行异步处理时,异步没有生效 2.原因分析 经过排查后发现是因为使用Async的方法没有跨2个Service导致的 错误示例 控制器接口 > 直接调用 custAdminService.importCBuy() 3.解决方案 Controller接口不变,多添加一层Service&a…

【python开发】网络编程(上)

这里写目录标题 一、必备基础(一)网络架构1、交换机2、路由器3、三层交换机4、小型企业基础网络架构5、家庭网络架构6、互联网 (二)网络核心词汇1、子网掩码和IP2、DHCP3、内网和公网IP4、云服务器5、端口6、域名 二、网络编程案例…

大数据分析课----实时更新

1:Anaconda3 windows 安装 : 去官网下载; 然后安装好直接点next 点 i agree; 自己的电脑选第一个;学校的话选All Users ; 选择自己存放的目录; 选前三个; 安装即可; 一直…

UE4 Niagara 关卡3.4官方案例解析

Texture sampling is only supported on the GPU at the moment.(纹理采样目前仅在GPU上受支持) 效果:textures can be referenced within GPU particle systems。this demo maps a texture to a grid of particles(纹理可以在GPU粒子系统中被引用这个演…

牛客网C++专项题目整理(1)

1. 若有定义语句:char s[3][10],(*k)[3],*p;则以下赋值语句错误的是 1.p s; 2.p k; 3.p s[0]; 4.k s; 答案:124 char s[3][10] s 是数组指针,类型为char (*)[3],所指向的每个数组长度为10; char (*k)[3] k是一个数组指针&a…

【C++庖丁解牛】初始化列表 | Static对象 | 友元函数

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 1. 再谈构造函数1.1 …

小程序常用样式和组件

常用样式和组件 1. 组件和样式介绍 在开 Web 网站的时候: 页面的结构由 HTML 进行编写,例如:经常会用到 div、p、 span、img、a 等标签 页面的样式由 CSS 进行编写,例如:经常会采用 .class 、#id 、element 等选择器…

【计算机网络】TCP 如何实现可靠传输

TCP通过三次握手建立连接,四次挥手释放连接,确保连接建立和连接释放的可靠。 序列号、检验和、确认应答信号、重发机制、连接管理、窗口控制、流量控制、拥塞控制 标准回答 可靠传输就是通过TCP连接传送的数据是没有差错、不会丢失、不重复并且按序到达的…

React之数据绑定以及表单处理

一、表单元素 像<input>、<textarea>、<option>这样的表单元素不同于其他元素&#xff0c;因为他们可以通过用户交互发生变化。这些元素提供的界面使响应用户交互的表单数据处理更加容易 交互属性&#xff0c;用户对一下元素交互时通过onChange回调函数来监听…

【李沐论文精读】GAN精读

论文&#xff1a;Generative adversarial nets 参考&#xff1a;GAN论文逐段精读、生成对抗网络、李沐视频精读系列 一、介绍 什么是GAN? GAN(Generative adversarial network&#xff0c;生成对抗网络&#xff09;&#xff0c;它由生成器G&#xff08;Generator Neural Netwo…

持安科技孙维伯:零信任在攻防演练下的最佳实践|DISCConf 2023

近日&#xff0c;在2023数字身份安全技术大会上&#xff0c;持安科技联合创始人孙维伯应主办方的特别邀请&#xff0c;发表了主题为“零信任在攻防演练下的最佳实践”的演讲。 孙维伯在2023数字身份安全技术大会上发表演讲 以下为本次演讲实录&#xff1a; 我是持安科技的联合…

二百二十六、Linux——shell脚本查看今天日期、昨天日期、30天前日期、1月前日期

一、目的 由于磁盘资源有限&#xff0c;因为对原始数据的保存有事件限制&#xff0c;因为对于超过一定期限的数据文件则需要删除&#xff0c;要实现定期删除则第一步就是查看日期时间 二、在Linux中创建shell脚本 #! /bin/bash source /etc/profile nowdatedate --date0 da…

计算机系统缺少cv100.dll文件解决方法(最新)

cv100.dll 是一个Windows操作系统中的动态链接库&#xff08;DLL&#xff09;文件。DLL文件是包含可由多个程序共享的代码和数据的模块&#xff0c;以减少磁盘空间占用并提高系统性能。根据收集到的信息&#xff0c;cv100.dll 文件可能与图像处理、计算机视觉相关的功能有关。 …

iOS中卡顿产生的主要原因及优化思路

卡顿本质上是一个UI体验上的问题&#xff0c;而UI的渲染及显示&#xff0c;主要涉及CPU和GPU两个层面。若 CPUGPU渲染耗时超过16.7ms&#xff0c;就会在屏幕vsync信号到来时无法更新屏幕内容&#xff0c;进而导致卡顿。 iOS中UI渲染主要包含Layout->Display->Prepare->…

Sora到底有多强?

北京时间2月16日凌晨&#xff0c;OpenAI发布文本生成视频的AI模型Sora&#xff0c;瞬时刷屏科技圈&#xff0c;成为2024年开年“顶流”。 官方称&#xff0c;Sora只需文本就能自动生成高度逼真和高质量的视频&#xff0c;且时长突破1分钟。这是继文本模型ChatGPT和图片模型Dal…

C 数据类型

在 C 语言中&#xff0c;数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间&#xff0c;以及如何解释存储的位模式。 C 中的类型可分为以下几种&#xff1a; 序号类型与描述1基本数据类型 它们是算术类型&#xff0c;包括整型…

Gitlab 安装部署

目录 1、Jenkins 结合 Gitlab 构建 CI/CD 环境 CI/CD 介绍 CI/CD 流程 Jenkins 简介 GitLab 简介 项目部署方式 CI系统的工作流程 2、搭建 GitLab 安装 GitLab 配置 GitLab 修改root密码 访问 GitLab 开机自启 3、使用 GitLab 管理 GitLab 关闭 GitLab 注册功能…

我的NPI项目之Android 安全系列 -- Keymaster到底是个什么

最近因为一直在调研独立secure element集成的工作&#xff0c;不巧的是目前使用的高通平台只有NFC-eSE的方案。高通目前也并不支持独立的eSE集成&#xff0c;codebase中并无相对应的代码。举个例子&#xff0c;目前使用的STM的一款eSE&#xff0c;但是这款eSE的开发STM还没有完…

【MySQL】数据库中常用的函数

目录 聚合函数COUNT()函数的多种用法COUNT(*)COUNT(主键)COUNT(1)COUNT(常量)COUNT(非主键)COUNT(distinct(字段)) COUNT()函数小结 字符函数length(str)函数&#xff1a;获取参数值的字节个数concat(str1,str2,...)函数&#xff1a;字符串拼接upper(str)、lower(str)函数:大小…