环境: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. docker 命令(我使用过的)

    是否安装docker:    docker version 启动docker:    service docker start 查看本机可用镜像:    docker images 删除镜像: doc ...

  2. Codeforces Round #499 (Div. 1)

    Codeforces Round #499 (Div. 1) https://codeforces.com/contest/1010 为啥我\(\rm Div.1\)能\(A4\)题还是\(\rm s ...

  3. elasticsearch内存不断增长问题

    经过一段时间运行,es的索引已经达到数十G以上.es采用mmap的方式将索引文件映射到内存中,随着检索的次数增加,越来越多的数据被操作系统读入到内存中.这部分内存位于系统中,但是又不归es管理,也就是 ...

  4. mysql数据库的安装和连接测试并给root用户赋密码

    一.mysql数据库的安装 Windows下MySQL的配置 以 MySQL 5.1 免安装版为例, 下载 mysql-noinstall-5.1.69-win32.zip ( 官方下载页: http ...

  5. java之mybatis之动态sql

    1. if 判读条件是否满足,满足将会把 sql 语句加上. <select id="findUser" parameterType="Map" resu ...

  6. java之spring mvc之数据处理

    1. 页面中数据提交到 Controller 中如何处理 a) 如果自定义 Controller 是实现 spring 的 Controller 的接口,那么可以通过 HttpServletReque ...

  7. el-select和el-cascader的visible-change下拉框隐藏时触发相关事件(下拉框下拉显示时不触发)

    原文:https://blog.csdn.net/CarryBest/article/details/79959389 今天做项目时,用elementUI框架,需要下拉框隐藏时出发某个函数,用了vis ...

  8. webpack集成vue单文件模式的很多坑(研究了1个星期)

    1.一开始不知道局部安装webpack后,如何调用webpack. 后来看说明文档(webpack中文网)才知道,有个npx可以启动本地安装的webpack. 我估计:全局安装webpack,全局的w ...

  9. FFmpeg参考资料合集(会一直更新)

    让你的软件飞起来:RGB转为YUV 朋友曾经给我推荐了一个有关代码优化的pdf文档<让你的软件飞起来>,看完之后,感受颇深.为了推广其,同时也为了自己加深印象,故将其总结为word 文档. ...

  10. MySQL分组查询每组最新的一条数据(通俗易懂)

    开发中经常会遇到,分组查询最新数据的问题,比如下面这张表(查询每个地址最新的一条记录): sql如下: -- ---------------------------- -- Table structu ...