python入门综合篇—资源爬取与exe打包(图形界面)

了解我的人都知道,我是一个谨言慎行且兴趣爱好广泛的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 tk

def 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_value
        r = 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_value
    for 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

至此,这个案例就结束啦~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

会员运营体系设计及SOP梳理

一些做会员的经验和方法分享给大家&#xff0c;包括顶层思考、流程的梳理、组织的建立&#xff0c;后续会做成系列&#xff0c;最近几期主要围绕顶层策略方面&#xff0c;以下是核心内容的整理&#xff1a; 1、会员运营体系设计 顶层设计与关键业务定位&#xff1a;建立客户运营…

【JVM基础篇】Java垃圾回收器介绍

垃圾回收器&#xff08;垃圾回收算法实现&#xff09; 垃圾回收器是垃圾回收算法的具体实现。由于垃圾回收器分为年轻代和老年代&#xff0c;除了G1&#xff08;既能管控新生代&#xff0c;也可以管控老年代&#xff09;之外&#xff0c;新生代、老年代的垃圾回收器必须按照ho…

不容错过!手把手教你开启微信通话自动录音功能!(含手机端和电脑端)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 微信自动录音 📒📝 方法一📝 方法二📝 电脑端自动录音📝 注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 在商务沟通或重要对话中,通话录音功能可以帮助我们记录关键信息,避免遗漏,同时也是证据保存的一种手段。虽然微…

Spark项目通用开发框架

文章目录 1. 大数据项目结构2. 类说明2.1 公共接口类2.2 TaskNameEnum指定每个任务的名称2.3 TaskRunner中编写任务的业务逻辑 3. 任务执行脚本 每个公司内部都有一套自己的架子&#xff0c;一般新人来了就直接在已有的架子上开发业务。 以下仅仅作为记录下自己使用的架子&…

KNIME 5.2.5 版本界面切换

1、安装完KNIME后&#xff0c;点击“Create workflow in your local space.” 2、发现是这个样子 4、进行切换。点击“menu”&#xff0c;最后点击“Switch to classic user interfaceto” 5、最终显示结果&#xff1a;

从零开始做题:logtime

题目 给出1个pcapng文件 解题 wireshark打开题目流量包&#xff0c;在TCP流中发现flag.zip压缩包流量&#xff0c;将flag.zip提取到本地&#xff0c;解压的过程中需要解压密码&#xff0c;接着观察流量 import pyshark import re pcapFilePath logtime.pcapng pcapFilter…

Excel第29享:基于sum嵌套sumifs的多条件求和

1、需求描述 如下图所示&#xff0c;现要统计12.17-12.23这一周各个人员的“上班工时&#xff08;a1&#xff09;”。 下图为系统直接导出的工时数据明细样例。 2、解决思路 首先&#xff0c;确定逻辑&#xff1a;“对多个条件&#xff08;日期、人员&#xff09;进行“工时”…

组件设计原则和度量方法

在日常开发过程中&#xff0c;Spring、Dubbo、Mybatis等都是我们常用的开源框架。当你在使用这些框架时&#xff0c;不可避免需要通过分析源码来理解内部的实现原理。那么&#xff0c;你在翻阅源代码时&#xff0c;有没有想过这些框架的代码结构为什么要这样进行设计和实现呢&a…

爬虫-豆瓣读书排行榜

