首页 > 编程语言 >Python网站源码下载器

Python网站源码下载器

时间:2024-11-03 14:16:54浏览次数:5  
标签:layout log Python QtWidgets url 源码 folder message 下载

声明:本程序基于Python3.11解释器制作

会有闪退的现象出现不清楚是为什么,有能力请自行修改

(不一定100%会有,但是有概率出现)

import os, re, requests, subprocess, sys, threading, webbrowser, time, random
from urllib.parse import urljoin, urlparse
from PyQt5 import QtWidgets, QtCore

def install(package):
    subprocess.check_call([sys.executable, "-m", "pip", "install", package])

def check_and_install_packages():
    for package in ['requests', 'PyQt5']:
        try:
            __import__(package)
        except ImportError:
            install(package)

def log_message(message):
    log_text.append(message)

def get_website_source(url):
    try:
        response = requests.get(url, timeout=10)
        response.raise_for_status()
        log_message(f"成功获取网站源代码: {url}")
        return response.text
    except requests.RequestException as e:
        log_message(f"无法访问网址: {url}. 错误: {e}")
        return None

def extract_resources(html_content, base_url):
    links = re.findall(r'<link[^>]+href="([^"]+)"|<script[^>]+src="([^"]+)"|<img[^>]+src="([^"]+)"|<a[^>]+href="([^"]+\.html?)"', html_content)
    return {urljoin(base_url, link) for group in links for link in group if link}

def download_resource(url, folder, delay):
    try:
        time.sleep(delay)
        response = requests.get(url, stream=True, timeout=10)
        response.raise_for_status()
        filename = os.path.join(folder, os.path.basename(urlparse(url).path) or 'index.html')
        with open(filename, 'wb') as file:
            for data in response.iter_content(8192):
                file.write(data)
        log_message(f"下载完成: {url}")
    except Exception as e:
        log_message(f"下载失败: {url}. 错误: {e}")

def process_resources(url, folder, delay):
    html_content = get_website_source(url)
    if html_content:
        resources = extract_resources(html_content, url)
        log_message(f"找到 {len(resources)} 个资源,开始下载...")
        for resource in resources:
            threading.Thread(target=download_resource, args=(resource, folder, delay)).start()

def start_download():
    url, folder = url_entry.text(), path_entry.text()
    if url and folder:
        delay = 1 if high_frequency_var.isChecked() and QtWidgets.QMessageBox.question(window, "警告", "您选择了高频访问,可能会被防火墙拦截。是否继续?") == QtWidgets.QMessageBox.Yes else random.randint(10, 20)
        log_message("开始下载...")
        process_resources(url, folder, delay)
        log_message("下载任务已提交,请等待完成。")

def browse_folder():
    folder_selected = QtWidgets.QFileDialog.getExistingDirectory(window)
    if folder_selected:
        path_entry.setText(folder_selected)

def exit_program():
    QtWidgets.qApp.quit()

def open_contact_link():
    webbrowser.open("mailto:[email protected]")

def show_warning_message():
    msg = QtWidgets.QMessageBox()
    msg.setIcon(QtWidgets.QMessageBox.Warning)
    msg.setText("本工具仅供学习,禁止用于违法用途,禁止将爬取的网站资源文件私自使用,一切版权归属于原网站")
    msg.setWindowTitle("警告")
    msg.setStyleSheet("QLabel { color : red; }")
    msg.setStandardButtons(QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel)
    msg.setWindowModality(QtCore.Qt.ApplicationModal)
    msg.setWindowFlags(msg.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
    return msg.exec_()

check_and_install_packages()
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
window.setWindowTitle("网站源码下载工具 v1.0测试版")
window.setFixedSize(600, 600)
window.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)

if show_warning_message() == QtWidgets.QMessageBox.Cancel:
    exit_program()

layout = QtWidgets.QVBoxLayout()
layout.addWidget(QtWidgets.QLabel("请输入网址(请使用快捷方式粘贴):"))
url_entry = QtWidgets.QLineEdit()
url_entry.setContextMenuPolicy(QtCore.Qt.NoContextMenu) 
layout.addWidget(url_entry)

