├── .gitignore ├── APIs.py ├── QSSwhite.py ├── README.md ├── ToolFuncs.py ├── ToolUI.py ├── ToolUI.ui ├── White ├── 201752212221.png ├── 2017522122216.png ├── 2017522122222.png ├── arrowBottom.png ├── arrowLeft.png ├── arrowRight.png ├── arrowTop.png ├── b721a1c9956b6e836cbdb6c57691ef09.png ├── bottomArrow.png ├── bottomArrowHover.png ├── checkBox.png ├── checkBoxChecked.png ├── checkBoxCheckedHover.png ├── checkBoxCheckedPressed.png ├── checkBoxHover.png ├── checkBoxIndeterminate.png ├── checkBoxIndeterminateHover.png ├── checkBoxIndeterminatePressed.png ├── checkBoxPressed.png ├── close.png ├── closeHover.png ├── closePressed.png ├── delete.png ├── deleteHover.png ├── deletePressed.png ├── downButton.png ├── e52d9567c015cdb440344305380739e7.png ├── error.png ├── feedback.png ├── feedbackHover.png ├── feedbackPressed.png ├── information.png ├── left.png ├── maximize.png ├── maximizeHover.png ├── maximizePressed.png ├── minimize.png ├── minimizeHover.png ├── minimizePressed.png ├── nscc.png ├── ooopic_1484987787.ico ├── ooopic_1484987787.png ├── ooopic_1495455270.png ├── open.png ├── openHover.png ├── openPressed.png ├── progressBar.png ├── progressBarChunk.png ├── question.png ├── radioButton.png ├── radioButtonChecked.png ├── radioButtonCheckedHover.png ├── radioButtonCheckedPressed.png ├── radioButtonHover.png ├── radioButtonPressed.png ├── restore.png ├── restoreHover.png ├── restorePressed.png ├── right.png ├── scan.png ├── skin.png ├── skinHover.png ├── skinPressed.png ├── success.png ├── topArrow.png ├── topArrowHover.png ├── transfer.png ├── upButton.png └── warning.png ├── doc ├── 000.gif ├── 001.gif ├── 001.png ├── 002.png └── 003.png ├── dsr_ids.txt ├── img_links.txt └── link_ids.txt /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__/ 2 | *.csv 3 | *.exe 4 | *.json 5 | 6 | -------------------------------------------------------------------------------- /APIs.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import requests 4 | import json 5 | import re 6 | from bs4 import BeautifulSoup as bs 7 | 8 | 9 | class Spiders(object): 10 | def __init__(self): 11 | self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' 12 | ' (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} 13 | self.headers_m = {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 ' 14 | '(KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'} 15 | 16 | 17 | # 形成富文本,参数是文本内容和字体颜色 18 | def getmsg(self,themsg,thecolor): 19 | msg = '
{}
'.format(thecolor,themsg) 20 | return msg 21 | 22 | # 从文件读取信息,返回一个列表 23 | def get_Infos(self, filename): 24 | Infos = [] 25 | with open(filename, 'r') as f: 26 | data = f.readlines() 27 | for each in data: 28 | if len(each.strip()) > 0: 29 | Infos.append(each.strip()) 30 | return Infos 31 | 32 | # 获取单个天猫商品DSR 33 | def get_TM(self, id, outfile): 34 | url = 'https://dsr-rate.tmall.com/list_dsr_info.htm?itemId=%s' % id 35 | res = requests.get(url, headers=self.headers) 36 | html = res.text 37 | date = re.findall('json.*?\((.*)\)', html)[0] 38 | dsr = json.loads(date)['dsr'] # 转换成字典格式 39 | DSR = id + ',' + str(dsr['gradeAvg']).strip() + ',' + str(dsr['rateTotal']).strip() 40 | with open(outfile, 'a') as f: 41 | f.write(DSR + '\n') 42 | return 43 | 44 | # 获取单个京东商品DSR 45 | def get_JD(self, id, outfile): 46 | url = 'https://club.jd.com/comment/productCommentSummaries.action?referenceIds=%s' % id 47 | res = requests.get(url, headers=self.headers) 48 | html = res.text 49 | dic = json.loads(html)['CommentsCount'][0] 50 | SkuId = str(dic['SkuId']).strip() # 商品ID 51 | GoodRate = str(dic['GoodRate']).strip() # 好评率 52 | GoodCount = str(dic['GoodCount']).strip() # 好评数 53 | GeneralCount = str(dic['GeneralCount']).strip() # 中评数 54 | PoorCount = str(dic['PoorCount']).strip() # 差评数 55 | DSR = SkuId + ',' + GoodRate + ',' + GoodCount + ',' + GeneralCount + ',' + PoorCount 56 | with open(outfile, 'a') as f: 57 | f.write(DSR + '\n') 58 | return 59 | 60 | # 获取天猫主图链接和价格 61 | def getimglink(self, ID, outfile): 62 | # 打开手机端网页 63 | url = "https://detail.m.tmall.com/item.htm?id={}".format(ID) 64 | html = requests.get(url, headers=self.headers_m).text 65 | try: 66 | soup = bs(html, "lxml") 67 | imglink = "https:" + soup.select("div.itbox > a > img")[0].get("src") 68 | except: 69 | imglink = "miss" 70 | infos = re.findall('"price":"(\d+?\.\d\d)"', html) 71 | try: 72 | maxprice = max(list(map(float, infos))) 73 | minprice = min(list(map(float, infos))) 74 | except ValueError: 75 | maxprice = max(infos) 76 | minprice = min(infos) 77 | except: 78 | maxprice = "miss" 79 | minprice = "miss" 80 | thestr = ",".join([str(ID), imglink, str(maxprice), str(minprice)]) 81 | with open(outfile, "a") as f: 82 | f.write(thestr + "\n") 83 | 84 | # 下载图片 85 | def downimg(self, savefile, savename, url): 86 | item = requests.get(url, headers=self.headers).content 87 | Imgname = savefile + '\\' + savename + '.jpg' 88 | with open(Imgname, 'wb') as f: 89 | f.write(item) 90 | return -------------------------------------------------------------------------------- /QSSwhite.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | class QSS(): 4 | def __init__(self): 5 | self.White = '''/**********主界面样式**********/ 6 | QWidget#MainWindow { 7 | font-family:Microsoft YaHei; 8 | font-size:13px; 9 | border: 0px solid rgb(111, 156, 207); 10 | background: rgb(232, 241, 252); 11 | } 12 | QWidget#messageWidget { 13 | background: rgba(173, 202, 232, 50%); 14 | } 15 | /**********菜单栏**********/ 16 | QMenuBar { 17 | font-size:13px; 18 | background: rgb(187, 212, 238); 19 | border: 1px solid rgb(111, 156, 207); 20 | border-left: none; 21 | border-right: none; 22 | } 23 | QMenuBar::item { 24 | font-size:13px; 25 | font-family:Microsoft YaHei; 26 | border: 0px solid transparent; 27 | padding: 5px 10px 5px 10px; 28 | background: transparent; 29 | } 30 | QMenuBar::item:enabled { 31 | font-size:13px; 32 | color: rgb(2, 65, 132); 33 | } 34 | QMenuBar::item:!enabled { 35 | color: rgb(155, 155, 155); 36 | } 37 | QMenuBar::item:enabled:selected { 38 | border-top-color: rgb(111, 156, 207); 39 | border-bottom-color: rgb(111, 156, 207); 40 | background: rgb(198, 224, 252); 41 | } 42 | /**********菜单**********/ 43 | QMenu { 44 | font-size:13px; 45 | font-family:Microsoft YaHei; 46 | border: 1px solid rgb(111, 156, 207); 47 | background: rgb(232, 241, 250); 48 | } 49 | QMenu::item { 50 | font-family:Microsoft YaHei; 51 | height: 18px; 52 | padding: 5px 25px 5px 20px; 53 | padding-left: 30px; 54 | padding-right: 12px; 55 | } 56 | QMenu::item:enabled { 57 | color: rgb(84, 84, 84); 58 | } 59 | QMenu::item:!enabled { 60 | color: rgb(155, 155, 155); 61 | } 62 | QMenu::item:enabled:selected { 63 | color: rgb(2, 65, 132); 64 | background: rgba(255, 255, 255, 200); 65 | } 66 | QMenu::separator { 67 | height: 1px; 68 | background: rgb(111, 156, 207); 69 | } 70 | QMenu::indicator { 71 | width: 13px; 72 | height: 13px; 73 | } 74 | QMenu::icon { 75 | padding-left: 12px; 76 | padding-right: 0px; 77 | } 78 | 79 | /**********状态栏**********/ 80 | QStatusBar { 81 | font-size:13px; 82 | font-family:Microsoft YaHei; 83 | background: rgb(187, 212, 238); 84 | border: 1px solid rgb(111, 156, 207); 85 | border-left: none; 86 | border-right: none; 87 | border-bottom: none; 88 | } 89 | QStatusBar::item { 90 | font-family:Microsoft YaHei; 91 | border: none; 92 | border-right: 1px solid rgb(111, 156, 207); 93 | } 94 | /**********分组框**********/ 95 | QGroupBox { 96 | font-size:13px; 97 | font-family:Microsoft YaHei; 98 | border: 1px solid rgb(111, 156, 207); 99 | border-radius: 4px; 100 | margin-top: 10px; 101 | } 102 | QGroupBox::title { 103 | font-family:Microsoft YaHei; 104 | color: rgb(56, 99, 154); 105 | top: -10px; 106 | left: 10px; 107 | } 108 | /**********滚动条-垂直**********/ 109 | QScrollBar:vertical { 110 | width: 20px; 111 | background: transparent; 112 | margin-left: 3px; 113 | margin-right: 3px; 114 | } 115 | QScrollBar::handle:vertical { 116 | width: 20px; 117 | min-height: 30px; 118 | background: rgb(170, 200, 230); 119 | margin-top: 15px; 120 | margin-bottom: 15px; 121 | } 122 | QScrollBar::handle:vertical:hover { 123 | background: rgb(165, 195, 225); 124 | } 125 | QScrollBar::sub-line:vertical { 126 | height: 15px; 127 | background: transparent; 128 | image: url("White/topArrow.png"); 129 | subcontrol-position: top; 130 | } 131 | QScrollBar::add-line:vertical { 132 | height: 15px; 133 | background: transparent; 134 | image: url("White/bottomArrow.png"); 135 | subcontrol-position: bottom; 136 | } 137 | QScrollBar::sub-line:vertical:hover { 138 | background: rgb(170, 200, 230); 139 | } 140 | QScrollBar::add-line:vertical:hover { 141 | background: rgb(170, 200, 230); 142 | } 143 | QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { 144 | background: transparent; 145 | } 146 | 147 | QScrollBar#verticalScrollBar:vertical { 148 | margin-top: 30px; 149 | } 150 | /**********页签项**********/ 151 | QTabWidget::pane { 152 | font-family:Microsoft YaHei; 153 | border: none; 154 | border-top: 3px solid rgb(0, 78, 161); 155 | background: rgb(187, 212, 238); 156 | } 157 | QTabWidget::tab-bar { 158 | border: none; 159 | } 160 | QTabBar::tab { 161 | font-family:Microsoft YaHei; 162 | border: none; 163 | border-top-left-radius: 4px; 164 | border-top-right-radius: 4px; 165 | color: white; 166 | background: rgb(120, 170, 220); 167 | height: 28px; 168 | min-width: 85px; 169 | margin-right: 5px; 170 | padding-left: 5px; 171 | padding-right: 5px; 172 | } 173 | QTabBar::tab:hover { 174 | background: rgb(0, 78, 161); 175 | } 176 | QTabBar::tab:selected { 177 | color: white; 178 | background: rgb(0, 78, 161); 179 | } 180 | 181 | QTabWidget#tabWidget::pane { 182 | border: 1px solid rgb(111, 156, 207); 183 | background: rgb(232, 241, 252); 184 | margin-top: -1px; 185 | } 186 | 187 | QTabBar#tabBar::tab { 188 | border: 1px solid rgb(111, 156, 207); 189 | border-bottom: none; 190 | color: rgb(70, 71, 73); 191 | background: transparent; 192 | } 193 | QTabBar#tabBar::tab:hover { 194 | color: rgb(2, 65, 132); 195 | } 196 | QTabBar#tabBar::tab:selected { 197 | color: rgb(2, 65, 132); 198 | background: rgb(232, 241, 252); 199 | } 200 | /**********进度条**********/ 201 | QProgressBar { 202 | border: none; 203 | text-align: center; 204 | color: white; 205 | background-color: transparent; 206 | background-image: url("White/progressBar.png"); 207 | background-repeat: repeat-x; 208 | } 209 | QProgressBar::chunk { 210 | border: none; 211 | background-color: transparent; 212 | background-image: url("White/progressBarChunk.png"); 213 | background-repeat: repeat-x; 214 | } 215 | /**********单选框**********/ 216 | QRadioButton{ 217 | font-size:13px; 218 | spacing: 5px; 219 | } 220 | QRadioButton:enabled:checked{ 221 | color: rgb(2, 65, 132); 222 | } 223 | QRadioButton:enabled:!checked{ 224 | color: rgb(70, 71, 73); 225 | } 226 | QRadioButton:enabled:hover{ 227 | color: rgb(0, 78, 161); 228 | } 229 | QRadioButton:!enabled{ 230 | color: rgb(80, 80, 80); 231 | } 232 | QRadioButton::indicator { 233 | width: 20px; 234 | height: 20px; 235 | } 236 | QRadioButton::indicator:unchecked { 237 | image: url("White/radioButton.png"); 238 | } 239 | QRadioButton::indicator:unchecked:hover { 240 | image: url("White/radioButtonHover.png"); 241 | } 242 | QRadioButton::indicator:unchecked:pressed { 243 | image: url("White/radioButtonPressed.png"); 244 | } 245 | QRadioButton::indicator:checked { 246 | image: url("White/radioButtonChecked.png"); 247 | } 248 | QRadioButton::indicator:checked:hover { 249 | image: url("White/radioButtonCheckedHover.png"); 250 | } 251 | QRadioButton::indicator:checked:pressed { 252 | image: url("White/radioButtonCheckedPressed.png"); 253 | } 254 | /**********输入框**********/ 255 | QLineEdit { 256 | border-radius: 4px; 257 | height: 25px; 258 | border: 1px solid rgb(111, 156, 207); 259 | background: white; 260 | } 261 | QLineEdit:enabled { 262 | color: rgb(84, 84, 84); 263 | } 264 | QLineEdit:enabled:hover, QLineEdit:enabled:focus { 265 | color: rgb(51, 51, 51); 266 | } 267 | QLineEdit:!enabled { 268 | color: rgb(80, 80, 80); 269 | } 270 | /**********文本编辑框**********/ 271 | QTextEdit { 272 | font-family:Microsoft YaHei; 273 | font:12px; 274 | border: 1px solid rgb(111, 156, 207); 275 | color: rgb(70, 71, 73); 276 | background: rgb(187, 212, 238); 277 | } 278 | /**********滚动区域**********/ 279 | QScrollArea { 280 | border: 1px solid rgb(111, 156, 207); 281 | background: rgb(187, 212, 238); 282 | } 283 | /**********滚动区域**********/ 284 | QWidget#transparentWidget { 285 | background: transparent; 286 | } 287 | /**********标签**********/ 288 | QLabel { 289 | font-family:Microsoft YaHei; 290 | font:13px; 291 | color: rgb(0, 160, 230); 292 | } 293 | /**********按钮**********/ 294 | QPushButton{ 295 | border-radius: 4px; 296 | border: none; 297 | width: 75px; 298 | height: 25px; 299 | } 300 | QPushButton:enabled { 301 | background: rgb(120, 170, 220); 302 | color: white; 303 | } 304 | QPushButton:!enabled { 305 | background: rgb(180, 180, 180); 306 | color: white; 307 | } 308 | QPushButton:enabled:hover{ 309 | background: rgb(100, 140, 230); 310 | } 311 | QPushButton:enabled:pressed{ 312 | background: rgb(0, 78, 161); 313 | }''' -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## PYQT5 电商小工具 2 | 项目结构 3 | - ToolUI.py 4 | 主界面程序代码,使用PYQT5的designer产生的文件(ToolUI.ui)转换成的python代码 5 | - ToolFuncs.py 6 | 主要的函数部分,将界面与函数结合起来 7 | - APIs.py 8 | 爬虫API类,负责爬虫的运行,供主代码调用接口 9 | - QSSwhite.py 10 | QSS代码,本来应该放在一个.css文件中调用的,但是打包之后调用不了,所以封装成Python文件直接调用,这样有个弊端就是打包之后不能随意换风格样式了。 11 | - ToolUI.ui 12 | PYQT5的模板文件,可以转换成py文件 13 | - White 14 | 放置程序主界面及QSS调用的图片,只用到了一部分,但是懒得删其他的了 15 | - 其他文件(可以自定义的) 16 | - PICs 17 | 一个存放下载图片的文件夹,是程序第三个模块默认存放图片的文件夹,可以按照保存路径的设置自行更改 18 | - dsr_ids.txt 19 | 程序第一个模块默认读取ID的文件,可以根据实际需求更改名称 20 | - link_ids.txt 21 | 程序第二个模块默认读取ID的文件,可以根据实际需求更改名称 22 | - img_links.txt 23 | 程序第三个模块默认读取链接的文件,可以根据实际需求更改名称 24 | 25 | 项目功能 26 | - 参见程序的各个模块的说明 27 | 28 | 项目运行 29 | - 按照每个模块的“操作流程”中的指示操作就行,很简单,不做解释 30 | 直接放图看效果吧 31 | - 三个模块的不同界面: 32 |  33 |  34 |  35 | - 整体界面效果GIF动图: 36 |  37 | - 第一个模块操作效果的GIF动图: 38 |  39 | 40 | 41 | 程序打包 42 | - Pyinstaller 43 | 打包方法:http://www.cnblogs.com/gopythoner/p/6337543.html 44 | 45 | -------------------------------------------------------------------------------- /ToolFuncs.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from PyQt5 import QtCore, QtWidgets 4 | from ToolUI import Ui_MainWindow 5 | import sys 6 | from APIs import Spiders 7 | import datetime 8 | import time 9 | import os.path 10 | 11 | 12 | class MainUI(Ui_MainWindow): 13 | def __init__(self): 14 | super().__init__() 15 | self.aboutmsg = "程序使用PYQT5编写,最新版本4.2\n\n本软件的设计初衷是为了解决本人个人工作中的某些任务," \ 16 | "但是本着通用性和共享的原则,本软件可以扩展用到工作之外,不过软件还有很多不足之处有待完善。\n\n" \ 17 | "程序分为三个功能,前两个功能涉及到利用爬虫技术爬取网站信息,因此一旦网页内容有较大变动," \ 18 | "则原信息提取方式会失效,程序也会自动报错,如若程序无法继续使用,可以联系作者进行反馈!!\n\n" \ 19 | "编译日期:2017-5-27\n" 20 | self.authormsg = "作者:爱尔兰咖啡\n\nGithub:https://github.com/Hopetree\n\n如果对本款小工具有疑问或者发现Bug," \ 21 | "可以与本人联系交流!\n\n联系QQ:675737972\n" 22 | 23 | self.actionOpenfile.triggered.connect(QtWidgets.QFileDialog.getOpenFileName) # 查看当前文件夹 24 | self.actionQiut.triggered.connect(self.close) # 菜单栏退出按钮函数 25 | self.actionAbout.triggered.connect(lambda: self.selectInfo("关于软件", self.aboutmsg)) # 关于软件 26 | self.actionAuthor.triggered.connect(lambda: self.selectInfo("作者", self.authormsg)) # 关于作者 27 | self.pushButton_1.clicked.connect(self.startdsr) # DSR开始按钮 28 | self.pushButton_2.clicked.connect(self.startlink) # 主图开始按钮 29 | self.pushButton_3.clicked.connect(self.startimg) # 批量下载图片开始按钮 30 | 31 | # 重写关闭函数 32 | def closeEvent(self, event): 33 | reply = QtWidgets.QMessageBox.question(self, '关闭程序', 34 | "关闭程序可能导致正在进行的操作终止,请确认\n是否退出并关闭程序?", 35 | QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) 36 | if reply == QtWidgets.QMessageBox.Yes: 37 | event.accept() 38 | else: 39 | event.ignore() 40 | 41 | # 消息框函数,传入2个参数,第1个是标题,第2个是显示内容 42 | def selectInfo(self, thetitle, megs): 43 | QtWidgets.QMessageBox.about(self, thetitle, megs) 44 | 45 | # 提取DSR中商品类型 46 | def changePD(self): 47 | if self.radioButton_1.isChecked(): 48 | product = "tmall" 49 | if self.radioButton_2.isChecked(): 50 | product = "jingdong" 51 | return product 52 | 53 | # 更新状态栏 54 | def statusshow(self, astr): 55 | self.statusbar.showMessage(astr) 56 | 57 | # DSR槽函数--------------------------------------------------------------------------------------------------- 58 | # 启动DSR线程的槽函数 59 | def startdsr(self): 60 | self.statusbar.setStyleSheet("color:green") 61 | self.pushButton_1.setDisabled(True) # 线程启动锁定按钮 62 | self.textEdit_1.setText("") # 插入一个空白,每次启动线程都可以清屏 63 | txtname = self.lineEdit_1.text() 64 | product = self.changePD() 65 | self.dsrthread = dsrThread(txtname, product) 66 | self.dsrthread.status_signal.connect(self.statusshow) 67 | self.dsrthread.dsrtext_signal.connect(self.dsrtextshow) 68 | self.dsrthread.dsrprogmax_signal.connect(self.dsrprog_max) 69 | self.dsrthread.dsrprog_signal.connect(self.dsrprog_value) 70 | self.dsrthread.finished.connect(self.dsrpushon) # 线程结束执行函数 71 | self.dsrthread.start() 72 | 73 | # 线程结束后开启DSR按钮 74 | def dsrpushon(self): 75 | self.pushButton_1.setDisabled(False) 76 | 77 | # 更新DSR输出文本 78 | def dsrtextshow(self, astr): 79 | self.textEdit_1.append(astr) 80 | 81 | # 获取DSR进度条最大值 82 | def dsrprog_max(self, n): 83 | self.progressBar_1.setMinimum(0) 84 | self.progressBar_1.setMaximum(n) 85 | 86 | # 更新DSR进度条 87 | def dsrprog_value(self, i): 88 | self.progressBar_1.setValue(i) 89 | 90 | # 主图链接槽函数------------------------------------------------------------------------------------------------ 91 | def startlink(self): 92 | self.statusbar.setStyleSheet("color:blue") 93 | self.pushButton_2.setDisabled(True) # 线程启动锁定按钮 94 | self.textEdit_2.setText("") # 插入一个空白,每次启动线程都可以清屏 95 | txtname = self.lineEdit_2.text() 96 | self.linkthread = linkThread(txtname) 97 | self.linkthread.status_signal.connect(self.statusshow) 98 | self.linkthread.linktext_signal.connect(self.linktextshow) 99 | self.linkthread.progmax_signal.connect(self.linkprog_max) 100 | self.linkthread.progvalue_signal.connect(self.linkprog_value) 101 | self.linkthread.finished.connect(self.linkpushon) # 线程结束执行函数 102 | self.linkthread.start() 103 | 104 | def linkpushon(self): 105 | self.pushButton_2.setDisabled(False) 106 | 107 | def linktextshow(self, astr): 108 | self.textEdit_2.append(astr) 109 | 110 | def linkprog_max(self, n): 111 | self.progressBar_2.setMinimum(0) 112 | self.progressBar_2.setMaximum(n) 113 | 114 | def linkprog_value(self, i): 115 | self.progressBar_2.setValue(i) 116 | 117 | # 批量下载图片槽函数---------------------------------------------------------------------------------------------- 118 | def startimg(self): 119 | self.statusbar.setStyleSheet("color:green") 120 | self.pushButton_3.setDisabled(True) # 线程启动锁定按钮 121 | self.textEdit_3.setText("") # 插入一个空白,每次启动线程都可以清屏 122 | txtname = self.lineEdit_31.text() 123 | imgfile = self.lineEdit_32.text() 124 | self.imgthread = imgThread(txtname, imgfile) 125 | self.imgthread.status_signal.connect(self.statusshow) 126 | self.imgthread.imgtext_signal.connect(self.imgtextshow) 127 | self.imgthread.progmax_signal.connect(self.imgprog_max) 128 | self.imgthread.progvalue_signal.connect(self.imgprog_value) 129 | self.imgthread.finished.connect(self.imgpushon) # 线程结束执行函数 130 | self.imgthread.start() 131 | 132 | def imgpushon(self): 133 | self.pushButton_3.setDisabled(False) 134 | 135 | def imgtextshow(self, astr): 136 | self.textEdit_3.append(astr) 137 | 138 | def imgprog_max(self, n): 139 | self.progressBar_3.setMinimum(0) 140 | self.progressBar_3.setMaximum(n) 141 | 142 | def imgprog_value(self, i): 143 | self.progressBar_3.setValue(i) 144 | 145 | 146 | # DSR线程 147 | class dsrThread(QtCore.QThread): 148 | status_signal = QtCore.pyqtSignal(str) # 发送给状态栏的信号 149 | dsrtext_signal = QtCore.pyqtSignal(str) # 发送给DSR输出框的信号 150 | dsrprogmax_signal = QtCore.pyqtSignal(int) # 发送给进度条的信号,给出最大值 151 | dsrprog_signal = QtCore.pyqtSignal(int) # 发送给进度条的信号,给出每次刷新的进度 152 | 153 | def __init__(self, txtname, product): # 参数:读取的文件名,商品类型 154 | super().__init__() 155 | self.txtname = txtname 156 | self.product = product 157 | self.api = Spiders() 158 | 159 | def run(self): 160 | start = time.time() 161 | T = datetime.datetime.now() 162 | self.status_signal.emit("当前状态:正在进行DSR提取操作...") 163 | try: 164 | IDs = self.api.get_Infos(self.txtname) 165 | except: 166 | self.dsrtext_signal.emit(self.api.getmsg("读取文件失败,请检查文件名称是否有误!", "red")) 167 | else: 168 | nums = len(IDs) 169 | self.dsrprogmax_signal.emit(nums) 170 | i = 1 171 | if self.product == "tmall": 172 | outfile = "TMdsr_" + T.strftime("%Y%m%d%H%M") + "_" + str(nums) + ".csv" 173 | self.dsrtext_signal.emit(self.api.getmsg("商品类型为【天猫商品】,有效ID总计{}个,开始提取DSR".format(nums), "#464749")) 174 | with open(outfile, 'w') as f: 175 | f.write('商品ID,评分,评论数\n') 176 | for each in IDs: 177 | try: 178 | self.api.get_TM(each, outfile) 179 | except: 180 | msg_b = "总计{}个商品ID,第{}个商品:{}写入信息失败!".format(nums, i, each) 181 | self.dsrtext_signal.emit(self.api.getmsg(msg_b, "red")) 182 | else: 183 | msg_c = "总计{}个商品ID,成功写入第{}个天猫商品:{}".format(nums, i, each) 184 | self.dsrtext_signal.emit(self.api.getmsg(msg_c, "#464749")) 185 | self.dsrprog_signal.emit(i) 186 | i += 1 187 | elif self.product == "jingdong": 188 | outfile = "JDdsr_" + T.strftime("%Y%m%d%H%M") + "_" + str(nums) + ".csv" 189 | self.dsrtext_signal.emit(self.api.getmsg("商品类型为【京东商品】,有效ID总计{}个,开始提取DSR".format(nums), "#464749")) 190 | with open(outfile, 'w') as f: 191 | f.write('SKUID,好评率,好评数,中评数,差评数\n') 192 | for each in IDs: 193 | try: 194 | self.api.get_JD(each, outfile) 195 | except: 196 | msg_b = "总计{}个商品ID,第{}个商品:{}写入信息失败!".format(nums, i, each) 197 | self.dsrtext_signal.emit(self.api.getmsg(msg_b, "red")) 198 | else: 199 | msg_c = "总计{}个商品ID,成功写入第{}个京东商品:{}".format(nums, i, each) 200 | self.dsrtext_signal.emit(self.api.getmsg(msg_c, "#464749")) 201 | self.dsrprog_signal.emit(i) 202 | i += 1 203 | end = time.time() 204 | msg_d = "DSR提取完毕,耗时:%0.2f秒!\n数据保存在当前目录下表格 %s 中" % (float(end - start), outfile) 205 | self.dsrtext_signal.emit(self.api.getmsg(msg_d, "green")) 206 | self.status_signal.emit("当前状态:DSR信息提取操作完毕!") 207 | 208 | 209 | class linkThread(QtCore.QThread): 210 | status_signal = QtCore.pyqtSignal(str) 211 | linktext_signal = QtCore.pyqtSignal(str) 212 | progmax_signal = QtCore.pyqtSignal(int) 213 | progvalue_signal = QtCore.pyqtSignal(int) 214 | 215 | def __init__(self, txtname): 216 | super().__init__() 217 | self.txtname = txtname 218 | self.api = Spiders() 219 | 220 | def run(self): 221 | start = time.time() 222 | T = datetime.datetime.now() 223 | self.status_signal.emit("当前状态:正在进行天猫主图链接提取操作...") 224 | try: 225 | IDs = self.api.get_Infos(self.txtname) 226 | except: 227 | self.linktext_signal.emit(self.api.getmsg("读取文件失败,请检查文件名称是否有误!", "red")) 228 | else: 229 | nums = len(IDs) 230 | outfile = "links_" + T.strftime("%Y%m%d%H%M") + "_" + str(nums) + ".csv" 231 | with open(outfile, "w") as f: 232 | f.write("商品ID,主图链接,原价,折扣价" + "\n") 233 | self.progmax_signal.emit(nums) 234 | self.linktext_signal.emit(self.api.getmsg("读取文件成功,有效ID总计{}个,开始提取天猫主图链接".format(nums), "#464749")) 235 | i = 1 236 | for each in IDs: 237 | try: 238 | self.api.getimglink(each, outfile) 239 | except: 240 | msg_b = "总计{}个商品ID,第{}个商品:{}写入信息失败!".format(nums, i, each) 241 | self.linktext_signal.emit(self.api.getmsg(msg_b, "red")) 242 | else: 243 | msg_c = "总计{}个商品ID,成功写入第{}个天猫主图信息:{}".format(nums, i, each) 244 | self.linktext_signal.emit(self.api.getmsg(msg_c, "#464749")) 245 | self.progvalue_signal.emit(i) 246 | i += 1 247 | end = time.time() 248 | msg_d = "天猫主图链接提取完毕,耗时:%0.2f秒!\n数据保存在当前目录下表格 %s 中" % (float(end - start), outfile) 249 | self.linktext_signal.emit(self.api.getmsg(msg_d, "green")) 250 | self.status_signal.emit("当前状态:天猫主图信息提取操作完毕!") 251 | 252 | 253 | class imgThread(QtCore.QThread): 254 | status_signal = QtCore.pyqtSignal(str) 255 | imgtext_signal = QtCore.pyqtSignal(str) 256 | progmax_signal = QtCore.pyqtSignal(int) 257 | progvalue_signal = QtCore.pyqtSignal(int) 258 | 259 | def __init__(self, txtname, imgfile): 260 | super().__init__() 261 | self.txtname = txtname 262 | self.imgfile = imgfile 263 | self.api = Spiders() 264 | 265 | def run(self): 266 | start = time.time() 267 | self.status_signal.emit("当前状态:正在进行批量下载图片操作...") 268 | if os.path.isfile(self.txtname): # 如果文件存在 269 | if not os.path.isdir(self.imgfile): 270 | try: 271 | os.mkdir(self.imgfile) 272 | self.imgtext_signal.emit(self.api.getmsg("创建一个新的文件夹,名称为 {}".format(self.imgfile), "green")) 273 | except: 274 | self.imgfile = "PICs" 275 | msg_a = "输入的文件夹名称不合格,使用默认文件夹: {}".format(self.imgfile) 276 | self.imgtext_signal.emit(self.api.getmsg(msg_a, "red")) 277 | try: 278 | os.mkdir(self.imgfile) 279 | except: 280 | pass 281 | infos = self.api.get_Infos(self.txtname) 282 | newinfos = [x for x in infos if "," in x and len(x) > 3] # 只要有效链接 283 | num = len(newinfos) 284 | self.progmax_signal.emit(num) 285 | msg_b = '获取有效图片链接总计{}个,开始批量下载图片...'.format(num) 286 | self.imgtext_signal.emit(self.api.getmsg(msg_b, "#464749")) 287 | i = 1 288 | for each in newinfos: 289 | savename = each.split(",")[0] 290 | imgurl = each.split(",")[1] 291 | try: 292 | self.api.downimg(self.imgfile, savename, imgurl) 293 | except: 294 | bugmsg = '第{}个图片链接:{} 下载失败!'.format(i, imgurl) 295 | self.imgtext_signal.emit(self.api.getmsg(bugmsg, "red")) 296 | else: 297 | msg_c = "正在下载第{}个图片,保存为:{}".format(i, savename) 298 | self.imgtext_signal.emit(self.api.getmsg(msg_c, "#464749")) 299 | self.progvalue_signal.emit(i) 300 | i += 1 301 | end = time.time() 302 | msg_d = "图片批量下载完毕,耗时:%0.2f秒!\n所有图片保存在文件夹 %s 中" % (float(end - start), self.imgfile) 303 | self.imgtext_signal.emit(self.api.getmsg(msg_d, "green")) 304 | else: 305 | themsg2 = '文件不存在,请创建文件再操作!' 306 | self.imgtext_signal.emit(self.api.getmsg(themsg2, "red")) 307 | self.status_signal.emit("当前状态:批量下载图片操作完毕!") 308 | 309 | 310 | if __name__ == '__main__': 311 | app = QtWidgets.QApplication(sys.argv) 312 | myui = MainUI() 313 | myui.show() 314 | sys.exit(app.exec_()) 315 | -------------------------------------------------------------------------------- /ToolUI.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # Form implementation generated from reading ui file 'ToolUI.ui' 4 | # 5 | # Created by: PyQt5 UI code generator 5.6 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt5 import QtCore, QtGui, QtWidgets 10 | # 导入样式文件 11 | from QSSwhite import QSS 12 | 13 | class Ui_MainWindow(QtWidgets.QMainWindow): 14 | def __init__(self): 15 | super().__init__() 16 | self.setupUi(self) 17 | 18 | def setupUi(self, MainWindow): 19 | MainWindow.setObjectName("MainWindow") 20 | MainWindow.resize(640, 540) 21 | MainWindow.setWindowIcon(QtGui.QIcon("White/ooopic_1484987787.ico")) 22 | MainWindow.setMaximumSize(QtCore.QSize(640, 540)) 23 | self.centralwidget = QtWidgets.QWidget(MainWindow) 24 | self.centralwidget.setObjectName("centralwidget") 25 | self.tabWidget = QtWidgets.QTabWidget(self.centralwidget) 26 | self.tabWidget.setGeometry(QtCore.QRect(20, 4, 604, 473)) 27 | self.tabWidget.setObjectName("tabWidget") 28 | self.tab_1 = QtWidgets.QWidget() 29 | self.tab_1.setObjectName("tab_1") 30 | self.groupBox_11 = QtWidgets.QGroupBox(self.tab_1) 31 | self.groupBox_11.setGeometry(QtCore.QRect(30, 10, 535, 151)) 32 | self.groupBox_11.setObjectName("groupBox_11") 33 | self.label_11 = QtWidgets.QLabel(self.groupBox_11) 34 | self.label_11.setGeometry(QtCore.QRect(50, 18, 461, 123)) 35 | self.label_11.setObjectName("label_11") 36 | self.groupBox_12 = QtWidgets.QGroupBox(self.tab_1) 37 | self.groupBox_12.setGeometry(QtCore.QRect(30, 180, 535, 251)) 38 | self.groupBox_12.setObjectName("groupBox_12") 39 | self.label_4 = QtWidgets.QLabel(self.groupBox_12) 40 | self.label_4.setGeometry(QtCore.QRect(40, 30, 60, 24)) 41 | self.label_4.setObjectName("label_4") 42 | self.lineEdit_1 = QtWidgets.QLineEdit(self.groupBox_12) 43 | self.lineEdit_1.setGeometry(QtCore.QRect(102, 30, 156, 24)) 44 | self.lineEdit_1.setObjectName("lineEdit_1") 45 | self.radioButton_1 = QtWidgets.QRadioButton(self.groupBox_12) 46 | self.radioButton_1.setGeometry(QtCore.QRect(270, 26, 110, 32)) 47 | icon = QtGui.QIcon() 48 | icon.addPixmap(QtGui.QPixmap("White/e52d9567c015cdb440344305380739e7.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 49 | self.radioButton_1.setIcon(icon) 50 | self.radioButton_1.setIconSize(QtCore.QSize(30, 30)) 51 | self.radioButton_1.setObjectName("radioButton_1") 52 | self.radioButton_2 = QtWidgets.QRadioButton(self.groupBox_12) 53 | self.radioButton_2.setGeometry(QtCore.QRect(398, 26, 111, 32)) 54 | icon1 = QtGui.QIcon() 55 | icon1.addPixmap(QtGui.QPixmap("White/b721a1c9956b6e836cbdb6c57691ef09.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 56 | self.radioButton_2.setIcon(icon1) 57 | self.radioButton_2.setIconSize(QtCore.QSize(22, 22)) 58 | self.radioButton_2.setObjectName("radioButton_2") 59 | self.pushButton_1 = QtWidgets.QPushButton(self.groupBox_12) 60 | self.pushButton_1.setGeometry(QtCore.QRect(40, 70, 91, 30)) 61 | icon2 = QtGui.QIcon() 62 | icon2.addPixmap(QtGui.QPixmap("White/ooopic_1494068712.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 63 | self.pushButton_1.setIcon(icon2) 64 | self.pushButton_1.setIconSize(QtCore.QSize(20, 20)) 65 | self.pushButton_1.setObjectName("pushButton_1") 66 | self.label_5 = QtWidgets.QLabel(self.groupBox_12) 67 | self.label_5.setGeometry(QtCore.QRect(160, 72, 71, 24)) 68 | self.label_5.setObjectName("label_5") 69 | self.progressBar_1 = QtWidgets.QProgressBar(self.groupBox_12) 70 | self.progressBar_1.setGeometry(QtCore.QRect(240, 75, 250, 20)) 71 | self.progressBar_1.setProperty("value", 0) 72 | self.progressBar_1.setObjectName("progressBar_1") 73 | self.textEdit_1 = QtWidgets.QTextEdit(self.groupBox_12) 74 | self.textEdit_1.setGeometry(QtCore.QRect(40, 120, 455, 121)) 75 | self.textEdit_1.setObjectName("textEdit_1") 76 | self.tabWidget.addTab(self.tab_1, "") 77 | self.tab_2 = QtWidgets.QWidget() 78 | self.tab_2.setObjectName("tab_2") 79 | self.groupBox_21 = QtWidgets.QGroupBox(self.tab_2) 80 | self.groupBox_21.setGeometry(QtCore.QRect(30, 180, 535, 251)) 81 | self.groupBox_21.setObjectName("groupBox_21") 82 | self.lineEdit_2 = QtWidgets.QLineEdit(self.groupBox_21) 83 | self.lineEdit_2.setGeometry(QtCore.QRect(102, 30, 156, 24)) 84 | self.lineEdit_2.setObjectName("lineEdit_2") 85 | self.label_6 = QtWidgets.QLabel(self.groupBox_21) 86 | self.label_6.setGeometry(QtCore.QRect(40, 30, 60, 24)) 87 | self.label_6.setObjectName("label_6") 88 | self.label_7 = QtWidgets.QLabel(self.groupBox_21) 89 | self.label_7.setGeometry(QtCore.QRect(160, 72, 71, 24)) 90 | self.label_7.setObjectName("label_7") 91 | self.pushButton_2 = QtWidgets.QPushButton(self.groupBox_21) 92 | self.pushButton_2.setGeometry(QtCore.QRect(40, 70, 91, 30)) 93 | self.pushButton_2.setIcon(icon2) 94 | self.pushButton_2.setIconSize(QtCore.QSize(20, 20)) 95 | self.pushButton_2.setObjectName("pushButton_2") 96 | self.progressBar_2 = QtWidgets.QProgressBar(self.groupBox_21) 97 | self.progressBar_2.setGeometry(QtCore.QRect(240, 75, 250, 20)) 98 | self.progressBar_2.setProperty("value", 0) 99 | self.progressBar_2.setObjectName("progressBar_2") 100 | self.textEdit_2 = QtWidgets.QTextEdit(self.groupBox_21) 101 | self.textEdit_2.setGeometry(QtCore.QRect(40, 120, 455, 121)) 102 | self.textEdit_2.setObjectName("textEdit_2") 103 | self.groupBox_22 = QtWidgets.QGroupBox(self.tab_2) 104 | self.groupBox_22.setGeometry(QtCore.QRect(30, 10, 535, 151)) 105 | self.groupBox_22.setObjectName("groupBox_22") 106 | self.label_2 = QtWidgets.QLabel(self.groupBox_22) 107 | self.label_2.setGeometry(QtCore.QRect(50, 18, 461, 123)) 108 | self.label_2.setObjectName("label_2") 109 | self.tabWidget.addTab(self.tab_2, "") 110 | self.tab_3 = QtWidgets.QWidget() 111 | self.tab_3.setObjectName("tab_3") 112 | self.groupBox_31 = QtWidgets.QGroupBox(self.tab_3) 113 | self.groupBox_31.setGeometry(QtCore.QRect(30, 180, 535, 251)) 114 | self.groupBox_31.setObjectName("groupBox_31") 115 | self.progressBar_3 = QtWidgets.QProgressBar(self.groupBox_31) 116 | self.progressBar_3.setGeometry(QtCore.QRect(240, 75, 250, 20)) 117 | self.progressBar_3.setProperty("value", 0) 118 | self.progressBar_3.setObjectName("progressBar_3") 119 | self.pushButton_3 = QtWidgets.QPushButton(self.groupBox_31) 120 | self.pushButton_3.setGeometry(QtCore.QRect(40, 70, 91, 30)) 121 | self.pushButton_3.setIcon(icon2) 122 | self.pushButton_3.setIconSize(QtCore.QSize(20, 20)) 123 | self.pushButton_3.setObjectName("pushButton_3") 124 | self.label_8 = QtWidgets.QLabel(self.groupBox_31) 125 | self.label_8.setGeometry(QtCore.QRect(40, 30, 60, 24)) 126 | self.label_8.setObjectName("label_8") 127 | self.lineEdit_31 = QtWidgets.QLineEdit(self.groupBox_31) 128 | self.lineEdit_31.setGeometry(QtCore.QRect(102, 30, 156, 24)) 129 | self.lineEdit_31.setObjectName("lineEdit_31") 130 | self.textEdit_3 = QtWidgets.QTextEdit(self.groupBox_31) 131 | self.textEdit_3.setGeometry(QtCore.QRect(40, 120, 455, 121)) 132 | self.textEdit_3.setObjectName("textEdit_3") 133 | self.label_9 = QtWidgets.QLabel(self.groupBox_31) 134 | self.label_9.setGeometry(QtCore.QRect(160, 72, 71, 24)) 135 | self.label_9.setObjectName("label_9") 136 | self.label_10 = QtWidgets.QLabel(self.groupBox_31) 137 | self.label_10.setGeometry(QtCore.QRect(272, 30, 72, 24)) 138 | self.label_10.setObjectName("label_10") 139 | self.lineEdit_32 = QtWidgets.QLineEdit(self.groupBox_31) 140 | self.lineEdit_32.setGeometry(QtCore.QRect(348, 30, 146, 24)) 141 | self.lineEdit_32.setObjectName("lineEdit_32") 142 | self.groupBox_32 = QtWidgets.QGroupBox(self.tab_3) 143 | self.groupBox_32.setGeometry(QtCore.QRect(30, 10, 535, 151)) 144 | self.groupBox_32.setObjectName("groupBox_32") 145 | self.label_3 = QtWidgets.QLabel(self.groupBox_32) 146 | self.label_3.setGeometry(QtCore.QRect(50, 18, 461, 123)) 147 | self.label_3.setObjectName("label_3") 148 | self.tabWidget.addTab(self.tab_3, "") 149 | MainWindow.setCentralWidget(self.centralwidget) 150 | self.menubar = QtWidgets.QMenuBar(MainWindow) 151 | self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 23)) 152 | self.menubar.setObjectName("menubar") 153 | self.menu_F = QtWidgets.QMenu(self.menubar) 154 | self.menu_F.setObjectName("menu_F") 155 | self.menu_H = QtWidgets.QMenu(self.menubar) 156 | self.menu_H.setObjectName("menu_H") 157 | MainWindow.setMenuBar(self.menubar) 158 | self.statusbar = QtWidgets.QStatusBar(MainWindow) 159 | self.statusbar.setObjectName("statusbar") 160 | MainWindow.setStatusBar(self.statusbar) 161 | self.actionOpenfile = QtWidgets.QAction(MainWindow) 162 | icon3 = QtGui.QIcon() 163 | icon3.addPixmap(QtGui.QPixmap("White/2017522122222.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 164 | self.actionOpenfile.setIcon(icon3) 165 | self.actionOpenfile.setObjectName("actionOpenfile") 166 | self.actionQiut = QtWidgets.QAction(MainWindow) 167 | icon4 = QtGui.QIcon() 168 | icon4.addPixmap(QtGui.QPixmap("White/ooopic_1495455270.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 169 | self.actionQiut.setIcon(icon4) 170 | self.actionQiut.setObjectName("actionQiut") 171 | self.actionAbout = QtWidgets.QAction(MainWindow) 172 | icon5 = QtGui.QIcon() 173 | icon5.addPixmap(QtGui.QPixmap("White/201752212221.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 174 | self.actionAbout.setIcon(icon5) 175 | self.actionAbout.setObjectName("actionAbout") 176 | self.actionAuthor = QtWidgets.QAction(MainWindow) 177 | icon6 = QtGui.QIcon() 178 | icon6.addPixmap(QtGui.QPixmap("White/2017522122216.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 179 | self.actionAuthor.setIcon(icon6) 180 | self.actionAuthor.setObjectName("actionAuthor") 181 | self.menu_F.addAction(self.actionOpenfile) 182 | self.menu_F.addSeparator() 183 | self.menu_F.addAction(self.actionQiut) 184 | self.menu_H.addAction(self.actionAbout) 185 | self.menu_H.addSeparator() 186 | self.menu_H.addAction(self.actionAuthor) 187 | self.menubar.addAction(self.menu_F.menuAction()) 188 | self.menubar.addAction(self.menu_H.menuAction()) 189 | 190 | self.retranslateUi(MainWindow) 191 | self.tabWidget.setCurrentIndex(0) 192 | QtCore.QMetaObject.connectSlotsByName(MainWindow) 193 | 194 | def retranslateUi(self, MainWindow): 195 | _translate = QtCore.QCoreApplication.translate 196 | MainWindow.setWindowTitle(_translate("MainWindow", "电商小工具")) 197 | self.groupBox_11.setTitle(_translate("MainWindow", "操作流程")) 198 | self.label_11.setText(_translate("MainWindow", "1、程序运行可以获取天猫或京东商品的DSR信息并生成数据表格
2、在程序所在目录创建一个文本文件,在其中放入商品ID,每行放一个
3、在文件名称输入框中输入放有商品ID的文件名称或直接使用默认文件名称
4、选择商品类型,启动开始按钮,等待程序运行结束后获取信息表格
")) 199 | self.groupBox_12.setTitle(_translate("MainWindow", "运行过程")) 200 | self.label_4.setText(_translate("MainWindow", "文件名称:")) 201 | self.radioButton_1.setText(_translate("MainWindow", "天猫商品")) 202 | self.radioButton_1.setChecked(True) #设置默认选中 203 | self.radioButton_2.setText(_translate("MainWindow", "京东商品")) 204 | self.pushButton_1.setText(_translate("MainWindow", "开始")) 205 | self.label_5.setText(_translate("MainWindow", "完成进度:")) 206 | self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_1), _translate("MainWindow", "商品DSR提取")) 207 | self.groupBox_21.setTitle(_translate("MainWindow", "运行过程")) 208 | self.label_6.setText(_translate("MainWindow", "文件名称:")) 209 | self.label_7.setText(_translate("MainWindow", "完成进度:")) 210 | self.pushButton_2.setText(_translate("MainWindow", "开始")) 211 | self.groupBox_22.setTitle(_translate("MainWindow", "操作流程")) 212 | self.label_2.setText(_translate("MainWindow", "1、程序运行可以获取天猫商品的主图链接和价格(原价&折扣价)
2、在程序所在目录创建一个文本文件,在其中放入商品ID,每行放一个
3、在文件名称输入框中输入放有商品ID的文件名称或直接使用默认文件名称
4、上述步骤完成后按下开始按钮,等待程序运行结束后获取信息表格
")) 213 | self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "天猫主图提取")) 214 | self.groupBox_31.setTitle(_translate("MainWindow", "运行过程")) 215 | self.pushButton_3.setText(_translate("MainWindow", "开始")) 216 | self.label_8.setText(_translate("MainWindow", "文件名称:")) 217 | self.label_9.setText(_translate("MainWindow", "完成进度:")) 218 | self.label_10.setText(_translate("MainWindow", "图片文件夹:")) 219 | self.groupBox_32.setTitle(_translate("MainWindow", "操作流程")) 220 | self.label_3.setText(_translate("MainWindow", "1、程序运行可以按照所给图片链接下载图片并按要求给图片命名
2、在程序所在目录创建一个文本,在其中放入图片链接和名称,每行放一个
3、文件中格式如:1234,https://www.img.jpg,即名称和链接用英文逗号连接
4、输入包含链接的文件名称和图片保存文件夹名称,按开始按钮开始下载图片
")) 221 | self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "图片批量下载")) 222 | self.menu_F.setTitle(_translate("MainWindow", "文件(F)")) 223 | self.menu_H.setTitle(_translate("MainWindow", "帮助(H)")) 224 | self.actionOpenfile.setText(_translate("MainWindow", "查看文件夹")) 225 | self.actionOpenfile.setShortcut(_translate("MainWindow", "Ctrl+O")) 226 | self.actionQiut.setText(_translate("MainWindow", "退出")) 227 | self.actionQiut.setShortcut(_translate("MainWindow", "Ctrl+Q")) 228 | self.actionAbout.setText(_translate("MainWindow", "关于")) 229 | self.actionAuthor.setText(_translate("MainWindow", "作者")) 230 | 231 | # 添加默认值 232 | self.lineEdit_1.setText("dsr_ids.txt") 233 | self.lineEdit_2.setText("link_ids.txt") 234 | self.lineEdit_31.setText("img_links.txt") 235 | self.lineEdit_32.setText("PICs") 236 | # 设置提示语 237 | for each in [self.lineEdit_1,self.lineEdit_2,self.lineEdit_31]: 238 | each.setToolTip("温馨提示:请先确认文件是否存在!") 239 | self.lineEdit_32.setToolTip("警告:请勿使用非法文件名称,否则程序会崩溃!") 240 | #设置鼠标样式和提示语 241 | for each in [self.pushButton_1,self.pushButton_2,self.pushButton_3]: 242 | each.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) 243 | # 添加样式风格 244 | self.mystyle() 245 | 246 | def mystyle(self): 247 | qss = QSS() 248 | self.setStyleSheet(qss.White) 249 | 250 | if __name__ == '__main__': 251 | import sys 252 | app = QtWidgets.QApplication(sys.argv) 253 | myui = Ui_MainWindow() 254 | myui.show() 255 | sys.exit(app.exec_()) 256 | -------------------------------------------------------------------------------- /ToolUI.ui: -------------------------------------------------------------------------------- 1 | 2 |