一直以来对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官方认证二维码免费领取【保证100%免费】

一、Python学习大纲
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、入门学习视频
三、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
四、python副业兼职与全职路线
上面的所有资料我全部打包好了并且上传至CSDN官方,需要的点击👇获取!