环境:mac python3.7 pyqt5 pyinstaller

ps: 主要是熟悉pyqt5, 加入了单选框 输入框 文本框 文件夹选择框及日历下拉框

效果图:

pyqt5 主程序文件

# -*- coding: utf-8 -*-
# @Author: Mehaei
# @Date: 2019-07-10 13:02:56
# @Last Modified by: Mehaei
# @Last Modified time: 2019-07-15 16:43:18
import os
import uuid
import sys
import time
import json
from PyQt5.QtGui import QRegExpValidator, QIntValidator
from PyQt5.QtCore import QDate, QBasicTimer, QRegExp
from PyQt5.QtWidgets import (QWidget, QDesktopWidget, QApplication,
QMessageBox, QPushButton, QLabel, QLineEdit, QGridLayout, QComboBox,
QDateTimeEdit, QFileDialog, QProgressBar, QTextEdit) from worker import Worker class Example(QWidget): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.initUI() def initUI(self):
     # 主窗口大小
self.resize(500, 400)
self.center()
self.cwd = os.getcwd()
    
url = QLabel('url')
proxy = QLabel("proxy")
count = QLabel("count") start_time = QLabel("start_time")
end_time = QLabel("end_time") data_dir = QLabel("data_dir") shop_info = QLabel("shop_info")
self.shopEdit = QTextEdit()     # 文件选择框
self.btn_chooseDir = QPushButton(self)
self.btn_chooseDir.setObjectName("btn_chooseDir")
self.btn_chooseDir.setText("choose dir")
self.btn_chooseDir.clicked.connect(self.slot_btn_chooseDir) # url正则验证 仅限amazon
url_regex = QRegExp(r'http[s]{0,1}://www.amazon.+')
url_line_re = QRegExpValidator(self)
url_line_re.setRegExp(url_regex) self.urlEdit = QLineEdit()
self.urlEdit.setPlaceholderText("Please product url") self.urlEdit.setValidator(url_line_re) # 下拉框
self.proxyCom = QComboBox()
self.proxyCom.addItem("adsl(default)")
self.proxyCom.addItem("None") self.countEdit = QLineEdit()
self.countEdit.setText("")
int_limit = QIntValidator(self)
int_limit.setRange(1, 50000)
self.countEdit.setValidator(int_limit) self.startdateEdit = QDateTimeEdit(QDate.currentDate(), self)
self.startdateEdit.setDisplayFormat("yyyy-MM-dd HH:mm:ss")
self.startdateEdit.setCalendarPopup(True) self.startdateEdit.dateChanged.connect(self.get_start_date) self.enddateEdit = QDateTimeEdit(QDate.currentDate(), self)
self.enddateEdit.setDisplayFormat("yyyy-MM-dd HH:mm:ss")
self.enddateEdit.setCalendarPopup(True) self.enddateEdit.dateChanged.connect(self.get_end_date) self.shopbtn = QPushButton('Shop', self)
# self.btn.move(40, 80)
self.shopbtn.clicked.connect(self.get_shop) self.reviewbtn = QPushButton('Review', self)
# self.btn.move(40, 80)
self.reviewbtn.clicked.connect(self.get_review) grid = QGridLayout()
grid.setSpacing(5) grid.addWidget(url, 1, 0)
grid.addWidget(self.urlEdit, 1, 1, 1, 4) grid.addWidget(proxy, 2, 0)
grid.addWidget(self.proxyCom, 2, 1) grid.addWidget(count, 2, 2, 1, 2)
grid.addWidget(self.countEdit, 2, 4) grid.addWidget(start_time, 3, 0)
grid.addWidget(self.startdateEdit, 3, 1) grid.addWidget(end_time, 3, 2, 1, 2)
grid.addWidget(self.enddateEdit, 3, 4) grid.addWidget(data_dir, 4, 0)
grid.addWidget(self.btn_chooseDir, 4, 1) grid.addWidget(shop_info, 5, 0)
grid.addWidget(self.shopEdit, 5, 1, 5, 5) grid.addWidget(self.pbar, 10, 0, 1, 5)
grid.addWidget(self.shopbtn, 11, 0, 1, 2)
grid.addWidget(self.reviewbtn, 11, 3, 1, 2) self.setLayout(grid) self.setWindowTitle('Amazon Crawl')
self.show() def center(self): qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft()) def get_start_date(self):
dateTime = self.startdateEdit.dateTime() def get_end_date(self):
dateTime = self.enddateEdit.dateTime() def slot_btn_chooseDir(self):
self.dir_choose = QFileDialog.getExistingDirectory(self,
"Choose data save dir",
self.cwd) # 起始路径
if self.dir_choose == "":
return False
self.btn_chooseDir.setText(self.dir_choose) def warning(self, title, content):
QMessageBox.warning(self, title, content) def get_shop(self):
try:
self.dir_choose
except Exception:
self.dir_choose = "./data/" params = {
"id": str(uuid.uuid4()).replace("-", ""),
"url": self.urlEdit.text(),
"proxy_type": self.proxyCom.currentText(),
"count": self.countEdit.text(),
"start_time": self.time_to_time_stamp(self.startdateEdit.text()),
"end_time": self.time_to_time_stamp(self.enddateEdit.text()),
"data_save_dir": self.dir_choose
}
if not params["url"]:
self.warning("Url is Null", "Please input product url")
return False
self.work = Worker(**params)
self.shop_detail = self.work.start(shop=True, product_detail=None)
self.shopEdit.setText(json.dumps(self.shop_detail, indent=4)) def get_review(self):
try:
self.shop_detail
except Exception as e:
self.warning("Product info is Null", "Please get product info")
return False
self.work.start(shop=False, product_detail=self.shop_detail)
QMessageBox.information(self,
"Review done",
"%s review crawl done, count:%s, Save to: %s" % (self.urlEdit.text(), self.amazon.cralwer_data_num, self.amazon.file_data_pname) if self.amazon.cralwer_data_num else "%s review crawl done, count:%s" % (self.urlEdit.text(), self.amazon.cralwer_data_num)
) def closeEvent(self, event):
reply = QMessageBox.question(self, 'Message',
"Are you sure to quit?", QMessageBox.Yes |
QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore() def time_to_time_stamp(self, time_value):
time_array = time.strptime(time_value, "%Y-%m-%d %H:%M:%S")
return int(time.mktime(time_array) * 1000) if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

仅个人学习参考, 如有疑问,欢迎交流

--------------------------------


pyqt5 + pyinstaller 制作爬虫小程序的更多相关文章

  1. 一个python爬虫小程序

    起因 深夜忽然想下载一点电子书来扩充一下kindle,就想起来python学得太浅,什么“装饰器”啊.“多线程”啊都没有学到. 想到廖雪峰大神的python教程很经典.很著名.就想找找有木有pdf版的 ...

  2. nodeJs爬虫小程序练习

    //爬虫小程序 var express = require('express'); //superagent是一个http的库,可以发起get和post请求 var superagent = requ ...

  3. 适合新手的Python爬虫小程序

    介绍:此程序是使用python做的一个爬虫小程序  爬取了python百度百科中的部分内容,因为这个demo是根据网站中的静态结构爬取的,所以如果百度百科词条的html结构发生变化 需要修改部分内容. ...

  4. 微信小程序在线制作 自己制作微信小程序

    小程序是个什么东西?怎么自己制作微信小程序?微信小程序在线制作难吗?最近老是听这类问题,耳朵都长茧子了. 百牛信息技术bainiu.ltd整理发布于博客园 接下来作为一个技术人员的角度就为大家分析一下 ...

  5. 福利贴——爬取美女图片的Java爬虫小程序代码

    自己做的一个Java爬虫小程序 废话不多说.先上图. 目录命名是用标签缩写,假设大家看得不顺眼能够等完成下载后手动改一下,比方像有强迫症的我一样... 这是挂了一个晚上下载的总大小,只是还有非常多由于 ...

  6. PyQt5(2)、垃圾分类小程序(2)——初代窗口程序可执行文件

    又是一天时间(又没做大作业).今天的心路历程:(1)前端后端怎么连接?(2)后端数据库插数据(3)完全没用上之前的字典反查法(4)突然发现面向对象编程其实很好用,甚至越用越上瘾(5)QLineEdit ...

  7. 使用WordPress制作微信小程序

    0 产品由来 微信小程序具有即来即用.轻量化.与微信贴合性好的特点.对于独立产品来说,使用微信小程序能够较好的服务与个人及现在的互联网社群,提升用户体验. 本次设计的微信小程序是面向无人机开发者社区的 ...

  8. 手把手教你制作微信小程序,开源、免费、快速搞定

    最近做了个"罗孚传车"的小程序 一时兴起,做了一个小程序,将个人收集的同汽车相关的行业资讯和学习资料,分享到小程序中,既作为历史资料保存,又提供给更多的人学习和了解,还能装一下:) ...

  9. 【原创】前端开发人员如何制作微信小程序模板

    (我的博客网站中的原文:http://www.xiaoxianworld.com/archives/305,欢迎遇到的小伙伴常来瞅瞅,给点评论和建议,有错误和不足,也请指出.) 最近接触了一下微信小程 ...

随机推荐

  1. CF1063F String Journey DP、SAM、线段树

    传送门 为了方便把串反过来,条件变为\(t_i\)是\(t_{i+1}\)的真子串,答案显然不变. 一件重要的事情是必定存在一种最优解,字符串序列\(\{t\}\)满足\(|t_i| = i\). 考 ...

  2. sql server 压缩日志文件

    USE [master] GO ALTER DATABASE TestDB SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE TestDB SET ...

  3. RabbitMQ Policy的使用

    RabbitMQ作为最流行的MQ中间件之一,广泛使用在各类系统中,今天我们就来讨论一下如何通过Policies给RabbitMQ中已经创建的Queue添加属性和参数. Policise 的作用 通常来 ...

  4. .NET 的程序集加载上下文

    原文:.NET 的程序集加载上下文 我们编写的 .NET 应用程序会使用到各种各样的依赖库.我们都知道 CLR 会在一些路径下帮助我们程序找到依赖,但如果我们需要手动控制程序集加载路径的话,需要了解程 ...

  5. .net core 读取、修改配置文件appsettings.json

    .net core 设置读取JSON配置文件 appsettings.json Startup.cs 中 public class Startup { public Startup(IHostingE ...

  6. CSS控制DIV水平垂直居中

    <div style="position:absolute; width: 600px; height: 200px; left: 50%; top: 50%; margin-left ...

  7. SpringBoot启动原理详解

    SpringBoot和Spring相比,有着不少优势,比如自动配置,jar直接运行等等.那么SpringBoot到底是怎么启动的呢? 下面是SpringBoot启动的入口: @SpringBootAp ...

  8. Maven打包时集成依赖项或复制依赖项到指定目录

    1.集成依赖项,最后生成的jar文件包含所有依赖: <build> <plugins> <plugin> <artifactId>maven-assem ...

  9. koa2--nodemailer实现邮箱验证

    依赖包安装: /** * koa-bodyparser用于把formData数据解析到ctx.request.body * 通过ctx.request.body访问请求的参数 * koa-redis用 ...

  10. 【Excel】【Salesforce】函数拓展

    1.if 2.vlookup