【Python成长之路】python 从零学爬虫 -- 看官,请看我如何“十杀九取”,预测那下一期的双色球开奖号码

【写在前面】

    其实简单的爬虫,只要自己亲手编写过一次代码,基本就能上手,如果有不懂的可以私聊我。因为爬虫流程和解析都是有流程可依,那么为什么今天我还敢再发一次爬虫的文章呢?哈哈,那自然是因为除了爬虫外,还有新知识,比如预测下一期双色球的“十杀九取”红(蓝)球技战法,再加上我最想记录的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制作的方法,同时博大家一笑。

【自我推荐】

如果大家觉得有所帮助或者想一起学习,可以关注我的公众号“鹏哥贼优秀”,谢谢大家!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值