PyQT实战小项目---筑龙网批量下载链接

  • PyQT是Python桌面GUI的一个非常流行的框架。可以做很多界面优美的库

  • 上代码:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'ZLTool.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox,QFileDialog
import os
import time
import requests
import _thread
from threading import Thread

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow


def convertCookie(cookie_val):
    # 转成字典格式
    return dict(map(lambda x: x.split('='), cookie_val.split(";")))

def downloadFile(name, url, login_cookie):
    '''
    :param name:下载保存的名称
    :param url: 下载链接
    :return:
    '''
    headers = {'Proxy-Connection': 'keep-alive'}
    r = requests.get(url, stream=True, headers=headers,cookies = login_cookie)
    length = float(r.headers['content-length'])
    f = open(name, 'wb')
    count = 0
    count_tmp = 0
    time1 = time.time()
    for chunk in r.iter_content(chunk_size=512):
        if chunk:
            f.write(chunk)
            count += len(chunk)
            if time.time() - time1 > 2:
                p = count / length * 100
                speed = (count - count_tmp) / 1024 / 1024 / 2
                count_tmp = count
                print(name + ': ' + formatFloat(p) + '%' + ' Speed: ' + formatFloat(speed) + 'M/S')
                time1 = time.time()
    f.close()
    print('下载成功!')

def formatFloat(num):
    return '{:.2f}'.format(num)

class Ui_MainWindow(object):
    def __init__(self):
        # 相关变量定义
        self.single_link = '' #单线程 单条链接
        self.more_link = [''] #批量下载
        self.cookies = '' #cookie必填项
        self.file_path = '' #多链接文件形式下载
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(420, 450)
        MainWindow.setMinimumSize(QtCore.QSize(420, 450))
        MainWindow.setMaximumSize(QtCore.QSize(420, 450))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(10, 10, 401, 31))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.lineEdit_SetCookie = QtWidgets.QLineEdit(self.horizontalLayoutWidget)
        self.lineEdit_SetCookie.setObjectName("lineEdit_SetCookie")
        self.horizontalLayout.addWidget(self.lineEdit_SetCookie)
        self.btn_SetCookie = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        self.btn_SetCookie.setObjectName("btn_SetCookie")
        self.btn_SetCookie.clicked.connect(self.checkCookie)
        self.horizontalLayout.addWidget(self.btn_SetCookie)
        self.horizontalLayoutWidget_2 = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(10, 60, 401, 31))
        self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.lineEdit_AddLink = QtWidgets.QLineEdit(self.horizontalLayoutWidget_2)
        self.lineEdit_AddLink.setObjectName("lineEdit_AddLink")
        self.horizontalLayout_2.addWidget(self.lineEdit_AddLink)
        self.btn_AddSingleLink = QtWidgets.QPushButton(self.horizontalLayoutWidget_2)
        self.btn_AddSingleLink.setObjectName("btn_AddSingleLink")
        self.btn_AddSingleLink.clicked.connect(self.checkSingleLink)
        self.horizontalLayout_2.addWidget(self.btn_AddSingleLink)
        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 100, 401, 71))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.btn_AddMoreLink = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.btn_AddMoreLink.setObjectName("btn_AddMoreLink")
        self.btn_AddMoreLink.clicked.connect(self.addMoreLinkFile)
        self.verticalLayout.addWidget(self.btn_AddMoreLink)
        self.label = QtWidgets.QLabel(self.verticalLayoutWidget)
        font = QtGui.QFont()
        font.setUnderline(False)
        font.setStrikeOut(False)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        self.label_3 = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label_3.setText("")
        self.label_3.setObjectName("label_3")
        self.verticalLayout.addWidget(self.label_3)
        self.btn_BeginDownload = QtWidgets.QPushButton(self.centralwidget)
        self.btn_BeginDownload.setGeometry(QtCore.QRect(130, 360, 141, 41))
        self.btn_BeginDownload.setObjectName("btn_BeginDownload")
        self.btn_BeginDownload.clicked.connect(self.DownloadAll)
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(100, 410, 251, 16))
        self.label_2.setObjectName("label_2")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(10, 300, 300, 20))
        self.label_4.setObjectName("label_4")
        self.textEdit_AddMoreLink = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit_AddMoreLink.setGeometry(QtCore.QRect(180, 190, 231, 161))
        self.textEdit_AddMoreLink.setObjectName("textEdit_AddMoreLink")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "筑龙网批量下载工具"))
        self.btn_SetCookie.setText(_translate("MainWindow", "设置Cookie"))
        self.btn_AddSingleLink.setText(_translate("MainWindow", "单条链接下载"))
        self.btn_AddMoreLink.setText(_translate("MainWindow", "添加多条链接(txt文本方法导入)"))
        self.label.setText(_translate("MainWindow", "          强烈推荐使用txt文本导入,采用多线程进行下载,安全可靠."))
        self.btn_BeginDownload.setText(_translate("MainWindow", "开始下载"))
        self.label_2.setText(_translate("MainWindow", "Tip:默认保存路径为本exe文件同级目录下."))
        self.label_4.setText(_translate("MainWindow", "添加多条链接(输入框方法):"))
    def checkCookie(self):
        # 检查cookie是否输入
        self.cookies = self.lineEdit_SetCookie.text()
        if self.cookies == '':
            QMessageBox.about(None, "检查cookie", "当前cookie为空,请在左边输入cookie!")
        else:
            QMessageBox.about(None, "检查cookie", "cookie写入成功!")
    def checkSingleLink(self):
        self.cookies = self.lineEdit_SetCookie.text()
        if self.cookies == '':
            QMessageBox.about(None, "检查cookie", "当前cookie为空,请先输入cookie!")
            return
        self.single_link = self.lineEdit_AddLink.text()
        if self.single_link == '':
            QMessageBox.about(None, "检查链接", "当前链接未输入")
        else:
            QMessageBox.about(None, "检查链接", "当前链接输入成功,现在开始下载")
            cur_cookie = convertCookie(self.cookies)
            #downloadFile(self.single_link[-5:]+".pdf",self.single_link,cur_cookie)
            _thread.start_new_thread(downloadFile,(self.single_link[-5:]+".pdf",self.single_link,cur_cookie))
    def addMoreLinkFile(self):
        # 检查cookie是否输入
        self.cookies = self.lineEdit_SetCookie.text()
        if self.cookies == '':
            QMessageBox.about(None, "检查cookie", "当前cookie为空,请先输入cookie!")
            return
        fileName, filetype = QFileDialog.getOpenFileName(None, "选择文件", "/", "Text Files (*.txt)")
        self.file_path = fileName
        if self.file_path == '':
            QMessageBox.about(None, "选择txt文件", "暂时未选择txt文件,请重新选择")
            return
        else:
            f = open(self.file_path)
            path_name_list =''
            for line in f:
                if line !='':
                    path_name = line.strip()[-5:]+'.pdf'
                    #downloadFile()
                    path_name_list+=line
            f.close() #关闭
            self.textEdit_AddMoreLink.setPlainText(path_name_list) #设置到文本框中。
    def DownloadAll(self):
        # 开始下载
        self.cookies = self.lineEdit_SetCookie.text()
        if self.cookies == '':
            QMessageBox.about(None, "检查cookie", "当前cookie为空,请先输入cookie!")
            return
        cookie_dic = convertCookie(self.cookies) #转换成字典
        str_links = self.textEdit_AddMoreLink.toPlainText()
        if str_links == '':
            QMessageBox.about(None, "检查链接", "当前链接未输入")
            return
        link_list = str_links.split('\n') #分隔符
        for link in link_list:
            if link!='':
                link_str = link.strip()
                if link_str == '':
                    continue
                link_num = link_str[-6:]
                link_name = link_num+'.pdf'
                _thread.start_new_thread(downloadFile,(link_name,link_str,cookie_dic))
        print('所有文件正在下载!')
        if self.file_path != '':
            print('OK, Just Download')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    MainWindow = QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

