给自己和每个单身狗的福利
2017-11-23 本文已影响24人
比特舞者
为什么
上个星期忘了拿伞,结果下班的时候只能打车回家,白白多花了钱,我从手机中自带的闹钟里面找了一下,居然没有一个能根据天气来进行提醒的,一狠心,一跺脚,自己来写一个吧
原材料
- 中国天气网七天天气状况
- PyCharm
- 一小点爬虫、正则表达知识
- windows 的定时任务
- qq 邮箱
开干
废话少说,先来点代码,代码地址,说起来,挺简单的,就好像把大象放冰箱里面一样步骤。
- 从天气预报的网站上把近七天的网页下载下来
- 使用正则表达式从下载下来的网页中抽出天气的数据
- 把天气数据通过 qq 邮箱发送给自己
- 使用 window是定时任务程序,定时调用 Python 的脚本
哦,NO,比把大象放冰箱里面多出了一部,不过不要在意这些细节。ok,下面来项目说一下各个步骤吧。
获取天气数据
且看get_weather
方法,我在这个方法里面,抽取了天气的数据,并且返回了一个 tuple 类型,核心代码如下:
user_agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36'
headers = {'User-Agent': user_agent, 'timeout': 60}
request = urllib2.Request(url, headers=headers)
try:
response = urllib2.urlopen(request)
except (IOError, httplib.HTTPException, httplib.BadStatusLine) as e:
print url + '列表页面发生异常', e
time.sleep(60)
return get_weather(url)
else:
其中,需要注意一下几点
- header 头信息中,timeout 的设置。访问网页的反应时间,当超过这个时间后,程序会报出异常。
- httplib.BadStatusLine 的这个异常处理需要注意一下,当网站没有反应的时候程序就会抛出这个异常。这个非常有用,如果不捕捉这个异常,程序当遇到 httplib.BadStatusLine 异常时,会停止。我对这个异常做了捕捉,所以我在后面让程序暂停了 1 分钟,然后再递归的调用 get_weather,直到调用成功为止。
- 另外,在
case_weather
这个函数中,对天气的数据稍微做了一些处理,读者可自行阅读。
发送天气数据到 QQ 邮箱
-
使用 QQ 邮箱的前提条件是在 QQ 邮箱开启 IMAP/SMTP服务,为了方便起见,我是全部开始了。
开始 IMAP/SMTP 服务 - 开启后,使用 Python 自带的 smtp 组件把天气的信息发送到我自己的邮箱。
设置定时任务
这里使用的 win7 系统自带的定时任务程序,参照文章,需要注意的是,在开启任务的时候,要设关闭上次执行的进程,这样设置是为了不被一次任务出现异常而阻塞整个定时任务。
另外需要注意的是不用使用基本任务,要使用“任务”,否则存在任务执行不成功的隐患。