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,欢迎遇到的小伙伴常来瞅瞅,给点评论和建议,有错误和不足,也请指出.) 最近接触了一下微信小程 ...
随机推荐
- 备份和还原 第三篇:master 数据库的备份和还原
在SQL Server 中,master 数据库记录系统级别的元数据,例如,logon accounts, endpoints, linked servers, and system configur ...
- Java数据结构-ArrayList最细致的解析笔记
ArrayList是一个类,这个类有一个数组参数elementData,ArrayList集合中的元素正是保存在这个数组中,它继承了数组查询的高性能,参考第3篇.ArrayList还封装了很多方法,便 ...
- 记CentOS 发布.NET Core 2.0
centos 7.x sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc sudo sh -c 'echo -e & ...
- Java自学-数组 初始化数组
Java 如何初始化数组 步骤 1 : 分配空间与赋值分步进行 public class HelloWorld { public static void main(String[] args) { i ...
- Linux:检查当前运行级别的五种方法
运行级就是Linux操作系统当前正在运行的功能级别.存在七个运行级别,编号从0到6.系统可以引导到任何给定的运行级别.运行级别由数字标识. 每个运行级别指定不同的系统配置,并允许访问不同的进程组合.默 ...
- pychrom注册码
http://angame.top/wx/web/zhucema/ YZVR7WDLV8-eyJsaWNlbnNlSWQiOiJZWlZSN1dETFY4IiwibGljZW5zZWVOYW1lIjo ...
- Oracle中nlssort()函数排序功能
转自:https://www.iteye.com/blog/libaxiaoyuan-2199851 Oracle9i之前,中文是按照二进制编码进行排序的.在oracle9i中新增了按照拼音.部首.笔 ...
- dexlib2的源码框架
这个是dexlib2的目录,明显看出来比baksmali和smali代码量要多很多,这里先将核心目录给大家做一下介绍 analysis 这个暂时不知道具体作用 base 这个文件夹下面全部都是 ...
- js获取任意一天的0点和23:59:59时间
最近写代码时,需要获取任意一天的起始和结束时间,0点和23:59:59这两个时间的时间戳 使用了setHours() 方法 setHours() 方法用于设置指定的时间的小时字段 1. 获取当天开始时 ...
- Maven项目命名规范
Guide to naming conventions on groupId, artifactId and versiongroupId will identify your project uni ...