首页
直播
壁纸
免责声明
更多
统计
关于
Search
1
一款自动化渗透工具包 TscanPlus
225 阅读
2
获取一张美国虚拟信用卡
223 阅读
3
JS Document.evaluate()的使用
199 阅读
4
Git冲突:Please commit your changes or stash them before you merge
174 阅读
5
Python 31条 pip 命令全解析
164 阅读
默认分类
操作系统
Linux
管理面板
实用工具
开发语言
PHP
Web
python
typecho
ThinkPHP
layui
爬虫
文章分享
登录
Search
标签搜索
python
php
web
linux
Git
js
requests
自动化
宝塔
thinkphp
Centos
adb
html
typecho
layui
jquery
ubuntu
multipass
虚拟机
thikphp
YiYun
累计撰写
54
篇文章
累计收到
21
条评论
首页
栏目
默认分类
操作系统
Linux
管理面板
实用工具
开发语言
PHP
Web
python
typecho
ThinkPHP
layui
爬虫
文章分享
页面
直播
壁纸
免责声明
统计
关于
搜索到
11
篇与
的结果
2024-04-18
Python 31条 pip 命令全解析
首先,pip 是个啥?简单来说,pip 就是 Python 的包管理器,就像手机里的应用商店一样,可以方便地帮你安装、升级或卸载 Python 的各种第三方库。命令 1:安装 pip如果你是Python新手,很可能系统已经自带pip。验证是否已安装,只需在命令行输入:python -m pip --version若未安装,可参考官方指引进行安装。命令 2:安装 Python 库想装个requests库试试水?一句命令搞定!pip install requests这就是pip最基础也是最常见的用法,它会自动处理库及其依赖关系。命令 3:升级库世界日新月异,库也要保持最新状态。要升级已安装的所有库:pip list --outdated # 查看待升级库 pip upgrade <package_name> # 升级指定库命令 4:卸载库不再需要某个库时,我们可以这样卸载:pip uninstall <package_name>命令 5:搜索库在决定安装某个库之前,你可能想先了解下有哪些可用的库能满足你的需求。这时可以使用 search 命令:pip search <keyword>比如查找与机器学习相关的库,你可以输入 pip search machine learning 。命令 6:查看已安装库详细信息想知道已安装的库具体版本和其他详情? show 命令可以帮助你:pip show <package_name>命令 7:只下载库而不安装有时你可能需要离线环境安装包或者备份当前环境的依赖,那么可以使用 download 命令只下载不安装:pip download <package_name>命令 8:创建requirements文件在项目开发中,为了方便团队成员统一环境,我们可以创建一个包含所有依赖的 requirements 文件:pip freeze > requirements.txt这会列出当前环境中所有已安装库及其版本,并保存到 requirements.txt 文件中。而要根据这个文件安装所有依赖,只需:pip install -r requirements.txt命令 9:指定库版本安装在某些情况下,你可能需要安装特定版本的库,比如安装 requests 库的2.25.1版本:pip install requests==2.25.1命令 10:检查是否存在安全漏洞pip 配合 Safety 工具可以检查已安装库的安全性:pip install safety safety check --full-report这会扫描所有已安装的库,并报告是否有已知的安全漏洞。命令 11:创建虚拟环境并激活为了避免不同项目间依赖冲突,我们通常会在每个项目下创建独立的虚拟环境,然后使用 pip 进行管理:python -m venv my_project_env # 创建虚拟环境 source my_project_env/bin/activate # Linux/Mac激活环境 my_project_env\Scripts\activate.bat # Windows激活环境在虚拟环境中,你可以放心使用 pip 安装和管理项目的专属依赖。命令 12:清理未使用的库或缓存随着项目迭代,有些不再使用的库可能会被遗忘,这时可以使用 autoremove 命令来清除:pip-autoremove <package_name>同时,你也可以清理 pip 下载缓存以释放磁盘空间:pip cache purge命令 13:查看 pip 自身的版本信息及更新 pip要查看 pip 本身的版本,只需运行:pip --version为了确保 pip 始终保持最新,可使用如下命令升级 pip 自身:python -m pip install --upgrade pip当然,pip 的功能确实丰富多样,让我们继续探索:命令 14:指定源安装库在某些网络环境下,可能需要从国内镜像或者其他自定义源下载和安装库。例如使用阿里云的Python 镜像源:pip install -i https://mirrors.aliyun.com/pypi/simple/ <package_name>或永久更改 pip 默认源(推荐在配置文件中修改):pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/命令 15:分发本地构建的库如果你自己开发了一个 Python 包,并希望在本地测试安装,可以先打包成 whl 或 tar.gz 格式,然后通过 pip 进行安装:# 假设你已经将项目打包为my_package-0.1.0.whl pip install ./my_package-0.1.0.whl命令 16:查看库安装路径如果想知道某个库具体安装在系统哪个位置,可以使用 show --files 选项:pip show --files <package_name>命令 17:在安装时跳过测试有些库在安装过程中会执行单元测试,若想快速安装可选择跳过这些测试:pip install --no-deps --ignore-installed --no-cache-dir --disable-pip-version-check --no-compile <package_name>命令 18:列出所有全局安装的库获取全局环境下的所有已安装Python库列表:pip list命令 19:在安装时指定额外选项某些库可能在安装时需要额外参数,比如 numpy 、 scipy 等科学计算库,你可以直接在 pip 命令中传递这些选项:pip install numpy --install-option="--openblas"这里的 --openblas 是一个示例,实际选项请根据库文档进行设置。命令 20:查看依赖树要了解一个包及其所有依赖关系,可以使用 deptree 第三方工具:pip installdeptree deptree -l <package_name>这将展示指定包及其所有依赖项之间的层级关系。命令 21:修复损坏的库如果某个库在安装或升级过程中出现问题导致无法正常使用,可以尝试修复它:pip install --force-reinstall <package_name>命令 22:获取库的源码如果你对某个库的实现细节感兴趣,可以通过 pip 下载其源代码:pip download <package_name> --no-binary :all:然后在下载目录中找到对应的 tar.gz 或 whl 文件解压查看。命令 23:执行pip的自定义脚本有些开发者可能会编写自定义的 pip 脚本来自动化一些任务,你可以通过 run 命令执行:pip run my_script.py命令 24:在安装时指定 Python 版本如果你有多个Python版本并希望为特定版本安装库:python3.7 -m pip install <package_name>这里 python3.7 替换成你想要使用的Python解释器路径。命令 25:检查依赖冲突在项目中可能存在不兼容的依赖版本,可以使用 pipdeptree 第三方工具来检测:pip install pipdeptree pipdeptree --packages <package_name>这将展示指定包及其依赖项之间是否存在版本冲突。命令 26:创建独立可执行文件借助 pyinstaller 等工具,你可以通过pip将Python程序打包成一个独立可执行文件:pip install pyinstaller pyinstaller your_script.py命令 27:管理用户级别的包默认情况下,pip 会安装全局系统级别的包。若想为当前用户安装不影响系统的包,可以加上 --user 选项:pip install --user <package_name>命令 28:只升级指定的包而不升级所有包当只需要更新某个特定的库时,可以使用 --upgrade 选项:pip install --upgrade <package_name>命令 29:批量卸载多个包如果需要一次性卸载多个Python包,可以通过列表形式提供包名:pip uninstall <package1> <package2> ...命令 30:冻结当前环境下的所有包及其版本为了能够复制或记录当前环境中所有已安装包的状态,可以生成一个 requirements 文件:pip freeze > requirements.txt这将把所有已安装包及其版本号写入 requirements.txt 文件中,便于在其他环境下复现相同的软件环境。命令 31:根据requirements文件创建虚拟环境并安装包结合虚拟环境(如venv或conda),可以从requirements文件重新构建环境:python -m venv my_venv source my_venv/bin/activate # Windows: my_venv\Scripts\activate.bat pip install -r requirements.txt
2024年04月18日
164 阅读
3 评论
0 点赞
2024-04-18
14个Python自动化实战脚本
1、批量文件重命名神器在工作中,我们常常需要对大量文件进行批量重命名,Python帮你轻松搞定! import os def batch_rename(path, prefix='', suffix=''): for i, filename in enumerate(os.listdir(path)): new_name = f"{prefix}{i:03d}{suffix}{os.path.splitext(filename)[1]}" old_file = os.path.join(path, filename) new_file = os.path.join(path, new_name) os.rename(old_file, new_file) # 使用示例: batch_rename('/path/to/your/directory', 'file_', '.txt')2、自动发送邮件通知告别手动发送,用Python编写定时发送邮件的自动化脚本。import smtplib from email.mime.text import MIMEText def send_email(to_addr, subject, content): smtp_server = 'smtp.example.com' username = 'your-email@example.com' password = 'your-password' msg = MIMEText(content) msg['Subject'] = subject msg['From'] = username msg['To'] = to_addr server = smtplib.SMTP(smtp_server, 587) server.starttls() server.login(username, password) server.sendmail(username, to_addr, msg.as_string()) server.quit() # 使用示例: send_email('receiver@example.com', '每日报告提醒', '今日报告已生成,请查收。')3、定时任务自动化执行使用Python调度库,实现定时执行任务的自动化脚本。import schedule import time def job_to_schedule(): print("当前时间:", time.ctime(), "任务正在执行...") # 定义每天9点执行任务 schedule.every().day.at("09:00").do(job_to_schedule) while True: schedule.run_pending() time.sleep(1) # 使用示例: # 运行此脚本后,每天上午9点会自动打印当前时间及提示信息4、数据库操作自动化简化数据库管理,Python帮你自动化执行CRUD操作。import sqlite3 def create_connection(db_file): conn = None try: conn = sqlite3.connect(db_file) print(f"成功连接到SQLite数据库:{db_file}") except Error as e: print(e) return conn def insert_data(conn, table_name, data_dict): keys = ', '.join(data_dict.keys()) values = ', '.join(f"'{v}'" for v in data_dict.values()) sql = f"INSERT INTO {table_name} ({keys}) VALUES ({values});" try: cursor = conn.cursor() cursor.execute(sql) conn.commit() print("数据插入成功!") except sqlite3.Error as e: print(e) # 使用示例: conn = create_connection('my_database.db') data = {'name': 'John Doe', 'age': 30} insert_data(conn, 'users', data) # 在适当时候关闭数据库连接 conn.close()5、网页内容自动化抓取利用BeautifulSoup和requests库,编写Python爬虫获取所需网页信息。import requests from bs4 import BeautifulSoup def fetch_web_content(url): response = requests.get(url) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') # 示例提取页面标题 title = soup.find('title').text return title else: return "无法获取网页内容" # 使用示例: url = 'https://example.com' web_title = fetch_web_content(url) print("网页标题:", web_title)6、数据清洗自动化使用Pandas库,实现复杂数据处理和清洗的自动化。import pandas as pd def clean_data(file_path): df = pd.read_csv(file_path) # 示例:处理缺失值 df.fillna('N/A', inplace=True) # 示例:去除重复行 df.drop_duplicates(inplace=True) # 示例:转换列类型 df['date_column'] = pd.to_datetime(df['date_column']) return df # 使用示例: cleaned_df = clean_data('data.csv') print("数据清洗完成,已准备就绪!")7、图片批量压缩用Python快速压缩大量图片以节省存储空间。from PIL import Image import os def compress_images(dir_path, quality=90): for filename in os.listdir(dir_path): if filename.endswith(".jpg") or filename.endswith(".png"): img = Image.open(os.path.join(dir_path, filename)) img.save(os.path.join(dir_path, f'compressed_{filename}'), optimize=True, quality=quality) # 使用示例: compress_images('/path/to/images', quality=80)8、文件内容查找替换Python脚本帮助你一键在多个文件中搜索并替换指定内容。import fileinput def search_replace_in_files(dir_path, search_text, replace_text): for line in fileinput.input([f"{dir_path}/*"], inplace=True): print(line.replace(search_text, replace_text), end='') # 使用示例: search_replace_in_files('/path/to/files', 'old_text', 'new_text')9、日志文件分析自动化通过Python解析日志文件,提取关键信息进行统计分析。def analyze_log(log_file): with open(log_file, 'r') as f: lines = f.readlines() error_count = 0 for line in lines: if "ERROR" in line: error_count += 1 print(f"日志文件中包含 {error_count} 条错误记录。") # 使用示例: analyze_log('application.log')10、数据可视化自动化利用Matplotlib库,实现数据的自动图表生成。import matplotlib.pyplot as plt import pandas as pd def visualize_data(data_file): df = pd.read_csv(data_file) # 示例:绘制柱状图 df.plot(kind='bar', x='category', y='value') plt.title('数据分布') plt.xlabel('类别') plt.ylabel('值') plt.show() # 使用示例: visualize_data('data.csv')11、邮件附件批量下载通过Python解析邮件,自动化下载所有附件。import imaplib import email from email.header import decode_header import os def download_attachments(email_addr, password, imap_server, folder='INBOX'): mail = imaplib.IMAP4_SSL(imap_server) mail.login(email_addr, password) mail.select(folder) result, data = mail.uid('search', None, "ALL") uids = data[0].split() for uid in uids: _, msg_data = mail.uid('fetch', uid, '(RFC822)') raw_email = msg_data[0][1].decode("utf-8") email_message = email.message_from_string(raw_email) for part in email_message.walk(): if part.get_content_maintype() == 'multipart': continue if part.get('Content-Disposition') is None: continue filename = part.get_filename() if bool(filename): file_data = part.get_payload(decode=True) with open(os.path.join('/path/to/download', filename), 'wb') as f: f.write(file_data) mail.close() mail.logout() # 使用示例: download_attachments('your-email@example.com', 'your-password', 'imap.example.com')12、定时发送报告自动化根据数据库或文件内容,自动生成并定时发送日报/周报。import pandas as pd import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart def generate_report(source, to_addr, subject): # 假设这里是从数据库或文件中获取数据并生成报告内容 report_content = pd.DataFrame({"Data": [1, 2, 3], "Info": ["A", "B", "C"]}).to_html() msg = MIMEMultipart() msg['From'] = 'your-email@example.com' msg['To'] = to_addr msg['Subject'] = subject msg.attach(MIMEText(report_content, 'html')) server = smtplib.SMTP('smtp.example.com', 587) server.starttls() server.login('your-email@example.com', 'your-password') text = msg.as_string() server.sendmail('your-email@example.com', to_addr, text) server.quit() # 使用示例: generate_report('data.csv', 'receiver@example.com', '每日数据报告') # 结合前面的定时任务脚本,可实现定时发送功能13、自动化性能测试使用Python的 locust 库进行API接口的压力测试。from locust import HttpUser, task, between class WebsiteUser(HttpUser): wait_time = between(5, 15) # 定义用户操作之间的等待时间 @task def load_test_api(self): response = self.client.get("/api/data") assert response.status_code == 200 # 验证返回状态码为200 @task(3) # 指定该任务在总任务中的执行频率是其他任务的3倍 def post_data(self): data = {"key": "value"} response = self.client.post("/api/submit", json=data) assert response.status_code == 201 # 验证数据成功提交后的响应状态码 # 运行Locust命令启动性能测试: # locust -f your_test_script.py --host=http://your-api-url.com14、自动化部署与回滚脚本使用Fabric库编写SSH远程部署工具,这里以部署Django项目为例:from fabric import Connection def deploy(host_string, user, password, project_path, remote_dir): c = Connection(host=host_string, user=user, connect_kwargs={"password": password}) with c.cd(remote_dir): c.run('git pull origin master') # 更新代码 c.run('pip install -r requirements.txt') # 安装依赖 c.run('python manage.py migrate') # 执行数据库迁移 c.run('python manage.py collectstatic --noinput') # 静态文件收集 c.run('supervisorctl restart your_project_name') # 重启服务 # 使用示例: deploy( host_string='your-server-ip', user='deploy_user', password='deploy_password', project_path='/path/to/local/project', remote_dir='/path/to/remote/project' ) # 对于回滚操作,可以基于版本控制系统实现或创建备份,在出现问题时恢复上一版本的部署。
2024年04月18日
60 阅读
0 评论
0 点赞
2024-03-29
Python脚本利用adb进行手机控制的方法
这篇文章主要介绍了Python脚本利用adb进行手机控制的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧一. adb 相关命令:关闭adb服务:adb kill-server启动adb服务 adb start-server查询当前运行的所有设备 adb devices可能在adb中存在多个虚拟设备运行 可以指定虚拟设备运行 -s 虚拟设备名称重启设备 adb reboot --指定虚拟设备 adb -s 设备名称 reboot查看日志 adb logcat 清除日志 adb logcat -c进入linux shell下 adb shell 其中常用的linux命令 cd cat 等等 输入su可以获取超级管理员名称了 要确定是否有哪些命令 进入 system/bin目录 就知道了传入文件到设备中 adb push 本地文件 远程目录从设备中拷贝文件到本地 adb -s emulator-5556 pull /data/config.ini d:/显示当前运行的全部模拟器: adb devices安装应用程序: adb install -r 123.apk获取模拟器中的文件: adb pull 向模拟器中写文件: adb push 进入模拟器的shell模式: adb shell卸载apk包: adb shell cd data/app rm 123.apk exit adb uninstall 123.apk adb install -r 123.apk查看adb命令帮助信息: adb help删除系统应用: adb remount (重新挂载系统分区,使系统分区重新可写)。 adb shell cd system/app rm 123.apk获取管理员权限: adb root19、复制文件:复制一个文件或目录到设备:adb push 如:adb push update.zip /sdcard/从设备上复制一个文件或目录:adb pull 如:adb pull /sdcard/update.zip.20、取得当前运行设备的实例的列表及每个实例的状态:adb devices21:这条命令模拟android手机在屏幕坐标(X,Y)处进行了点击操作。adb shell input tap22:这条命令模拟Android手机从屏幕坐标(X1,Y1)滑动到坐标(X2,Y2)的操作。adb shell input swipe 23:Luiautomator dump dump: creates an XML dump of current UI hierarchy 这个命令是用来成成当前界面的UI层次,并用XML格式进行展示 。这样就可以获取各个组件的位置了注:如果PC要想同时控制多台Android手机,必须在adb 后面添加-s例如:adb -s 13b6e4c4 shell input tap 400 400表示对13b6e4c4这台Android手机进行在屏幕上(400,400)坐标位置进行模拟的点击事件。24.能看到设备信息就代表设备已经连接成功了,接下来的命令就是adb install 路径+包名.apk例如我的安装包放在桌面,那么命令就是adb install C:\Users\hyh\Desktop\XXX.apk* adb shell uiautomator dump /mnt/sdcard/window_dump.xml 获得手机当前界面的UI信息,生成window_dump.xml* adb shell input text “123” 输入text举例:1、打开cmd,进入到当前文件夹中,输入命令 adb devices 查看当前与电脑连接的设备(前提是,手机打开usb调试模式),可以查看已连接成功的手机。2、 若手机成功连接,输入命令 adb shell input tap 100 100 , 表示点击屏幕上坐标为(100,100)的点,如果不知道需要点击的点的具体位置的话可以在手机开发者模式中设置。二. adb 模拟按键:比如使用 adb shell input keyevent 命令,不同的 keycode 能实现不同的功能,完整的 keycode 列表详见 KeyEvent,摘引部分我觉得有意思的如下:Keycode含义3HOME 键4返回键5打开拨号应用6挂断电话24增加音量25降低音量26电源键27拍照(需要在相机应用里)64打开浏览器82菜单键85播放/暂停86停止播放87播放下一首88播放上一首122移动光标到行首或列表顶部123移动光标到行末或列表底部126恢复播放127暂停播放164静音176打开系统设置187切换应用207打开联系人208打开日历209打开音乐210打开计算器220降低屏幕亮度221提高屏幕亮度223系统休眠224点亮屏幕231打开语音助手276如果没有 wakelock 则让系统休眠input 命令的一些用法举例电源键命令:adb shell input keyevent 26执行效果相当于按电源键。菜单键命令:adb shell input keyevent 82HOME 键命令:adb shell input keyevent 3返回键命令adb shell input keyevent 4音量控制增加音量:adb shell input keyevent 24降低音量:adb shell input keyevent 25静音:adb shell input keyevent 164媒体控制播放/暂停:adb shell input keyevent 85停止播放:adb shell input keyevent 86播放下一首:adb shell input keyevent 87播放上一首:adb shell input keyevent 88恢复播放:adb shell input keyevent 126暂停播放:adb shell input keyevent 127点亮/熄灭屏幕可以通过上文讲述过的模拟电源键来切换点亮和熄灭屏幕,但如果明确地想要点亮或者熄灭屏幕,那可以使用如下方法。点亮屏幕:adb shell input keyevent 224熄灭屏幕:adb shell input keyevent 223三、使用python脚本自动运行cmd 命令1.在adb文件夹下建立一个python文件import os os.system('adb shell input tap 100 100');运行脚本,发现与在命令行输入相同语句有同样的效果。2、也可以使用subprocess.Popen,最简单使用方式如下,设置shell=True,就不会弹出cmd框process = subprocess.Popen('adb shell input tap 14 1402',shell=True)程序实例:#coding:utf-8 #程序功能:可以实现抖音个人页面视频的自动点击,从而自动增加访问量 #思路:抖音主页中两个视频切换点击,可以实现访问量的增加 #使用ADB程序,视频的屏幕坐标可以使用adb shell uiautomator dump命令,获取该页面xml源码后查得 #下述是小米MIX2抖音主页第一个视频和第二个视频的坐标位置 #缺点:运行时不能移动屏幕,后续可以采用获取模块ID号的方式去点击相应的位置 import time import subprocess i = 0 #每次操作的间隔时间取决于手机配置,配置越高时间越短 sleep_time = 0.5 while 1: #用popen设置shell=True不会弹出cmd框 process = subprocess.Popen('adb shell input tap 14 1402',shell=True) time.sleep(sleep_time) process = subprocess.Popen('adb shell input keyevent KEYCODE_BACK', shell=True) time.sleep(sleep_time) process = subprocess.Popen('adb shell input tap 375 1402', shell=True) time.sleep(sleep_time) process = subprocess.Popen('adb shell input keyevent KEYCODE_BACK', shell=True) time.sleep(sleep_time) #os.system('adb shell input tap 14 1402') #os.system('adb shell input keyevent KEYCODE_BACK') #os.system('adb shell input tap 375 1402') i+=1 print str(i) + 'clicks have been completed'实现原理Hierarchy Viewer:获得当前手机实时的UI信息,方便用于手机的自动化测试;python中的subprocess.Popen() 或 Python os模块:调用系统命令;uiautomator工具:获取界面控件信息;adb命令:对手机进行操作;原文出处: Python脚本利用adb进行手机控制的方法
2024年03月29日
97 阅读
0 评论
0 点赞
2024-03-28
python3.6根据m3u8下载mp4视频
这篇文章主要为大家详细介绍了python3.6根据m3u8下载mp4视频,具有一定的参考价值,感兴趣的小伙伴们可以参考一下需要下载某网站的视频,chrome浏览器按F12打开开发者模式,发现视频链接是以"blob:http"开头的链接,打开这个链接后找不到网页,网上查了下,找到了下载方法,在这里做个记录,如果有错误,欢迎指出。程序在Windows 10下运行,不过Linux应该也没问题。使用到的有re模块,requests模块和Crypto模块,其中requests模块和Crypto模块如果没安装可以使用pip命令安装。(Crypto模块安装感觉比较坑,我是从anaconda里拷贝了一份)下面开始正题:注:以下使用的m3u8文件所在的网站是自己搭建用来测试的,链接可能会失效。首先在chrome的network里找到一个m3u8文件的请求,可以通过它下载视频。通过Preview可以看到m3u8文件的内容。这里m3u8文件比较重要的内容有两个。一个是URI后面的链接,这个是加密和解密的秘钥,如果m3u8文件里有这个URI,那么这个视频就是经过了加密的,加密的方法可以看URI前面,这里是AES-128加密算法。另一个是以ts结尾链接,这个是视频片段,如果是没进行加密的,可以直接打开这个链接下载视频片段,下载下来的是后缀为ts的文件,一般可以直接播放,不过时间很短。如果是加密过的,下载后播放会提示视频文件已损坏。知道这些后,就可以进行下载了,先获取m3u8文件的内容,然后解析出秘钥(key)和ts的链接,然后下载key对每一个ts进行解密,保存到一个mp4文件里。下载用的是requests模块,解析key和ts的链接是用的re模块,解密用的是Crypto模块。使用Crypto需要注意三个地方,一个是安装和导入,第二个是Crypto里AES.new的参数,第三个是decrypt方法的参数。下面先看代码。导入模块:import re import requests from Crypto.Cipher import AES初始设置:# 保存的mp4文件名 name = "dream_it_possible.mp4" # m3u8文件的url url = "http://www.jiuyi.info/static/video/secret/dream_it_possible.m3u8" # 请求头,不一定需要,看网站更改 headers = { "Referer": "http://www.jiuyi.info/video/dream_it_possible", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " "(KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", }获取m3u8文件内容,并解析出key和ts文件的url。# 获取m3u8文件内容 r = requests.get(url) # 通过正值表达式获取key和ts的url k = re.compile(r"http://.*?\.key") # key的正则匹配 t = re.compile(r"http://.*?\.ts") # ts的正则匹配 key_url = k.findall(r.text)[0] # key的url ts_urls = t.findall(r.text) # ts的url列表下载并解密ts文件,保存为mp4文件。# 下载key key = requests.get(key_url).content # 解密并保存ts for ts_url in ts_urls: ts_name = ts_url.split("/")[-1] # ts文件名 # 解密,new有三个参数, # 第一个是秘钥(key)的二进制数据, # 第二个使用下面这个就好 # 第三个IV在m3u8文件里URI后面会给出,如果没有,可以尝试把秘钥(key)赋值给IV sprytor = AES.new(key, AES.MODE_CBC, IV=key) # 获取ts文件二进制数据 ts = requests.get(ts_url).content # 密文长度不为16的倍数,则添加二进制"0"直到长度为16的倍数 while len(ts) % 16 != 0: ts += b"0" # 写入mp4文件 with open(name, "ab") as file: # decrypt方法的参数需要为16的倍数,如果不是,需要在后面补二进制"0" file.write(sprytor.decrypt(ts)) print(name, "下载完成")到这里就下载完成了。完整代码:import re import requests from Crypto.Cipher import AES # 保存的mp4文件名 name = "dream_it_possible.mp4" # m3u8文件的url url = "http://www.jiuyi.info/static/video/secret/dream_it_possible.m3u8" # 请求头,不一定需要,看网站更改 headers = { "Referer": "http://www.jiuyi.info/video/dream_it_possible", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " "(KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", } print("正在解析:" + url.split("/")[-1]) # 获取m3u8文件内容 r = requests.get(url) # 通过正值表达式获取key和ts的链接 k = re.compile(r"http://.*?\.key") # key的正则匹配 t = re.compile(r"http://.*?\.ts") # ts的正则匹配 key_url = k.findall(r.text)[0] # key的url ts_urls = t.findall(r.text) # ts的url列表 # 下载key的二进制数据 print("正在下载key") key = requests.get(key_url).content # 解密并保存ts for ts_url in ts_urls: ts_name = ts_url.split("/")[-1] # ts文件名 # 解密,new有三个参数, # 第一个是秘钥(key)的二进制数据, # 第二个使用下面这个就好 # 第三个IV在m3u8文件里URI后面会给出,如果没有,可以尝试把秘钥(key)赋值给IV sprytor = AES.new(key, AES.MODE_CBC, IV=key) # 获取ts文件二进制数据 print("正在下载:" + ts_name) ts = requests.get(ts_url).content # 密文长度不为16的倍数,则添加b"0"直到长度为16的倍数 while len(ts) % 16 != 0: ts += b"0" print("正在解密:" + ts_name) # 写入mp4文件 with open(name, "ab") as file: # # decrypt方法的参数需要为16的倍数,如果不是,需要在后面补二进制"0" file.write(sprytor.decrypt(ts)) print("保存成功:" + ts_name) print(name, "下载完成")
2024年03月28日
71 阅读
0 评论
0 点赞
2024-03-28
python爬虫爬取视频时,实现实时进度条显示
一、全部代码展示from contextlib import closing from requests import get url = 'https://v26-web.douyinvod.com/57cdd29ee3a718825bf7b1b14d63955b/615d475f/video/tos/cn/tos-cn-ve-15/72c47fb481464cfda3d415b9759aade7/?a=6383&br=2192&bt=2192&cd=0%7C0%7C0&ch=26&cr=0&cs=0&cv=1&dr=0&ds=4&er=&ft=jal9wj--bz7ThWG4S1ct&l=021633499366600fdbddc0200fff0030a92169a000000490f5507&lr=all&mime_type=video_mp4&net=0&pl=0&qs=0&rc=ank7OzU6ZnRkNjMzNGkzM0ApNmY4aGU8MzwzNzo3ZjNpZWdiYXBtcjQwLXNgLS1kLTBzczYtNS0tMmE1Xi82Yy9gLTE6Yw%3D%3D&vl=&vr=' with closing(get(url, stream=True)) as response: chunk_size = 1024 # 单次请求最大值 # response.headers['content-length']得到的数据类型是str而不是int content_size = int(response.headers['content-length']) # 文件总大小 data_count = 0 # 当前已传输的大小 with open('文件名.mp4', "wb") as file: for data in response.iter_content(chunk_size=chunk_size): file.write(data) done_block = int((data_count / content_size) * 50) # 已经下载的文件大小 data_count = data_count + len(data) # 实时进度条进度 now_jd = (data_count / content_size) * 100 # %% 表示% print("\r [%s%s] %d%% " % (done_block * '█', ' ' * (50 - 1 - done_block), now_jd), end=" ")注:上面的url已过期,需要各位自己去找网页上的视频url二、解释1.with closing我们在日常读取文件资源时,经常会用到with open() as f:的句子。但是使用with语句的时候是需要条件的,任何对象,只要正确实现了上下文管理,就可以使用with语句,实现上下文管理是通过__enter__和__exit__这两个方法实现的。with用法(没有实现上下文管理)class Door(): def open(self): print('Door is opened') def close(self): print('Door is closed') with Door() as d: d.open() d.close()结果报错了:with用法(实现上下文管理)用__enter__和__exit__实现了上下文管理class Door(): def open(self): print('Door is opened') def close(self): print('Door is closed') with Door() as d: d.open() d.close() 结果没报错: closing用法(完美解决上述问题)一个对象没有实现上下文,我们就不能把它用于with语句。这个时候,可以用 contextlib 中的closing()来把该对象变为上下文对象。class Door(): def __enter__(self): print('Begin') return self def __exit__(self, exc_type, exc_value, traceback): if exc_type: print('Error') else: print('End') def open(self): print('Door is opened') def close(self): print('Door is closed') with Door() as d: d.open() d.close()例如:用with语句使用requests中的get(url) 也就是本文中的案例,使用with closing()下载视频(在网页中)2.文件流stream想象一下,如果把文件读取比作向池子里抽水,同步会阻塞程序,异步会等待结果,如果池子非常大呢?因此有了文件流,它就好比你一边抽一边取,不用等池子满了再用,所以对于一些大型文件(几个G的视频)一般会用到这个参数。 (对小型文件也可以使用)3.response.headers['content-length']这表示获取文件的总大小,但是它得到的结果的数据类型是str而不是int,因此需要进行数据类型转换。4.response.iter_content()该方法一般用于从网上下载文件和网页(需要用到requests.get(url))其中chunk_size表示单次请求最大值。5.\r和%\r表示回车(回到行首)%是一种占位符而对于%%,第一个%起到了转义的作用,使结果输出为百分号%
2024年03月28日
99 阅读
0 评论
0 点赞
1
2
3