最近学习了一下Python的基础,想写个东西练练手。正好每次跟号的大乐透还需要手动兑奖或者去彩票站兑奖,自己写一个脚本自动抓取开奖结果,核对开奖金额后邮件通知。

整体思路:

  1. 找可抓取开奖结果网站
  2. 找可以发送邮件的免费服务器
  3. 写抓取、兑奖、发邮件脚本
  4. 设定自动执行脚本

踩坑:

  1. 2.7.3版本,使用requests、urllib3包的ssl有问题,最后也没解决了,执行的时候能执行,但是有警告信息,3.1上没问题。
  2. 找的网站,抓取历史数据的时候,频繁抓取会被限制,需要设定执行频率或者更改proxy。

详细过程:

1,找可抓取开奖结果网站

要求:开奖后及时更新结果;结果数据方便解析;

最后选中了彩经网的,开奖半小时内更新,而且结果只有一个table,很简单,方便解析。

例:https://www.cjcp.com.cn/kaijiang/data/ajax_dlt.php?qh=2021146

2,找免费发送的邮件服务器

要求:常用QQ邮箱,那些非互联网上认证的邮件发送服务器(域名和出口IP不一致)的邮件会被拒收,所以需要找一个互联网上认证的邮件服务器进行发送。横向比较后,选择了163邮箱(比QQ邮箱认证简单一些)。

3,写抓取、兑奖、发邮件脚本

抓取:

#从彩经网获取大乐透开奖号码,
#lot:彩票期数,例如:2021140
def getlottery(lot):target = "https://www.cjcp.com.cn/kaijiang/data/ajax_dlt.php?qh=" + lot#设置requests headerheaders={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36','Host': 'www.cjcp.com.cn','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3'}req = requests.get(url=target,headers=headers,verify=False)#req = requests.get(url=target,verify=False)#print(req.text)red = []#blue = []num=""#txt=(BS(req.text,'lxml')).splitlines()txt=req.text.splitlines()for ln in txt:if "qiu_r" in ln:num = ln.replace('<span class="qiu_r">',"").replace("</span>","").strip()#print(num)# red += numred.append(num)elif "qiu_b" in ln:#print(ln)num = ln.replace('<span class="qiu_b">',"").replace("</span>","").strip()#print(num)#blue += ln.replace('<span class="qiu_b">',"").replace("</span>","")red.append(num)return red

核对:

#查看是否中奖
#buy_num:买的号码,单注形式 例如:04,08,14,33,35:06,10
#prize_num:开奖号码,例如:03, 20, 25, 30, 34, 02, 09]
#return:中几等奖,0:未中奖,1-9中的奖的等数
def checkprized(buy_num,prize_num):prized = '0'#开奖红球pred = prize_num[0:5]#开奖蓝球pblue = prize_num[5:7]#购买红球br = buy_num.split(':')[0]#购买蓝球bb = buy_num.split(':')[1]#print('bought:',br,':::',bb)rcnt = 0bcnt = 0#红球匹配数for num in br.split(','):if num in pred:rcnt += 1#蓝球匹配数for num in bb.split(','):if num in pblue:bcnt += 1#中奖规则if rcnt == 5 and bcnt == 2:prized = '1'elif rcnt == 5 and bcnt == 1:prized = '2'elif rcnt == 5 and bcnt == 0:prized = '3'elif rcnt == 4 and bcnt == 2:prized = '4'elif rcnt == 4 and bcnt == 1:prized = '5'elif rcnt == 3 and bcnt == 2:prized = '6'elif rcnt == 4 and bcnt == 0:prized = '7'elif (rcnt == 3 and bcnt == 1) or\(rcnt == 2 and bcnt == 2):prized = '8'elif rcnt == 3 or \(bcnt == 1 and rcnt ==2) or \(bcnt == 2 and rcnt ==1) or \bcnt == 2:prized = '9'else:prized = '0'return prized

计算金额:

