python爬取彩票网站开奖号码 - Go语言中文社区

python爬取彩票网站开奖号码


一直以来对python特别感兴趣,但却没有一个目标去好好学习这门语言。昨天突然有个想法,老爸喜欢买七星彩,为何不抓取每一期的开奖号码,通过邮件推送给他呢。这样他既能第一时间知道开奖号码了。
然后就动手开干,但是为什么选择python,其实用php我写得更快一些。还是因为看了点python没有机会实践,或者说懒得去实践。
本次实例安装标题,将每一个方法拆分出来说明,同时这也是开发过程中的思路。

研究目标页面

在动手之前需要了解一些将要抓取页面的结构。
目标地址:http://caipiao.163.com/award/qxc/
这里写图片描述
网站编码是utf-8,下面开始进入代码。

抓取页面代码

from urllib import request
def getHtml(url):  #获取页面的源代码
    page = request.urlopen(url)
    html = page.read()
    html = html.decode('utf-8')
    return html
print(getHtml('http://caipiao.163.com/award/qxc/'))

获取页面代码其实很简单,引入urllib库。方法中第一行为打开一个url地址,这时拿到的是一个对象,通过read()方法能拿到这个整个页面的代码,再通过utf-8编码(网站编码),使代码中的中文能被看懂。
下面来看一下运行结果。
这里写图片描述
好家伙,出错了。这里我爬了一个小时,用了各种编码都是报错。后来百度到一句话:有些网站为了能加载速度快,把代码压缩了。然后顺着这句话,我还真找到一个python的解压缩库。修改了代码之后

from urllib import request
import gzip
def getHtml(url):  #获取页面的源代码
    page = request.urlopen(url)
    html = page.read()
    html = gzip.decompress(html)
    html = html.decode('utf-8')
    return html
 print(getHtml('http://caipiao.163.com/award/qxc/'))

运行结果如下
这里写图片描述
总算是把前端代码取到了。

正则匹配需要的值

这里写图片描述
需要的内容就框在两个p标签中,稍微看了一下,决定用两个正则来取这个开奖号码,先取出p标签中的内容,再取开奖号码

def getball(html): #正则匹配出开奖号码
    regall = r'<p id="zj_area">(.+)</p>'
    reg = r'<span class="red_ball">([0-9])</span>'
    balllist = re.findall(regall,html)
    openball = re.findall(reg,balllist[0])
    return openball

因为不太会写正则,所以匹配了两遍,有点笨但是这里可行。如果有更好的匹配方式,欢迎讨论。
运行结果取到下面一个列表
[‘6’, ‘6’, ‘6’, ‘6’, ‘4’, ‘5’, ‘8’]
到这里抓取开奖号码就已经完成,但是离我的目标还远,我需要对比每一次的开奖结果,将最新的开奖号码通过邮件的形式发送出去。

将开奖号码保存

为什么要保存开奖号码呢?因为每次抓取的不一定是最新的开奖号码,需要新旧对比才能知道那一次抓的是最新开奖号码,当抓到最新的号码后才发送邮件。
这里选择文件来保存

def insertTxt(file,data): #将开奖号码保存到文件中
    in_put = open(file, 'w')
    in_put.write(str(data))
    in_put.close()

一个简单的文件保存方法就完成,说明一下第二行,因为正则匹配到的是一个列表,所以这里需要转换成字符串才能保存到文件中。

读取文件中的开奖号码

既然保存了文件,就需要再讲文件的内容读取出来,不然保存也没有意义对吧。哈哈哈

def getTxt(file): #从文件中读取之前的开奖号码
    out_put = open(file, 'r')
    result = out_put.read()
    out_put.close()
    return result

这里将之前保存旧开奖号码从文件中提取出来,用于与当前抓取到的开奖号码对比。如果号码相同则不做处理,如果不相同这替换文件,同时将新一期的开奖号码通过邮件发送。

整体处理函数

在下面的代码中我把发邮件的逻辑直接写进去了,这里我隐藏了邮件的相关信息,同时也不讲解发邮件的相关内容,有兴趣的可以自己去研究,使用的是python自带的smtp库。

def deal(url): #主逻辑
    html = getHtml(url)
    openball = str(getball(html)) #将开奖的list转换成str
    oldball = getTxt('data.txt') #从文件中读取历史开奖号码
    if openball==oldball:
        print('还没开奖')
    else:
        insertTxt('data.txt',openball)  #更新开奖号码保存文件

        mail_host=""  #设置服务器
        mail_user=""    #用户名
        mail_pass=""   #口令 

        message = MIMEText('本期七星彩开奖结果'+openball, 'plain', 'utf-8')
        message['From'] = Header("python系统", 'utf-8')
        message['To'] =  Header("", 'utf-8')
        subject = '七星彩开奖结果'
        message['Subject'] = Header(subject, 'utf-8')

        smtpObj = smtplib.SMTP()
        smtpObj.connect(mail_host, 25)
        smtpObj.login(mail_user,mail_pass)
        smtpObj.sendmail('','', message.as_string())
        print('和上次号码不同,已开奖')

运行结果
这里写图片描述

成功抓取到开奖号码,并发送邮件。
这里虽然不介绍邮件的功能,但是觉得有必要说一下。我不清楚别的邮件服务器怎么样,当时使用的163的服务器,对方返回了一个错误编码,大概的意思是无法辨别我发的邮件是否垃圾邮件,服务禁止我的请求。后来改用了公司的邮件服务器,算是成功发送了。如果要动手写发邮件的代码,可能会碰到点问题。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u011061889/article/details/71598672
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-16 10:07:39
  • 阅读 ( 730 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