运行截图:
在这里插入图片描述

运行环境 .NET Framework2.0 开发工具 Microsoft Visual Studio 2005 二. 部分代码说明(主要讲解异步分析和下载): 异步分析下载采取的策略是同时分析同时下载,即未等待数据全部分析完毕就开始把已经分析出来的图片链接开始下载下载成功的均在List框链接前面划上了√ ,未能下载的图片有可能是分析错误或者是下载异常。 1. 异步分析部分代码 /// /// 异步分析下载 /// private void AsyncAnalyzeAndDownload(string url, string savePath) { this.uriString = url; this.savePath = savePath; #region 分析计时开始 count = 0; count1 = 0; freq = 0; result = 0; QueryPerformanceFrequency(ref freq); QueryPerformanceCounter(ref count); #endregion using (WebClient wClient = new WebClient()) { AutoResetEvent waiter = new AutoResetEvent(false); wClient.Credentials = CredentialCache.DefaultCredentials; wClient.DownloadDataCompleted += new DownloadDataCompletedEventHandler(AsyncURIAnalyze); wClient.DownloadDataAsync(new Uri(uriString), waiter); //waiter.WaitOne(); //阻止当前线程,直到收到信号 } } /// /// 异步分析 /// protected void AsyncURIAnalyze(Object sender, DownloadDataCompletedEventArgs e) { AutoResetEvent waiter = (AutoResetEvent)e.UserState; try { if (!e.Cancelled && e.Error == null) { string dnDir = string.Empty; string domainName = string.Empty; string uri = uriString; //获得域名 http://www.sina.com/ Match match = Regex.Match(uri, @"((http(s)?://)?)+[\w-.]+[^/]");//, RegexOptions.IgnoreCase domainName = match.Value; //获得域名最深层目录 http://www.sina.com/mail/ if (domainName.Equals(uri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Music 爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值