首页
关于
留言板
友链
壁纸
Search
1
使用Git上传文件到GitHub
48 阅读
2
高等数学-同济五版.pdf 电子书
32 阅读
3
年纪轻轻,不学高数怎么行?
28 阅读
4
Fiddler Everywhere的使用
26 阅读
5
Python Flask入门
24 阅读
Web前端
JavaScript
Python
Flask框架
爬虫项目
Selenium自动化
生活
其他
登录
Search
标签搜索
python爬虫
Flask
Python
生活
其他
技能
内置模块
SEO
Git
Redballoon
累计撰写
37
篇文章
累计收到
7
条评论
首页
栏目
Web前端
JavaScript
Python
Flask框架
爬虫项目
Selenium自动化
生活
其他
页面
关于
留言板
友链
壁纸
搜索到
37
篇与
redballoon
的结果
2023-03-19
爬取酷狗音乐周杰伦的专辑
简介看到别人写的爬虫采集mm图,有那么多人给币,本菜鸡也想写点东西分享一下,就想下载些音乐,经过长时间的分析,终于完成了。开发环境python3.8解释器Pycharm 编辑器所使用模块import requestsimport reimport jsonimport loggingfrom os import makedirsfrom os.path import exists抓取的页面代码实现import requests import re import json import logging from os import makedirs from os.path import exists logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(filename)s:%(lineno)s >>> %(message)s', datefmt='%Y-%m-%d %H:%M:%S',) BASE_URL = 'https://www.kugou.com' def save_data(data, path, name): exists(path) or makedirs(path) data_path = f'{path}/{name}.mp3' print(data_path) with open(data_path, 'wb')as f: f.write(data) def get_page(url): headers = { 'cookie': '自己填', 'referer': 'https://www.kugou.com/', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36', } try: response = requests.get(url, headers=headers) if response.status_code == 200: # print(response.text) return response.text logging.error('在地址为: %s 时遇到错误的状态码', response.status_code, url) except requests.RequestException: logging.error('抓取此链接发生错误 %s', url, exc_info=True) # 通过解析页面数据获取音频的api接口链接,再请求接口链接得到mp3链接 def parse_data(html): pattern = re.compile(r'var data=(.*);') data = re.findall(pattern, html)[0] dit_data = json.loads(data) play_urls = [] audio_names = [] album_names = [] for info in dit_data: album_name = info['album_name'] author_name = info['author_name'] audio_name = info['audio_name'] encode_album_audio_id = info['encode_album_audio_id'] audio_detail_url = f'https://wwwapi.kugou.com/yy/index.php?r=play/getdata&dfid=1txkVX3n2MQE49Pvux0mAsuT&appid=1014&mid=b2d248b4902c623a204e0410004e70d0&platid=4&encode_album_audio_id={encode_album_audio_id}' logging.info('处理接口链接为: %s', audio_detail_url) audio_name = f'{author_name}-{audio_name}' # 通过请求音乐接口链接再解析得到MP3播放地址 audio_info_html = get_page(audio_detail_url) detail_data = json.loads(audio_info_html) play_url = detail_data['data']['play_url'] play_urls.append(play_url) audio_names.append(audio_name) album_names.append(album_name) datas = play_urls, audio_names, album_names yield datas def download(data): for play_url, audio_name, name in data: audio_content = requests.get(play_url).content save_data(audio_content, name, audio_name) logging.info('正在保存--> %s', audio_name) def main(): url = 'https://www.kugou.com/album/info/yhaz39/' html_data = get_page(url) data = parse_data(html_data) # 生成器对象 logging.info('获得包含mp3,歌名,专辑名的生成器对象 >>> %s', data) for i in data: mp3_info_data = list(zip(i[0], i[1], i[2])) download(mp3_info_data) if __name__ == '__main__': main()执行结果:大家可以去试试哦,白嫖的,不要白不要。
2023年03月19日
13 阅读
0 评论
0 点赞
2023-03-18
纯净版 - python基础模块之logging模块的学习笔记
logging模块的使用这个模块为应用与库实现了灵活的事件日志系统的函数与类。使用标准库提供的 logging API 最主要的好处是,所有的 Python 模块都可能参与日志输出,包括你自己的日志消息和第三方模块的日志消息。导入模块import logging不需要下载,是python的内置模块。简单使用简单使用可以代替print函数来进行代码的调试。据说日志输出要比print输出要快一些,而且还是线程安全的(即在使用多线程或线程池时输出的结果是有序的)。logging.debug('调试中...') logging.info('输出的信息...') logging.warning('warning!') logging.error('出现错误!') logging.critical('严重错误!')运行结果:只输出了三条信息,这是因为日志是有一个级别的,而默认是warning级别,而比warning级别低的语句就不会输出。可以自己设置日志级别,来输出全部的日志结果。logging.basicConfig(level=logging.DEBUG) 日志级别(由高到低)CRITICAL = 50 ERROR = 40 WARNING = 30 INFO = 20 DEBUG = 10 NOTSET = 0需要使用 Logging 的原因各有不同。这些原因可以根据严重性的不同分为如下几类。默认的级别时WARNING,意味默认的级别下,显示的日志信息必须时 >= WARNING的级别才会进行输出。日志的记录可以由不同的方式,最简单的是把日志直接输出到console,另外一种就是可以把他们写到文件。将日志输出到文件中# 输出到日志文件中 logging.basicConfig(level=logging.INFO, filename='log.txt', filemode='w') # 默认filemode 是追加写入的方式 logging.debug('调试中...') logging.info('输出的信息...') logging.warning('warning!') logging.error('出现错误!') logging.critical('严重错误!')运行结果:有没有发现输出到文件中是不是少了debug的信息😃,细心的朋友肯定能知道是因为设置的日志级别是info, debug级别比info低自然不会输出啦。来继续学习,仅仅这样可不够😁将日志输出到控制台废话,不加filename不就好啦。🙄日志输出格式美化# 美化日志输出 logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(lineno)s >>> %(message)s', # %()s 是固定格式 datefmt='%Y-%m-%d %H:%M:%S') logging.info('这是一条正常信息') logging.warning('这是一条警告信息') logging.error('这是一条错误信息') logging.critical('这是一条致命的错误信息')运行结果:更多的format参数:高级应用在官方文档中有4个重要的对象,分别是logger(记录器)、handler(处理器)、filter(过滤器)、formatter(格式器)。记录器对象提供应用程序代码能直接使用的接口处理器对象将记录器产生的日志发送到目的地(控制台或文件)过滤器对象提供更好的粒度控制,决定哪些日志会被输出格式化器对象设置日志内容的组成结构和消息字段# logger记录器 ''' 1. 提供应用程序的调用接口 logger = logging.getLogger(__name__) 默认是root, 也可以自定义其他 2. 决定日志记录的级别 logger.setLevel() 3. 将日志内容传递到相关联的handler中 logger.addHandler() 和 logger.removeHandler() ''' # handler处理器 ''' # 最常用的两个 StreamHandler 和 FileHandler # 所有的Handler处理器都可以使用 setFormatter() 来设置当前Handler对象的消息格式 ''' # formatter格式器 ''' ft = logging.Formatter(fmt=None, datefmt=None, style='%') style参数默认为%, 这表示 %(<dictionary key>)s 格式的字符串 '''需求:我们即想在控制台输出日志,也想在文件中输出日志时,高级的做法# 记录器 logger = logging.getLogger('redballoon') logger.setLevel(level=logging.INFO) # print(logger) # 处理器 # 定义StreamHandler输出到控制台 console_handler = logging.StreamHandler() #定义FileHandler输出到日志文件 file_handler = logging.FileHandler(filename='2023-3-18-log.txt') console_handler.setLevel(level=logging.DEBUG) # 如果没有给handler设置日志级别,将使用logger的日志级别 # file_handler.setLevel(level=logging.INFO) # * 若是设置了logger记录器的日志级别,又设置了console_handler的日志级别,则会以logger的级别为准。 # 格式化器 fmt = logging.Formatter('%(asctime)s %(levelname)s %(filename)s:%(lineno)s >>> %(message)s') # 给处理器添加格式 console_handler.setFormatter(fmt) file_handler.setFormatter(fmt) # 给记录器添加处理器 logger.addHandler(console_handler) logger.addHandler(file_handler) logger.debug('这是调试的信息') logger.info('这是一条正常信息') logger.warning('这是一条警告信息') logger.error('这是一条错误信息') logger.critical('这是一条致命的错误信息')控制台运行结果:日志文件结果:哎,有问题呀,我想要的是控制台输出dubug的级别,日志文件输出info的级别。现在这咋都一样啊。1.这是因为我前面说过,如果同时设置了console_handler的级别和logger的日志级别,则会以logger的级别为准。2.而如果不设置logger的日志级别,则会是默认的warning级别。想要解决,就设置logger的日志级别为最低的debug级别,再分别设置console_handler 和 file_handler的日志级别就好啦。修改后代码如下:# 记录器 logger = logging.getLogger('redballoon') logger.setLevel(level=logging.DEBUG) # 处理器 console_handler = logging.StreamHandler() file_handler = logging.FileHandler(filename='2023-3-18-log.txt') console_handler.setLevel(level=logging.DEBUG) # 如果没有给handler设置日志级别,将使用logger的日志级别 file_handler.setLevel(level=logging.INFO) # * 若是设置了logger记录器的日志级别,又设置了console_handler的日志级别,则会以logger的级别为准。 # 格式化器 fmt = logging.Formatter('%(asctime)s %(levelname)s %(filename)s:%(lineno)s >>> %(message)s') # 给处理器添加格式 console_handler.setFormatter(fmt) file_handler.setFormatter(fmt) # 给记录器添加处理器 logger.addHandler(console_handler) logger.addHandler(file_handler) logger.debug('这是调试的信息') logger.info('这是一条正常信息') logger.warning('这是一条警告信息') logger.error('这是一条错误信息') logger.critical('这是一条致命的错误信息')过滤器的使用Filters 可被 Handlers 和 Loggers 用来实现比按层级提供更复杂的过滤操作。使用场景,在有多个记录器时,如果想指定输出某一个的信息可使用过滤器。通过记录器名称来设置过滤器,满足我们设置的名称便会被输出# 记录器 logger1 = logging.getLogger('redballoon') logger2 = logging.getLogger('blueballoon') logger1.setLevel(level=logging.DEBUG) # logger2.setLevel(level=logging.DEBUG) 不设置让他为默认级别 # 处理器 console_handler = logging.StreamHandler() console_handler.setLevel(level=logging.DEBUG) # 过滤器 满足过滤器设置的记录器名称便会被输出 # 定义一个过滤器 flt = logging.Filter('blueballoon') # 关联过滤器 console_handler.addFilter(flt) # 格式化器 fmt = logging.Formatter('%(name)-12s | %(asctime)s %(levelname)s %(filename)s:%(lineno)s >>> %(message)s', datefmt='%Y-%m-%d %H:%M:%S',) # 给处理器添加格式 console_handler.setFormatter(fmt) # 给记录器添加处理器 logger1.addHandler(console_handler) logger2.addHandler(console_handler) logger1.debug('这是调试的信息') logger1.info('这是一条正常信息') logger1.warning('这是一条警告信息') logger1.error('这是一条错误信息') logger1.critical('这是一条致命的错误信息') print('=========================================') logger2.debug('这是调试的信息') logger2.info('这是一条正常信息') logger2.warning('这是一条警告信息') logger2.error('这是一条错误信息') logger2.critical('这是一条致命的错误信息')运行结果:可以看到只输出了记录器为 blueballoon 的日志信息。以上就是本菜鸟的学习笔记和理解,希望对你们有用。
2023年03月18日
18 阅读
0 评论
0 点赞
2023-03-17
纯净版 - python基础模块之OS模块的学习笔记
OS 模块的使用导入模块import os # 避免使用的方法 from os import * 因为这会与内置函数open() 起冲突,从而引起意料之外的结果。os模块的常用操作1.获取当前工作的路径print(os.getcwd()) # out: D:\pythonProjects\pythonBasic\os模块2.指定路径为当前工作路径os.chdir('D:/pythonProjects') print(os.getcwd()) # out: D:\pythonProjects3.创建一个新的文件夹,不能创建多层级的文件夹(目录)# 当文件已存在时,无法创建该文件。 os.mkdir('test1')4.创建多层级文件夹(目录)os.makedirs('cdd/dd')5.删除空文件夹# 删除空文件夹 如果文件夹不是空的就会报错:目录不是空的。 os.rmdir('test')6.递归删除目录# 工作方式类似于 rmdir(),不同之处在于,如果成功删除了末尾一级目录,removedirs() 会尝试依次删除 path 中提到的每个父目录,直到抛出错误为止(但该错误会被忽略,因为这通常表示父目录不是空目录) os.removedirs(os.path.join('cdd', 'dd'))7.删除文件os.remove('dd.txt')8.文件或路径(文件夹)重命名和移动文件夹os.rename(src, dst) # src 原路径,dst修改后的命名 # 只能重命名原路径src 最后的路径或文件的名字,中间路径都必须要存在,否则就会抛出FileNotFoundError # os.rename('test.txt', 'demo.txt') # 重命名 # os.rename(os.path.join('test', 'test.txt'), 'test.txt') # 移动os.path模块os.path中的函数基本上是纯粹的字符串操作。换句话说,传入该模块函数的参数甚至不需要是一个有效路径,该模块也不会试图访问这个路径,而仅仅是按照“路径”的通用格式对字符串进行处理9.返回路径 path 的绝对路径print(os.path.abspath('demo.txt')) # out: D:\pythonProjects\pythonBasic\os模块\demo.txt10.判断该路径或文件是否存在 (Bool)print(os.path.exists('demo.txt')) # out: True11.获取文件的最近访问时间# os.path.getatime(path) 返回 path 所指文件的最近访问时间(浮点型秒数)即time时间戳 print(os.path.getatime('demo.txt')) # out: 1678982202.702731 t = os.path.getatime('demo.txt') sys_time = time.localtime(t) formatter_time = time.strftime('%Y-%m-%d %H:%M:%S', sys_time) print(formatter_time) # out: 2023-03-17 16:04:1212.获取文件的创建时间# os.path.getctime(path) 在windos下获取文件的创建时间,在Unix返回的是最后的修改时间 print(os.path.getctime('demo.txt')) # out: 1678981495.357391 t = os.path.getctime('demo.txt') tupTime = time.localtime(t) # 将时间戳转换成本地时间 format_time = time.strftime("%Y-%m-%d %H:%M:%S", tupTime) # 转换成对应的时间格式 print(format_time) # out: 2023-03-16 23:44:5513.获取文件的大小# os.path.getsize(path) 获取文件的大小 print(os.path.getsize('demo.txt')) # out: 127 (字节)14.os.path.split(path) 把路径分割成 dirname 和 basename,返回一个元组print(os.path.split(os.path.join('test', 'test.txt'))) # out: ('test', 'test.txt') print(os.path.split('test/test2/demo3.txt')) # out: ('test/test2', 'demo3.txt')15.判断路径是否为文件 返回布尔值# os.path.isfile() 判断路径是否为文件 返回布尔值 print(os.path.isfile('demo.txt')) # out: True16.判断路径是否为目录 返回布尔值# os.path.isdir() 判断路径是否为目录 返回布尔值 print(os.path.isdir('test')) # out: True17.把目录和文件名合成一个路径 join# os.path.join(path1[, path2[, ...]]) 将传入的路径进行拼接 print(os.path.join('test', 'test2', 'xxx.txt')) # out: test\test2\xxx.txt18.递归查找目录下所有的文件夹和文件# os.path.walk(path, visit, arg) 会递归的寻找路径下所有子文件夹和文件 print(os.walk('test')) # out: <generator object walk at 0x0000028FB505EC10> 返回的是一个生成器 (dirpath, dirnames, filenames) # 这里设置个目录树 ''' |--test |--test2 |--demo3.txt |--demo2.txt ''' for path, dirname, filename in os.walk(r'D:\pythonProjects\pythonBasic\os模块\test'): print(path, dirname, filename) # out: D:\pythonProjects\pythonBasic\os模块\test ['test2'] ['demo2.txt'] '''这里第一个返回结果就像在当前目录下(D:\pythonProjects\pythonBasic\os模块\test)点开之后看到的所有文件夹和文件''' # out: D:\pythonProjects\pythonBasic\os模块\test\test2 [] ['demo3.txt'] '''第二结果就像是继续点开文件夹看看还有没有文件夹和文件,有文件夹就继续往下点开'''
2023年03月17日
14 阅读
0 评论
0 点赞
2023-02-19
利用python批量修改文件名、文件后缀、删除指定文件
简介利用python os模块编写脚本批量处理文件重命名,两种方法任君选择。通过指定文件后缀也可以批量删除文件。编程环境Python 3.8版本Python的标准库os在Windows操作系统上进行实现,并使用pyCharm作为代码编辑器。实现思路获取指定目录下的所有文件,可以通过walk方法将目录下所有文件夹和文件获取到再使用os.path.join方法进行路径拼接出旧文件路径设置一个用于查找的关键字关键词和一个用于修改的关键词,并判断查找词是否在旧文件路径中如果在则设置新文件路径并使用replace(oldkey, newkey) 替换原来文件名实现重命名最后用os.rename(old_file_path, new_file_path) 完成方法一的重命名操作看不懂,直接源码分析吧😂代码示例import os """批量修改文件重命名和删除目录下指定后缀文件""" def files_remove(file_path): """批量删除文件""" print('此工具通过输入文件后缀进行批量删除文件') remove_suffix = input('输入要删除文件的后缀: (.jpg .png ...) >>>') sub_files = list() # 获取该目录下所有的子目录, 列表中存储文件的绝对路径 if os.path.isdir(file_path): sub_files = [os.path.join(file_path, i) for i in os.listdir(file_path)] # 遍历该目录, 判断是否有目标尾缀的文件,有进行删除 if sub_files: for sub_file in sub_files: if os.path.isfile(sub_file) & sub_file.endswith(remove_suffix): print(f'删除的文件为:{sub_file}') os.remove(sub_file) def key_rename(folder_path, *args): """批量文件重命名方法1""" print('此工具支持查找有相同名字的文件进行替换重命名') old_key = input('输入查找关键字:') new_key = input('输入替换关键字:') # walk方法递归往下查找到所以文件夹和文件 for main_folder_path, folder_path, file_path in os.walk(folder_path): # print(main_folder_path) # D:\pythonBasics\os模块\修改文件\新建文件夹 for filename in file_path: old_file_path = os.path.join(main_folder_path, filename) # print(old_file_path) # 'D:\pythonBasics\os模块\修改文件\新建文件夹\mm-1.jpg' if old_key in old_file_path: # 将用于查找的关键字替换为要设置的新关键字 new_file_path = os.path.join(main_folder_path, filename.replace(old_key, new_key)) print(new_file_path) # 判断旧路径是否是文件 (保险,避免把文件夹也改名了) if os.path.isfile(old_file_path): os.rename(old_file_path, new_file_path) print(f'{old_file_path} >>> {new_file_path}') def all_file_rename(path, *args): """批量文件重命名方法2""" print('此工具支持自定义文字进行文件重命名') suffix = input('请输入要修改文件的后缀(.jpg .png ...) >>>') # 什么都不填,回车即为False rev = bool(input('设置翻转(默认False eg:{xxx-}1{.jpg} | True eg: 1{-xxx}{.jpg}) :bool >>>')) custom_words = input('请输入自定义关键字: (建议加-可以很有效的排序) >>>') set_suffix = input('请输入修改后文件的后缀:(.jpg .png ...) >>>') n = 0 for filename in os.listdir(path): old_file_path = os.path.join(path, filename) # 旧文件路径 old_file_prefix,old_file_suffix = os.path.splitext(filename) # 判断是否为规定的后缀格式(不是就跳过) if old_file_suffix != suffix: continue num = str(n + 1) var_revers = lambda x: path + os.sep + num + custom_words + set_suffix if x == True else path + os.sep + custom_words + num + set_suffix # 设置新文件路径 new_file_path = var_revers(rev) # new_file_path = path + os.sep + custom_words + str(n + 1) + set_suffix os.rename(old_file_path, new_file_path) # 用os模块中的rename方法对文件改名 print(f'{old_file_path} >>> {new_file_path}') n += 1 def run(): function_dict = {'1': key_rename, '2': all_file_rename, '3': files_remove} while True: print('======================================欢迎使用文件批处理工具======================================') folder_path = input('请输入文件路径(建议直径复制)>>> ') print('你有以下功能选择(1.以匹配关键字进行重命名; 2.以自定义的字+序号进行重命名)') choice = input('请选择(按q/Q退出)>>>') if choice.upper() == 'Q': return func = function_dict.get(choice) if not func: print('请输入正确的序号') continue func(folder_path) if __name__ == '__main__': run()运行成果展示:
2023年02月19日
14 阅读
0 评论
0 点赞
2023-02-19
python爬虫采集pexels网站关于风景的视频
简介网站是国外的素材网站,Pexels可以帮助设计师,自媒体工作者和所有正在寻找图像的人找到可以在任何地方免费使用的精美照片,当然还有为数不是很多,但质量同样很高的视频素材。由于此网站是国外的,爬取是需要搭✈️的, 有国外ip的可以使用ip代理。😂开发工具环境使用Python 3.8 解释器Pycharm 编辑器所使用模块import randomimport timeimport osimport requests分析实现思路通过搜索风景快速定位到视频F12或右键-->检查打开开发者工具选择network-->清除响应数据-->刷新查找到视频所在json数据包,分析链接、请求头以及携带的参数分析数据--> 请求数据--> 解析数据--> 保存数据代码实现过程# -*- coding:utf-8 -*- # @Author:🎈RedBalloon # @Time:2023/2/17-17:01 # @File:spider.py import os import random import time import requests """采集pexels网站的风景视频""" headers = { 'content-type': 'application/json', 'referer': 'https://www.pexels.com/zh-cn/search/videos/%E9%A3%8E%E6%99%AF/', 'secret-key': 'H2jk9uKnhRmL6WPwh89zBezWvr', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36', } def get_links(n): try: url = f'https://www.pexels.com/zh-cn/api/v3/search/videos?page={n}&per_page=24&query=%E9%A3%8E%E6%99%AF&orientation=all&size=all&color=all&seo_tags=true' response = requests.get(url, headers=headers) response.raise_for_status() if response.status_code == 200: json_data = response.json() data = json_data['data'] links = [] ids = [] for n in range(len(data)): video_link = data[n]['attributes']['video']['download'] video_id = data[n]['attributes']['id'] # print(video_id,video_link) links.append(video_link) ids.append(video_id) dict_data = dict(zip(ids, links)) return dict_data except Exception as e: print('error: is >>>', e) def download(dict_data): # 需要下载视频把注释放开就可 for id, url in dict_data.items(): time.sleep(random.randint(1, 4)) path = "downloads\\" if not os.path.exists(path): os.mkdir(path) content_data = requests.get(url, timeout=500).content with open(path + str(id) + '.mp4', mode='wb') as f: f.write(content_data) print('ok-------', url) # 只需要链接就放开 # for _ in range(len(name)): # with open('download_text.txt', mode='a') as f: # date_f = "{},{}\n".format(name[_], url[_]) # print(date_f) # f.write(date_f) if __name__ == '__main__': for i in range(1, 6): print(f'===========下载第{i}页=============') dict_data = get_links(i) download(dict_data)运行结果:风景视频欣赏😀{dplayer src="https://www.aicartoon.top/usr/uploads/2023/02/2581329853.mp4"/}{dplayer src="https://www.aicartoon.top/usr/uploads/2023/02/123008626.mp4"/}
2023年02月19日
22 阅读
0 评论
0 点赞
2022-12-13
学期末来临,网站先不更新咯
学习最重要
2022年12月13日
5 阅读
0 评论
0 点赞
2022-11-29
更改Jupyter Notebook的工作目录,让其更清爽干净
简介Anaconda(官方网站)就是可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包及其依赖项。在学习时python数据分析时需要安装anaconda这个包管理工具,使用它的Jupyter Notebook时发现默认的目录在电脑的C:\Users\xxxx目录下,很多文件夹与文件混杂,这在学习中很不方便。anaconda的安装与下载官网下载地址:https://www.anaconda.com/products/distribution#Downloads 主页长这样 没啥好讲的,一路下一步就好啦。!!!要注意到的是勾选第一个是添加到环境变量,建议后面自己手动添加,第二个是默认python3.9版本,可以不用管。下载好anaconda之后,我们会在开始菜单中能找到能打开就没问题哈。检查检查win+r打开命令行输入: conda -V | conda --version这是需要手动配置到环境变量的E:\Anaconda E:\Anaconda\Scripts E:\Anaconda\Library\mingw-w64\bin E:\Anaconda\Library\usr\bin E:\Anaconda\Library\binjupyter目录更改第一步 :打开Anaconda Prompt,输入命令 jupyter notebook --generate-config 第二步:根据复制的路径找到对应文件,打开该文件。查找(ctrl + f)c.NotebookApp.notebook_dir。第三步:最后只需要在开始菜单中找到 Jupyter Notebook (anaconda3) 右键--> 更多--> 打开文件位置,再右键属性,嗯~ 上图。好啦,到这就完啦。看看效果吧
2022年11月29日
16 阅读
0 评论
0 点赞
2022-11-27
python web框架Flask学习笔记(五)模板的控制结构
简介在模板中使用的控制结构,主要有 if 、 for 。下面会详细讲解使用方法。if控制结构的使用if 的使用语法规则:# 模板中的if控制结构 {% if 条件 %} 符合条件执行的html代码 {% endif %} # 必须要有,作为结束当然在模板中也是支持 if---else 结构的。使用也是一样# {% if 条件 %} # 中间写为True执行的代码 # {% else %} # 中间写为False执行的代码 # {% endif %}其实,在模板中使用控制结构就同在python中是基本相同的,不过是加了 {% %} 框起来了而已, 这是jinja2中设置好的规则。{% %}是Jinja2中的控制语句,{{ }}是Jinja2中的变量,{# #}是注释。案例理解:flask程序中:from flask import Flask, render_template app = Flask(__name__) #@app.route('/page') #def index(name): # 定义一个变量在模板中使用 # uname = '披甲龙龟' # return render_template('Process-control-if.html', test_data=locals()) @app.route('/page/<name>') def page_name(name): # uname = '披甲龙龟' str_name = name return render_template('Process-control-if.html', test_data=locals()) @app.route('/info') def info(): return '<img src="https://p1.ssl.qhimg.com/t014ee57f018c046471.jpg">' if __name__ == '__main__': app.run(debug=True)模板文件中:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <style> .test1 { color: #f60; text-aline:center; } </style> <body> {% if test_data.uname %} <h1 class="test1">Hello ~ {{test_data.uname}}</h1> {% endif %} <!-- 在这里意思是如果uname存在,会执行Hello ~ uname的值,否则什么都不执行 对应index视图--> {% if test_data.uname %} <h1 class="test1">Hello ~ {{test_data.uname}}</h1> {% else %} <h1 class="test1">Hello World ~ {{test_data.name}}🤭 {% endif %} <!-- 同上面相同,如果不存在时会执行Hello World ~ <name>地址栏输入的值 对应page_name视图--> <!--这里讲url_for在模板中反向解析的用法--> {% if test_data.uname %} <h2><a href="{{url_for('info')}}">关于我</a></h2> {% endif %} </body> </html>这里就不运行给大家看了。for控制结构的使用for的使用语法规则:# 模板中的for控制结构 {% for 变量 in 可迭代对象(list/tuple/dict/set/str...) %} # 中间写循环体(html代码或动态变量) {% endfor %} # 作为结束,必须有for语句在模板中的使用很广泛,遍历,循环,通常需要传递多个变量时,会在视图函数中封装成字典、列表、元组等类型数据,这样我们只需要传递一个可迭代的变量再通过模板的for控制结构遍历出数据就实现多个数据的传递。案例理解:flask程序中:from random import choice from flask import Flask, render_template app = Flask(__name__) @app.route('/page') def index(): uname = '披甲龙龟' # 随机 abcd lis = ['A', 'B', 'C', 'D'] random_word = [choice(lis) for _ in range(10)] # 用模板的for来遍历该字典 dicts_data = { '疾风剑豪': '亚索', '暗裔剑魔': '亚托克斯', '无双剑姬': '菲奥娜', '无极剑圣': '易', } return render_template('Process-control-for.html', test_data=locals()) if __name__ == '__main__': app.run(debug=True) 模板文件中:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% if True%} <h1 class="test1">Hello ~ {{test_data.uname}}</h1> {% endif %} <!--模板中使用 for 循环结构--> <!--list--> <ul> {% for li in test_data.random_word %} <li><h2>{{li}}</h2></li> {% endfor %} </ul> <!--dict--> <div> {% for k,v in test_data.dicts_data.items() %} <p>{{k}}:{{v}}</p> {% endfor %} </div> </body> </html>运行结果:
2022年11月27日
8 阅读
0 评论
0 点赞
2022-11-14
胡思乱想~
emo住了 啥也不是大学调剂到一个不喜欢的专业,一不擅长,二不喜欢,三不感兴趣。都说兴趣是最好的老师,没兴趣学啥都不得劲,属实难受 😔 来到这个新环境,也没找到志同道合的朋友,每天都很忙,忙着些无意义的事。尽管每天都在学习,可总是有那么一段时刻让我感到迷茫焦灼。🙃 担心着、幻想着、憧憬着,各种思绪在意识里徘徊。算了,我本就不是什么多愁善感的人,怕人憋坏了 😨Q:积极向上该是怎样一种生活状态🤔
2022年11月14日
4 阅读
0 评论
0 点赞
2022-11-14
python爬取weibo句读的精选句子
简介简单的爬虫,抓取 weibo 句读APP的精选句子,没什么技术含量,主要是我想做个一言的api。开发工具Python 3.8Pycharm 2020 (社区版)推荐安装一个插件 JSON-handle , 干什么的呢? 在处理json数据时我们就不需要再去网页中找在线的json解析了,使用也很方便,直接在地址栏复制包含json数据的链接就好啦。😊实现思路需要登录,之后定位到要爬取的主页(搜索句读后点击博主头像到主页)点击精选栏,打开开发者工具分析XHR找到对应的json数据发起请求,处理请求,保存数据代码实现过程import random import requests import time """微博句读博主精选栏目文案采集 ps: 好像精选的内容隔一段时间采集都是不一样, """ def get_json(): for i in range(1, 6): url = f'https://weibo.com/ajax/profile/myhot?page={i}&feature=2&uid=5795042732' headers = { # 换自己的cookie 'cookie': cookie, 'referer': 'https://weibo.com/judourili?tabtype=home', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36', 'x-requested-with': 'XMLHttpRequest', 'x-xsrf-token': 'uKHV-eRb8dpiNnmHKprNBbTz' # 需要更换 } time.sleep(random.randint(1, 4)) response = requests.get(url, headers=headers).json() # print(response) dict_data = response['data']['list'] for n in range(len(dict_data)): text_data = dict_data[n]['text_raw'].replace('\n', '\t') with open('data2.txt', mode='a', encoding='utf-8') as f: f.write(text_data + '\n') print(f'download---{i}page---ok') if __name__ == '__main__': get_json()执行结果
2022年11月14日
6 阅读
0 评论
0 点赞
1
2
...
4