获取数据 requests库 获取数据环节需要用到requests库。安装方式也简单 pip install requests 爬取页面豆瓣读书 Top 250 用requests库来访问 import requests res requests.get(https://book.douban.com/top250/) 解析&#xff1a; 导入requests库调用了requests库中的…

昇思14天

ResNet50图像分类 1. ResNet50图像分类概述 ResNet50是一种用于图像分类的深度卷积神经网络。图像分类是计算机视觉的基本应用&#xff0c;属于有监督学习范畴。ResNet50通过引入残差结构&#xff0c;解决了深层网络中的退化问题&#xff0c;使得可以训练非常深的网络。 2. …

看到指针就头疼?这篇文章让你对指针有更全面的了解!

文章目录 1.什么是指针2.指针和指针类型2.1 指针-整数2.2 指针的解引用 3.野指针3.1为什么会有野指针3.2 如何规避野指针 4.指针运算4.1 指针-整数4.2 指针减指针4.3 指针的关系运算 5.指针与数组6.二级指针7.指针数组 1.什么是指针 指针的两个要点 1.指针是内存中的一个最小单…

Apache中使用CGI

Apache24 使用Visual Studio 2022 // CGI2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <stdio.h> #include <stdlib.h>#include <stdio.h>void main() {//设置HTML语言printf("Content-type:text/html\n\n&q…

Ansys Zemax|什么是点扩散函数( PSF )

附件下载 联系工作人员获取附件 概览 这篇文章讲述了&#xff1a; 什么是点扩散函数&#xff1f; 点列图 快速傅里叶变换计算的点扩散函数&#xff08;FFT PSF&#xff09; 惠更斯算法计算的点扩散函数&#xff08;Huygens PSF&#xff09; 如何使用非序列模式下的透镜和…

地下水环评(一级)实践技术及Modflow地下水数值模拟

主要围绕的环评导则&#xff0c;结合不同行业类别&#xff0c;实例讲解地下水环境影响评价的原则、内容、工作程序、方法。包括数据处理分析、数值模型构建以及环评报告编写等。涉及地下水流场绘制软件&#xff08;Surfer&#xff09;的操作流程及数据处理、地下水数值模拟软件…

JVM:类的生命周期

文章目录 一、介绍二、加载阶段三、连接阶段1、验证阶段2、准备阶段3、解析阶段 四、初始化阶段 一、介绍 类的生命周期描述了一个类加载、连接&#xff08;验证、准备和解析&#xff09;、初始化、使用、卸载的整个过程。 二、加载阶段 加载&#xff08;Loading&#xff09…

【论文速读】| JADE:用于大语言模型的基于语言学的安全评估平台

本次分享论文&#xff1a;JADE : A Linguistics-based Safety Evaluation Platform for Large Language Models 基本信息 原文作者&#xff1a;Mi Zhang, Xudong Pan, Min Yang 作者单位&#xff1a;Whitzard-AI, System Software and Security Lab Fudan University 关键…

JavaWeb__正则表达式

目录 1. 正则表达式简介2. 正则表达式体验2.1 验证2.2 匹配2.3 替换2.4 全文查找2.5 忽略大小写2.6 元字符使用2.7 字符集合的使用2.8 常用正则表达式 1. 正则表达式简介 正则表达式是描述字符模式的对象。正则表达式用于对字符串模式匹配及检索替换&#xff0c;是对字符串执行…

用SurfaceView实现落花动画效果

上篇文章 Android子线程真的不能刷新UI吗&#xff1f;(一&#xff09;复现异常 中可以看出子线程更新main线程创建的View&#xff0c;会抛出异常。SurfaceView不依赖main线程&#xff0c;可以直接使用自己的线程控制绘制逻辑。具体代码怎么实现了&#xff1f; 这篇文章用Surfa…

vue 中 使用腾讯地图 (动态引用腾讯地图及使用签名验证)

在设置定位的时候使用 腾讯地图 选择地址 在 mounted中引入腾讯地图&#xff1a; this.website.mapKey 为地图的 key // 异步加载腾讯地图APIconst script document.createElement(script);script.type text/javascript;script.src https://map.qq.com/api/js?v2.exp&…

C++11中重要的新特性之 lambda表达式 Part two

序言 在上一篇文章中&#xff0c;我们主要介绍了 C11 中的新增的关键词&#xff0c;以及 范围for循环 这类语法糖的使用和背后的逻辑。在这篇文章中我们会继续介绍一个特别重要的新特性分别是 lambda表达式 。 1. lambda表达式 1.1 lambda的定义 C11 中的 lambda表达式 是一种…