#根据中几等奖计算中奖金额
#prized:中几等奖
#return:中奖金额,1,2等奖浮动按照1千万和2百万计算
def countpay(prized):pay = 0for i in prized:if i == '0':continueelif i == '1':pay += 10000000            elif i == '2':pay += 2000000            elif i == '3':pay += 10000            elif i == '4':pay += 3000            elif i == '5':pay += 300            elif i == '6':pay += 200            elif i == '7':pay += 100            elif i == '8':pay += 15            elif i == '9':pay += 5            #print "中奖金额:" + str(pay)return pay

发送邮件


def send(subject,content,receivers=['xxxxxxxx@qq.com']):#设置服务器所需信息,使用163邮箱发送#邮箱服务器地址mail_host = 'smtp.163.com'#用户名mail_user = 'xxxxxxxx'#密码(部分邮箱为授权码) mail_pass = 'xxxxxxxx'#邮件发送方邮箱地址sender = 'xxxxxxxx@163.com'  #邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发#receivers = ['xxxxxxxx@qq.com']  #设置email信息#邮件内容设置message = MIMEText(content,'plain','utf-8')#邮件主题       message['Subject'] = subject #发送方信息message['From'] = sender #接受方信息     message['To'] = receivers[0]  #登录并发送邮件try:smtpObj = smtplib.SMTP() #连接到服务器smtpObj.connect(mail_host,25)#登录到服务器smtpObj.login(mail_user,mail_pass) #发送smtpObj.sendmail(sender,receivers,message.as_string()) #退出smtpObj.quit() except smtplib.SMTPException as e:print('error',e) #打印错误#send('测试邮件','测试内容')

主程序

#主程序开始
#从lotfile中取上次写入的期数数
lot = "2021140"
with open('lotfile', 'r') as f:for l in f:lot = l.strip('\n')break
f.close()#取系统时间的年份
year = time.strftime("%Y", time.localtime())#判断年份是否和lot的年份一致,不一致设为为当年第一期
if lot[0:4] != year:lot = year + '001'#从采经网获取开奖号码
#num = ['03','04','21','22','35','02','09']
num = getlottery(lot)#没有取得开奖结果(非未开奖)
if not num:print('系统或网络问题')sys.exit(1)
elif num[0] == '':
#未开奖的时候,有报文,没有中奖号码print('尚未开奖')sys.exit(0)#是否中奖,针对购买号码的组数,序列类型
isprized=[]
#邮件内容
content=''#从bought文件中读取购买号码,可以放多条,每条一行
#按照单式记录,格式为1,2,3,4,5:6,7
with open('bought', 'r') as fb:for l in fb:lt = l.strip('\n').strip()#如果有空行的话略过if len(lt) ==0:continue#每行验证是否中奖isprized += checkprized(lt,num)#将所购号码放入邮件内容中content += l + '\n'fb.close#计算中奖金额
#isprized=['1','2','5','6','9']
#print('isprized:',isprized)
#print countpay(isprized)
pay = countpay(isprized)#邮件标题
subject='' + lot + ':' + ','.join(num) + ':' + str(pay)
#print(subject)#如果已开奖记录结果,并发送邮件,如果为空则为未开奖,什么都不做#将开奖结果记入年份的文件,留作记录
with open(year, 'a+') as rf:rf.write(subject + '\n')rf.close()#将下一期的期数,放到lotfile中
with open('lotfile', 'w') as lf:lf.write(str(int(lot)+1))lf.close()#发送邮件,标题,内容;收件人使用默认的
send(subject,content)

4,定时执行

扔在云上的Linux服务器上,设定Crontab

crontab -u python -e0 21 * * * /opt/sh/check_everyday.py

<<完整代码>>https://download.csdn.net/download/zyldlxl/68808216

