环境: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. Android 系统架构 和 各个版本代号介绍

    一.Android 系统架构: 1. linux内核层Android 基于Linux内核,为Android设备的各种硬件提供底层驱动 比如: 显示驱动.音频.照相机.蓝牙.Wi-Fi驱动,电源管理等 ...

  2. Map 集合按字母排序方法

    @Testpublic void testMapSort() { Map<String, String> map = new HashMap<>(); map.put(&quo ...

  3. IIS7 URL重写如何针对二级域名重写

    二级域名与站点主域名是绑在同一目录下,想实现访问二级域名重写至站点下的某个目录.  如:  访问so.abc.cn 实际访问的是站点根目录下的search目录下的文件 相当于so.abc.cn绑定至s ...

  4. 网页调用文件另存为js

    查看引用是否正常,页面添加html代码. <a id="downLoad" onclick="oDownLoad('downLoad')">下载&l ...

  5. 2019 快乐阳光java面试笔试题 (含面试题解析)

    本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.快乐阳光等公司offer,岗位是Java后端开发,最终选择去了快乐阳光. 面试了很多家公司,感觉大部分公司考察的点 ...

  6. Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)

    Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器    定义:       ...

  7. Flask 进阶

    OOP 面向对象反射 # __call__方法 # class Foo(object): # def __call__(self, *args, **kwargs): # return "i ...

  8. Win 10 无法锁屏,快捷键win+L失效

    快捷键win+L 一直在使用,忽然之间不知道按错了什么 Win 10 无法锁屏,快捷键win+L失效,按win+L后出来的是输入法 应该是键盘的Windows键锁住了,按Fn+windows键解锁

  9. Hive函数集锦

    一.内置运算符 1关系运算符 2.算术运算符 3.逻辑运算符 4.复杂类型函数 5.复杂类型函数应用

  10. Spring AOP无法拦截内部方法调用

    当在同一个类中,A方法调用B方法时,AOP无法工作的问题 假设一个接口里面有两个方法: package demo.long; public interface CustomerService { pu ...