pyqt5 + pyinstaller 制作爬虫小程序
环境: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 制作爬虫小程序的更多相关文章
- 一个python爬虫小程序
起因 深夜忽然想下载一点电子书来扩充一下kindle,就想起来python学得太浅,什么“装饰器”啊.“多线程”啊都没有学到. 想到廖雪峰大神的python教程很经典.很著名.就想找找有木有pdf版的 ...
- nodeJs爬虫小程序练习
//爬虫小程序 var express = require('express'); //superagent是一个http的库,可以发起get和post请求 var superagent = requ ...
- 适合新手的Python爬虫小程序
介绍:此程序是使用python做的一个爬虫小程序 爬取了python百度百科中的部分内容,因为这个demo是根据网站中的静态结构爬取的,所以如果百度百科词条的html结构发生变化 需要修改部分内容. ...
- 微信小程序在线制作 自己制作微信小程序
小程序是个什么东西?怎么自己制作微信小程序?微信小程序在线制作难吗?最近老是听这类问题,耳朵都长茧子了. 百牛信息技术bainiu.ltd整理发布于博客园 接下来作为一个技术人员的角度就为大家分析一下 ...
- 福利贴——爬取美女图片的Java爬虫小程序代码
自己做的一个Java爬虫小程序 废话不多说.先上图. 目录命名是用标签缩写,假设大家看得不顺眼能够等完成下载后手动改一下,比方像有强迫症的我一样... 这是挂了一个晚上下载的总大小,只是还有非常多由于 ...
- PyQt5(2)、垃圾分类小程序(2)——初代窗口程序可执行文件
又是一天时间(又没做大作业).今天的心路历程:(1)前端后端怎么连接?(2)后端数据库插数据(3)完全没用上之前的字典反查法(4)突然发现面向对象编程其实很好用,甚至越用越上瘾(5)QLineEdit ...
- 使用WordPress制作微信小程序
0 产品由来 微信小程序具有即来即用.轻量化.与微信贴合性好的特点.对于独立产品来说,使用微信小程序能够较好的服务与个人及现在的互联网社群,提升用户体验. 本次设计的微信小程序是面向无人机开发者社区的 ...
- 手把手教你制作微信小程序,开源、免费、快速搞定
最近做了个"罗孚传车"的小程序 一时兴起,做了一个小程序,将个人收集的同汽车相关的行业资讯和学习资料,分享到小程序中,既作为历史资料保存,又提供给更多的人学习和了解,还能装一下:) ...
- 【原创】前端开发人员如何制作微信小程序模板
(我的博客网站中的原文:http://www.xiaoxianworld.com/archives/305,欢迎遇到的小伙伴常来瞅瞅,给点评论和建议,有错误和不足,也请指出.) 最近接触了一下微信小程 ...
随机推荐
- C# Datatable、DataReader等转化json
//对象转换为Json字符串 public static string ToJson(object jsonObject) { object objectValue = string.Empty; s ...
- Redis运维利器 -- RedisManager
Redis作为一个基于内存的可持久化的日志型.Key-Value数据库,以其出色的性能表现以及高可用性在许多公司有着举足轻重的地位.伴随着业务量的增长,redis集群的规模不可避免的需要扩大,此时re ...
- CentOS 7 配置本地 YUM源
以VMware中使用ISO光盘为例配置本地Yum源 配置步骤:1.安装好CentOS 7后,使用root账户登陆系统#将安装CentOS所使用的iso光盘挂载到/mnt目录下 mount -t iso ...
- 中控考勤机使用 zkemkeeper SDK订阅考勤数据事件失效解决方式
问题 前同事编写的对中控考勤机数据集成项目当中,打卡数据不能实时进行上传到平台当中,一直靠定时全量上传来同步数据. 阅读代码后,发现代码中有实时上传数据的逻辑,但是运行一段时间后,中控zkemkeep ...
- Matlab模板模式
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.本文以数据库SQL语法为例来阐述模板模 ...
- js函数(续)
一.全局变量和局部变量全局变量:当前js页面中均可使用的变量[声明在函数外面的变量],整个js页面中均可以使用.局部变量:声明在函数内部的变量,只能在函数内部使用.eg: var a = 1; con ...
- dedecms更换默认编辑器为百度编辑器ueditor
由于体验过ueditor编辑器,再次使用Dedecms编辑器感觉很别扭,所以就有了更换编辑器的想法.操作顺序如下所述: 1.首先,下载ueditor包,官网http://ueditor.baidu.c ...
- jq对象才能使用jq方法,$(".a").eq(0) 和 $(”.a“)[0]
<a class="a"></a> <a class="a"></a> <a class="a& ...
- Jmeter学习笔记(十七)——jmeter目录结构
原文链接:http://www.cnblogs.com/zichuan/p/6938772.html 一.bin目录examples: 目录中有CSV样例 jmeter.bat windows的启 ...
- js获取任意一天的0点和23:59:59时间
最近写代码时,需要获取任意一天的起始和结束时间,0点和23:59:59这两个时间的时间戳 使用了setHours() 方法 setHours() 方法用于设置指定的时间的小时字段 1. 获取当天开始时 ...