layout.addWidget(QtWidgets.QLabel("请选择保存路径:"))
path_entry = QtWidgets.QLineEdit()
path_entry.setContextMenuPolicy(QtCore.Qt.NoContextMenu)
layout.addWidget(path_entry)

button_layout = QtWidgets.QHBoxLayout()
button_layout.addWidget(QtWidgets.QPushButton("浏览", clicked=browse_folder))
button_layout.addWidget(QtWidgets.QPushButton("下载资源", clicked=start_download))
button_layout.addWidget(QtWidgets.QPushButton("退出", clicked=exit_program))
layout.addLayout(button_layout)

layout.addWidget(QtWidgets.QPushButton("联系我", clicked=open_contact_link))
high_frequency_var = QtWidgets.QCheckBox("使用高频访问(可能会被防火墙拦截)")
layout.addWidget(high_frequency_var)

log_text = QtWidgets.QTextEdit()
log_text.setReadOnly(True)
log_text.setContextMenuPolicy(QtCore.Qt.NoContextMenu)
layout.addWidget(log_text)

window.setLayout(layout)
window.show()
sys.exit(app.exec_())

73fd9087cebe41dfb06fcc5d5b07e893.png

需要安装运行库,否则直接报错,解释器随便都可以

有问题请联系我,在本平台上不要通过分享代码中的联系方式,我并不会回复

标签:layout,log,Python,QtWidgets,url,源码,folder,message,下载
From: https://blog.csdn.net/2402_87876495/article/details/143450220

相关文章

  • python-有关循环语句的基础知识
    Python是一种高级编程语言,具有简洁、灵活的特点。在Python中,循环语句是非常重要的语法之一。下面将介绍Python中常用的循环语句,包括forin循环、while循环以及与循环相关的else语句、continue语句、break语句、if-elif-else、forin语句的嵌套、while循环中的if-elif-else语句......
  • (开题报告)django+vue停车场系统论文+源码
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着现代社会汽车保有量的不断增加,停车场的管理变得日益复杂和重要。关于停车场系统的研究,现有研究主要以传统的管理方式为主,如简单的人工......
  • WEB期末大作业——我的家乡济南(源码)
    一、......
  • 华为OD机试-E卷,100分 - 最小的调整次数特异性双端队列Java & Python& JS & C++ & C
    最新华为OD机试题目描述有一个特异性的双端队列,该队列可以从头部或尾部添加数据,但是只能从头部移出数据。小A依次执行2n个指令往队列中添加数据和移出数据。其中n个指令是添加数据(可能从头部添加、也可能从尾部添加),依次添加1到n;n个指令是移出数据。现在要求移除数据的顺......
  • 华为OD机试-E卷100分 -货币单位换算Java & Python& JS & C++ & C
    最新华为OD机试题目描述记账本上记录了若干条多国货币金额,需要转换成人民币分(fen),汇总后输出。每行记录一条金额,金额带有货币单位,格式为数字+单位,可能是单独元,或者单独分,或者元与分的组合。要求将这些货币全部换算成人民币分(fen)后进行汇总,汇总结果仅保留整数,小数部分舍弃......
  • (开题报告)django+vue旅游管理系统论文+源码
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于旅游管理系统的研究,现有研究主要以传统的开发模式为主,专门针对django+vue技术组合开发旅游管理系统的研究较少。在旅游市场蓬勃......
  • 基于SpringBoot+Vue的广东省家庭旅游接待信息管理系统(源码+LW+调试文档+讲解)
    项目简介背景随着旅游业的蓬勃发展,家庭旅游在广东省越来越受欢迎。家庭旅游接待作为一种特色旅游模式,为游客提供了独特的体验,但目前在信息管理方面存在诸多不足。一方面,家庭旅游接待户信息分散,包括接待能力、服务项目、价格、地理位置等信息缺乏统一的收集和整理渠道,游客......
  • 基于SpringBoot+Vue的公司考勤管理系统(源码+LW+调试文档+讲解)
    项目简介背景在公司日常运营中,考勤管理是人力资源管理的重要组成部分。随着公司规模的扩大和业务模式的多样化,传统的考勤方式(如人工签到、纸质打卡)暴露出诸多问题。一方面,这些方式效率低下,容易造成员工上下班打卡拥堵,浪费时间。另一方面,数据统计和分析困难,考勤数据易丢失......