【写在前面】
其实简单的爬虫,只要自己亲手编写过一次代码,基本就能上手,如果有不懂的可以私聊我。因为爬虫流程和解析都是有流程可依,那么为什么今天我还敢再发一次爬虫的文章呢?哈哈,那自然是因为除了爬虫外,还有新知识,比如预测下一期双色球的“十杀九取”红(蓝)球技战法,再加上我最想记录的python-GUI制作。GUI制作,GUI制作,GUI制作,重要的内容说三次!
越是学习python,越是觉得万能,就像王者荣耀里的亚瑟。可上单,可辅助,可打野;进可取后排ADC狗头,退可守己方大哥carry。咳咳,说的有点远了,下面开始正文。
【示例代码】
本次代码其实有4个py,一个是模拟request请求的getheader,一个是双色球爬取历史各期的中奖红蓝球号,一个是根据历史红蓝球的算法预测同,最后一个是GUI制作。由于getheader()方法我本身就是参考了其他大神的内容,而且在第一篇《获取杭州天气》的文章中应当附了代码,因此我就不再重复浪费大家的时间。
1、双色球 爬取历史号码的代码如下,虚假的“主函数”:
# coding=utf-8
# @Auther : "鹏哥贼优秀"
# @Date : 2019/7/31
# @Software : PyCharm
import requests
from bs4 import BeautifulSoup
import getheader
import my_GUI
import sys
def getballs():
url = "http://datachart.500.com/ssq/?expect=100&from=&to=&sort=1"
headers = getheader.getheaders()
r = requests.get(url, headers=headers)
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, "lxml")
periods = soup.find_all('td', align="center")
redballs = soup.find_all('td', class_="chartBall01")
blueballs = soup.find_all('td', class_="chartBall02")
periodlist = [i.string for i in periods if i.string]
redballlist = [int(i.string) for i in redballs]
blueballlist = [int(i.string) for i in blueballs]
periodnum = len(blueballlist)
return periodlist[:periodnum], redballlist, blueballlist, periodnum
if __name__ == "__main__":
periodlist, redballlist, blueballlist, periodnum = getballs()
nextperiodnum = int(periodlist[-1]) + 1
# 以下GUI显示的代码
app = my_GUI.QtWidgets.QApplication(sys.argv)
Dialog = my_GUI.QtWidgets.QDialog()
ui = my_GUI.Ui_Dialog(redballlist,blueballlist,periodlist)
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec())
2、GUI制作 ,敲黑板,本次文章的重点!
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '1.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import method
class Ui_Dialog(object):
def __init__(self,redballlist,blueballlist,periodlist):
self.redballlist = redballlist
self.blueballlist = blueballlist
self.periodlist = periodlist
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(502, 383)
self.comboBox = QtWidgets.QComboBox(Dialog)
self.comboBox.setGeometry(QtCore.QRect(60, 70, 161, 31))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
for i in self.periodlist:
self.comboBox.addItem(i)
self.plainTextEdit = QtWidgets.QPlainTextEdit(Dialog)
self.plainTextEdit.setGeometry(QtCore.QRect(50, 170, 421, 41))
self.plainTextEdit.setStyleSheet("font: 12pt \"黑体\";")
self.plainTextEdit.setObjectName("plainTextEdit")
self.plainTextEdit_2 = QtWidgets.QPlainTextEdit(Dialog)
self.plainTextEdit_2.setGeometry(QtCore.QRect(50, 270, 421, 41))
self.plainTextEdit_2.setStyleSheet("font: 12pt \"黑体\";")
self.plainTextEdit_2.setObjectName("plainTextEdit_2")
self.label_2 = QtWidgets.QLabel(Dialog)
self.label_2.setGeometry(QtCore.QRect(60, 140, 181, 21))
self.label_2.setStyleSheet("font: 12pt \"黑体\";\n"
"background-color: rgb(0, 255, 127);\n"
"color: rgb(85, 0, 255);")
self.label_2.setObjectName("label_2")
self.label_3 = QtWidgets.QLabel(Dialog)
self.label_3.setGeometry(QtCore.QRect(60, 35, 131, 21))
self.label_3.setStyleSheet("font: 12pt \"黑体\";\n"
"font: 75 14pt \"Aharoni\";\n"
"background-color: rgb(255, 0, 0);\n"
"color: rgb(0, 0, 0);")
self.label_3.setObjectName("label_3")
self.pushButton = QtWidgets.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(380, 70, 75, 31))
self.pushButton.setStyleSheet("font: 14pt \"黑体\";\n"
"background-color: rgb(0, 255, 0);")
self.pushButton.setObjectName("pushButton")
self.label_4 = QtWidgets.QLabel(Dialog)
self.label_4.setGeometry(QtCore.QRect(60, 230, 181, 21))
self.label_4.setStyleSheet("font: 12pt \"黑体\";\n"
"background-color: rgb(0, 255, 127);\n"
"color: rgb(85, 0, 255);")
self.label_4.setObjectName("label_4")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "双色球预期GUI"))
self.label_2.setText(_translate("Dialog", "下一期杀掉的红球数字是:"))
self.label_3.setText(_translate("Dialog", "双色球期数:"))
self.pushButton.setText(_translate("Dialog", "确认"))
self.label_4.setText(_translate("Dialog", "下一期杀掉的蓝球数字是:"))
self.pushButton.clicked.connect(self.clickok)
def clickok(self):
periodnum = self.comboBox.currentText()
num = self.periodlist.index(periodnum)+1
delrednum = method.DelRedNum(self.redballlist[:6*num], self.blueballlist[:num])
delbullnum = method.DelBlueNum(self.blueballlist[:num])
redresult = ",".join([str(i) for i in delrednum])
blueresult = ",".join([str(i) for i in delbullnum])
self.plainTextEdit.setPlainText(redresult)
self.plainTextEdit_2.setPlainText(blueresult)
【效果如下】
也就是说本周末19090期双色球,将不会开出“6,10,14,15,18,19,20”的红球,“2,4,8,10,13”的蓝球。
【知识点】
1、python爬虫。
就像开篇说的,如果是那些简单的网站,即没反爬虫的话,我们处理数据是很简单,但是如果网站做了反爬虫,那就麻烦了,需要反解码。另外,反爬虫是什么样的呢?下面请听我细细道来。
正常容易爬虫的网站,响应是这样的:
通过网页F12抓包,就能在响应中找到你想要的内容,这就说明这个网站容易爬取,也说明这个网站 的开发技术不怎么样,估计是个实习生开发的。
那反爬虫的网站是怎么样的?下面以哪儿网为例,我在界面明确能搜索到杭州到银川的航班呢(为什么是银川呢?因为那有个小伙)
刚开始爬虫去哪儿时,我就不理解,为什么会看找不到航班信息。然后突然想到不会是遇到反爬虫了吧?仔细看以上响应,会发现有些内容很像base64编码过的样子,如下:
<script>var _0x4d88=['Gi3DlRTCiw==','wrDDucOUUio=','w7cKw5xxJg==','XMOowr3Dg8OZ','wocVAzAJ','L8OdB8OTfQ==','wqbCmz5vaw==','asOxw4xsYQ==','w57CpXPDqjU=','WiBMwoIv','Kgj
然后再仔细看,发现这些信息后有一句return _0x3a5b12?decodeURIComponent(_0x3a5b12[0x1]):undefined;}}。这就证明了网站的确进行了对信息的加密。这也是有效防止各类抢票软件的方法之一。由于本人当前学艺不精,对这种加密代码完全不知道怎么解码(应该是和最后一串八进制有关,而不是简单的base64加密),因此就放弃了。
2、GUI制作
以前我以为GUI这种界面应该是JAVA之外的语言才能玩的,没想到python用起来也是如此方便。
下面简单讲下python GUI制作的几个学习过程:
(1)砍柴前必须有把柴刀,所以你要下载GUI制作的python库。我这 边 用的是pyqt5、pyqt5-tools这两个库。下完后还需要在pycharm平台上配置。what!?还 要配置?是的,因为这两个库不同于其他wordcloud、request等,装了直接用。
具体配置pycharm和pyqt5的方法,百度下就有很多帖子,可参考:
https://www.cnblogs.com/BlueSkyyj/p/8398277.html
(2)用python实现GUI界面有两种方法,一种是依赖于Qt Designer图形化界面,一种当然是大神类的直接敲代码了。
Qt Designer界面如下:
其实,在玩QT时,我就觉得又在学习一个新的软件了。是的,新的界面,新的功能,的确在python学习成长之路上每遇到新技巧,都是需要重新学习,但不要因此打退堂鼓。以不退的痛苦,换有所成长。
关于图形化界面,我就不介绍了,每个按钮、选项多点点,拖拖,玩着玩着就知道是干嘛用的了。
(3)在用QT打好GUI的控件布局后,开始真正的python GUI代码编写了。
示例代码中主要用到4个控件,comboBox(下拉条)、plainTextEdit(文本框)、label(标签)、pushButton(点击按钮),当然还有列表框、线条、拨号按钮等。因为示例代码中没用到,我就不引申了,用到了再学呗。
针对以上控件,方法如下:
setObjectName:设置控件名称,通用
setGeometry:设置坐标,通用
setStyleSheet:设置控件样式、字体,通用
setWindowTitle:设置主窗口标题
setTips:设置Tips提示,通用
setText、setHtml:设置控件内容,但 是对plainTextEdit无用
setplainText:是针对plainTextEdit控件的设置内容方法
clicked:针对pushbutton控件的点击方法
currentText:获取下拉条的当前内容
(4)程序显示GUI界面:
# GUI显示
app = my_GUI.QtWidgets.QApplication(sys.argv)
Dialog = my_GUI.QtWidgets.QDialog()
ui = my_GUI.Ui_Dialog(redballlist,blueballlist,periodlist)
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec())
先声明一个app实例,用于系统执行app.exec();再把GUI制作的类以ui实例化进行展示。不懂也没事,按流程走就行,反正我也不是很懂,哈哈!
【写在最后】
咦,是不是漏了一个章节,就是标题中霸气侧漏的“十杀九取”技战法介绍?哈哈,是的,我故意不写的,这么宝贵的方法怎能轻易共享?因为我花了十分钟从百度里搜出来的。没有天才之资,想轻松写个代码就预测准确下一期的号码,未免有点痴人说梦了。历来那么多的数学家都无法预测的东西,我肯定是没那个本事了。不过说实话,我统计了代码中的算法,准确率大概是70%左右,因此就写了个文章,记录下python GUI制作的方法,同时博大家一笑。
【自我推荐】
如果大家觉得有所帮助或者想一起学习,可以关注我的公众号“鹏哥贼优秀”,谢谢大家!