Python脚本抓取大乐透开奖结果核对定投号码邮件通知相关推荐

  1. python 爬取大乐透开奖结果

    #coding=utf-8 #下面中文注释不支持 所以开头加 "#coding=utf-8" # 获取近期大乐透开奖结果, 并给出自己猜中的个数import requests# 这 ...

  2. java获取大乐透开奖_java生成大乐透中奖号码

    这段时间吃完饭都会来一两注大乐透! 然后心血来潮的用java写了个简单的随机生成大乐透号码 先晒代码: public class RandomUtil { //前区1-35个号码 private st ...

  3. Python实现双色球和大乐透摇奖

    实现代码: # code by kadycui # 模块引用 import randomdef select():print('\n')print('请选择彩票种类')print('双色球输入:1') ...

  4. 双色球大乐透开奖查询软件

    最近老买lottery,复式兑起来太麻烦了,上网一查还真没有类似软件,于是自己写了一个,这下方便了哈哈,给广大彩民分享一下 第一次居然输了点专业词汇被封了,崩溃啊,功能见截图吧,不能多说了 由于附件最 ...

  5. python大乐透代码_scrapy框架爬取大乐透数据

    上次做了一个双色球的数据爬取,其实大乐透的爬取也很简单,使用request就可以爬取,但是为了更好的进步,这次爬取大乐透采用了scrapy框架. scrapy框架的运行机制不介绍了,不懂的先去goog ...

  6. python彩票预测与分析_130期祥子大乐透预测奖号:后区大小分析

    上期奖号信息:体彩大乐透第2020129期开出奖号:10 22 27 33 34 + 01 11. 前区号码奇偶比为2:3,大小比为4:1,和值为126,跨度为24. 后区号码和值为12,跨度为10, ...

  7. python彩票分析_128期老李大乐透预测奖号:后区和值分析

    体彩大乐透第2020127期奖号为:01 04 17 18 26 + 03 10,其中前区号码奇偶比为2:3,大小比为2:3,012路比为1:2:2,后区和值为13,跨度为7. 老李大乐透第20128 ...

  8. JavaDay05.练习4.体彩7位数摇奖+福彩大乐透摇奖

    1.体彩7位数摇奖 产生一个7个数字,每个数字的取值是0-9的随机数 import java.util.Arrays; public class ArrayExercise {public stati ...

  9. Python爬取大乐透

    因为笔者经常投彩票,于是做了一个玩,初版本只是爬取,效果如下: 代码如下: import requests from requests.exceptions import RequestExcepti ...

最新文章

  1. vs2017 +CUDA 9.0配置
  2. 面向过程分析与面向对象分析之间的区别
  3. 让DNN为您的手机提供内容
  4. 编写高质量代码:改善Java程序的151个建议(第3章:类、对象及方法___建议36~40)
  5. Angular NgModule里定义的注解和NgModuleRef$1运行时
  6. java递归简易应用教程
  7. 手机虚拟摄像头_新游 | 打破次元壁障,《猪猪侠AR虚拟使命》现实约战,一切尽在创酷互动!...
  8. 彻底理解js是单线程
  9. L1-006 连续因子 (20 分)—团体程序设计天梯赛
  10. 使用Koa2重构博客项目
  11. 关于使用nRF Studio 批量烧写NRF52840 不成功的解决方案
  12. linux 移动硬盘位置,在linux中使用移动硬盘
  13. DSA数字签名原理及python实现
  14. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP
  15. Spark学习之路——9.Spark ML
  16. 计算机网络ip地址分类6,c类ip地址划分6个子网
  17. 缓存行填充与@sun.misc.Contended注解
  18. 兄弟机cnc系统面板图解_兄弟机操作面板及编程
  19. Android播放音效
  20. 如何向面试官正确地提问?

热门文章

  1. c语言如何实现自动打开网页,如何在C语言中打开网页链接,谢谢大佬!!!
  2. 常见的 CSRF、XSS、sql注入、DDOS流量攻击
  3. 旺店通·企业奇门与金蝶云星空对接集成查询货品档案连通物料新增(旺店通物料对接金蝶物料)
  4. 竣工验收报告主要内容
  5. scrach少儿编程网站精选(个人建议)
  6. 爬取淘宝python书籍销售情况动态网页
  7. [VSCode] VSCode使用C++运行HelloWorld
  8. 中国历史上六位世界首富的没落
  9. 1153 - 三个整数
  10. Intouch-System-Platform-IDE