了解我的人都知道,我是一个谨言慎行且兴趣爱好广泛的IT,作为一个合格的前端,没事捣鼓一下python很合理吧,再没事搞搞java和php也很合乎逻辑吧,实在没事,玩玩linux服务器也是合乎常理的吧。所以,今天讲的还是python,作为综合篇,主要是对前面的几期博文做一个汇总,在方便进一步理解的同时,也牛刀小试一下,真正的运用起来。
1.前情回顾
lz之前写过几篇关于python的单文件片段化代码,其实这几篇也相当于把python最核心的功能做了一个简化测试,即爬虫和自动化 而这也是python语言的魅力所在。今天这篇博客就针对图片爬取和视频爬取做一个汇总吧。
案例说明:利用python做一个图形化界面,可以通过手动输入网址进行在线爬取图片和视频资源,并打包为exe文件,让小白也能在window电脑上运行起来
2.准备工作
君子有所为,有所不为。在做之前先要考察一下是否可行,就好比你给人说珠穆朗玛峰安装电梯,这种一看就是骗人的鬼话,谁会相信。我这个就不一样了,有理有据有案例,堪称让人信服。
python版本:3.12 window10安装python附带的版本。该版本自带pip,推荐
安装依赖库:pip install tkinter(图形化界面依赖)
pip install pyinstaller (exe打包依赖)
其他的在运行过程中,缺少什么依赖就对应安装就行。
这里常用命令:pip list 列出安装的依赖;php show pyinstaller 展示对应的依赖信息
安装pyinstaller依赖后需要配置一下环境变量,否则会提示命令不存在。
通过cmd打开终端,输入命令:where pyinstaller.。找到pyinstaller依赖所在
我们再把路径复制出来,复制到\xxx\Scripts 目录就行,然后就是环境变量的配置:
这里以window10为例:
打开我的电脑->右键属性->高级系统设置->环境变量->找到系统变量中的path->把刚才复制的路径添加进去->应用和确定
然后再终端输入pyinstaller -v,能出来版本信息就说明搞定了
至此,万事俱备,只欠东风
3.源码解析
先来图形化看看效果吧,手动输入要爬取资源的目标网址,点击对应的下载。图片和视频就会下载到对应的目录,可以通过按钮打开查看下载的文件。
tips:这里的图片和视频爬取因为参考了之前两个博客的代码,所以注意事项可以去参考之前两个博客,后面会附带上完整源码。
源码依旧很简单,就一个py文件。别问为啥,问就是我喜欢一个文件能搞定的绝对不弄多个文件。主打就是一个方便好用,你好我也好大家好。
gui.py代码:
#!/usr/bin/python
# -*- coding: UTF-8 -*-import string
import os
import requests
import random
import re
import tkinter as tkdef on_img_click():input_value = entry.get()print("url路径:", input_value)if not os.path.exists('img'):os.makedirs('img')for num in range(5):value = ''.join(random.sample(string.ascii_letters + string.digits, 8))# 下载图片url = input_valuer = requests.get(url)# 写入图片print("新增一张图片:"+value)with open('img/'+value+'.jpg', "wb") as f:f.write(r.content)# 在界面显示输出的提示output_text.insert(tk.END, f"新增一张图片: {value}.jpg\n")output_text.update_idletasks() # 实时更新界面显示output_text.see(tk.END) # 滚动到最新的输出def open_image_directory():if not os.path.exists('img'):os.makedirs('img')img_directory = os.path.abspath('img')os.startfile(img_directory)def on_video_click():input_value = entry.get()print("url路径:", input_value)if not os.path.exists('videos'):os.makedirs('videos')url=input_valuefor num in range(2):response = requests.get(url)text = response.text# 使用正则表达式提取视频链接video_url = re.search(r'<video src="(.*?)"', text).group(1)response = requests.get("https:" + video_url, stream=True)if response.status_code == 200:if not os.path.exists('videos'):os.makedirs('videos')video_filename = os.path.basename(video_url)with open(os.path.join('videos', video_filename), 'wb') as video_file:for chunk in response.iter_content(chunk_size=1024):video_file.write(chunk)# 在界面显示输出的提示output_text.insert(tk.END, f"新增一个视频: {video_filename}\n")output_text.update_idletasks() # 实时更新界面显示output_text.see(tk.END) # 滚动到最新的输出
def open_video_directory():if not os.path.exists('videos'):os.makedirs('videos')video_directory = os.path.abspath('videos')os.startfile(video_directory)# 创建主窗口
root = tk.Tk()
root.title("自动化爬取图片视频")
root.geometry("600x550") # 设置窗口大小# 创建输入框和按钮
#图片 https://www.onexiaolaji.cn/RandomPicture/api?key=qq249663924
#视频 https://tucdn.wpon.cn/api-girl/index.php
tk.Label(root, text="网络路径:").pack(pady=10)entry=tk.Entry(root, width=60)
entry.pack(pady=5)# 创建一个框架,用于放置按钮并实现居中对齐
frameimg = tk.Frame(root,width=400, height=100)
frameimg.pack(pady=5)
# 下载和打开目录
tk.Button(frameimg, text="图片下载", command=on_img_click).pack(side=tk.LEFT,padx=(0, 20))
tk.Button(frameimg, text="图片目录", command=open_image_directory).pack(side=tk.LEFT,padx=(20, 0))# 创建一个框架,用于放置按钮并实现居中对齐
framevideo = tk.Frame(root,width=400, height=100)
framevideo.pack(pady=5)
# 下载和打开目录
tk.Button(framevideo, text="视频下载", command=on_video_click).pack(side=tk.LEFT,padx=(0, 20))
tk.Button(framevideo, text="视频目录", command=open_video_directory).pack(side=tk.LEFT,padx=(20, 0))# 创建输出提示文本框
output_label = tk.Label(root, text="输出:")
output_label.pack(pady=5)output_text = tk.Text(root, height=15, width=50)
output_text.pack(padx=10, pady=5)# 进入主事件循环
root.mainloop()
运行也简单,cd到代码所在对应目录,python gui.py 运行即可
4.打包exe
这个操作更加简单,简单粗暴的命令:pyinstaller gui.py 即可。打包成功后会在同级目录下有一个dist目录,里面有一个exe文件,就是我们打包的exe啦。但是这个简单粗暴的打包,在运行exe时,会同时显示终端控制台,所以,我们要换下面的打包命令:
pyinstaller --noconsole gui.py
还有可以自定义exe的名称和图标
pyinstaller --name=myapp --icon=myicon.ico gui.py
至此,这个案例就结束啦~