Python3爬虫教程之利用Python实现发送天气预报邮件


Posted in Python onDecember 16, 2018

前言

此次的目标是爬取指定城市的天气预报信息,然后再用Python发送邮件到指定的邮箱。

下面话不多说了,来一起看看详细的实现过程吧

一、爬取天气预报

1、首先是爬取天气预报的信息,用的网站是中国天气网,网址是http://www.weather.com.cn/static/html/weather.shtml,任意选择一个城市(比如武汉),然后要爬取的内容为下面的部分:

Python3爬虫教程之利用Python实现发送天气预报邮件

Python3爬虫教程之利用Python实现发送天气预报邮件

先查看网页源代码,并没有找到第一张图中的内容,说明是这些天气信息是通过别的方式加载出来的。我们打开开发者工具,点击XHR选项,发现没有任何内容,但是点击JS选项后可以找到如下内容:

Python3爬虫教程之利用Python实现发送天气预报邮件

然后就是把URL复制下来进行爬取,不过要注意加上User-Agent和Referer字段,而且如果一直用一个User-Agent的话就会被识别出来,所以我们需要定义一个函数来返回随机的User-Agent以供使用。

def get_agent():
 import random
 user_agent_list = [
  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"
  "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
  "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
  "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
  "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
  "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
  "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
  "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
  "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
  "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
  "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
  "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
  "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
 ]
 return random.choice(user_agent_list)

爬取后的结果如下:

{'PM2.5': '158',
'城市': '武汉',
'天气': '多云',
'日期': '12月16日(星期日)',
'洗车指数': '无雨且风力较小,易保持清洁度。',
'温度': '12℃',
'相对湿度': '47%',
'穿衣指数': '建议着厚外套加毛衣等服装。',
'紫外线指数': '涂擦SPF大于15、PA+防晒护肤品。',
'风力等级': '2级',
'风向': '西南风'}

2、我们已经能爬取天气预报的内容了,但是如果我们想要爬取任意城市的天气预报,又要怎么办呢?

先找几个城市对应的链接看一下:武汉(http://www.weather.com.cn/weather1d/101200101.shtml)、广州(http://www.weather.com.cn/weather/101280101.shtml?)、杭州(http://www.weather.com.cn/weather1d/101210101.shtml),很明显每个城市有一个对应的编码,而我们只要获得全国主要城市的编码信息,也就能得到这些城市的天气预报了。

这一步花费了我不少时间,问题就在于从哪里得到这些编码信息,最后找到了一个办法。首先是查看国内天气预报,当我们的鼠标移到某个省的地图上的时候,就会显示其省会的天气情况:

Python3爬虫教程之利用Python实现发送天气预报邮件

而当我们用鼠标左键点击的时候,就能够查看这个省的整体天气情况:

Python3爬虫教程之利用Python实现发送天气预报邮件

打开开发者工具,点击XHR选项,可以发现有如下内容,而这些数据里就包含着我们需要的编码信息:

Python3爬虫教程之利用Python实现发送天气预报邮件

做到这一步我们就可以获得全国主要城市的编码信息了,不过要注意的是,这些编码并不都是能直接添加到我们的代码中进行使用的,通过观察可以发现,四个直辖市的编码是不需要做改变的,其余的省需要在得到的编码后面加上一个01。

二、发送邮件

要使用Python来发送邮件,需要使用两个模块:smtplib和email。这两个模块是Python自带的,只需import即可使用,其中smtplib模块主要负责发送邮件,email模块主要负责构造邮件。

我使用的是163邮箱,用别的邮箱也可以,不过方法会有所不同。在发送邮件之前,需要先设置授权码,在设置完之后,要记住你的授权码,在后面会用到的:

Python3爬虫教程之利用Python实现发送天气预报邮件

一个测试的例子如下:

import smtplib
from email.header import Header
from email.mime.text import MIMEText

sender = "xxx@163.com" # 发件人的邮箱
password = "xxx" # 这里的密码不是登陆邮箱的密码,而是授权码
receiver = "xxx@163.com" # 收件人的邮箱,可以是同一个
mail = MIMEText("这是邮件内容", 'plain', 'utf-8') # 邮件内容
mail['Subject'] = Header('这是邮件主题', 'utf-8') # 邮件主题
mail['From'] = sender # 发件人
mail['To'] = receiver # 收件人
smtp = smtplib.SMTP()
smtp.connect('smtp.163.com', 25) # 连接邮箱服务器
smtp.login(sender, password) # 登录邮箱
smtp.sendmail(sender, receiver, mail.as_string()) # 第三个是把邮件内容变成字符串
smtp.quit() # 发送完毕,退出
print('邮件已成功发送!')

有几点要注意的是:

(1)mail['From']和mail['To']是一定要加上的,不能省略;

(2)由于使用的是163邮箱,所以连接服务器的时候使用的是smtp.163.com;

(3)邮件主题里不要使用“test”,不然会被标记为垃圾邮件。

三、运行结果

首先是程序运行的结果截图:

Python3爬虫教程之利用Python实现发送天气预报邮件

然后打开邮箱查看:

Python3爬虫教程之利用Python实现发送天气预报邮件

完整代码已上传到GitHub:https://github.com/QAQ112233/Weather(本地下载)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python实现bitmap数据结构详解
Feb 17 Python
python实现颜色rgb和hex相互转换的函数
Mar 19 Python
Python中使用第三方库xlrd来写入Excel文件示例
Apr 05 Python
python中根据字符串调用函数的实现方法
Jun 12 Python
学习Python3 Dlib19.7进行人脸面部识别
Jan 24 Python
关于Python正则表达式 findall函数问题详解
Mar 22 Python
Python 批量合并多个txt文件的实例讲解
May 08 Python
python如何更新包
Jun 11 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
Jul 14 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
Sep 04 Python
Python中glob库实现文件名的匹配
Jun 18 Python
Python批量解压&压缩文件夹的示例代码
Apr 04 Python
Python Unittest根据不同测试环境跳过用例的方法
Dec 16 #Python
python使用插值法画出平滑曲线
Dec 15 #Python
python用fsolve、leastsq对非线性方程组求解
Dec 15 #Python
python实现一组典型数据格式转换
Dec 15 #Python
python判断计算机是否有网络连接的实例
Dec 15 #Python
Django model反向关联名称的方法
Dec 15 #Python
django orm 通过related_name反向查询的方法
Dec 15 #Python
You might like
用php随机生成福彩双色球号码的2种方法
2013/02/04 PHP
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
php递归删除指定文件夹的方法小结
2015/04/20 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
PHP生成静态HTML文档实现代码
2016/06/23 PHP
PHP程序员学习使用Swoole的理由
2018/06/24 PHP
分享8款优秀的 jQuery 加载动画和进度条插件
2012/10/24 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
javascript密码强度校验代码(两种方法)
2015/08/10 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
jQuery Mobile 和 Kendo UI 的比较
2016/05/05 Javascript
js实现右键自定义菜单
2016/12/03 Javascript
JS多文件上传的实例代码
2017/01/11 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
解决Webpack 热部署检测不到文件变化的问题
2018/02/22 Javascript
Vue 项目中遇到的跨域问题及解决方法(后台php)
2018/03/28 Javascript
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
jQuery实现获取及设置CSS样式操作详解
2018/09/05 jQuery
Vue项目中使用jsonp抓取跨域数据的方法
2019/11/10 Javascript
jQuery实现移动端图片上传预览组件的方法分析
2020/05/01 jQuery
[03:43]2014DOTA2西雅图国际邀请赛 newbee战队巡礼
2014/07/07 DOTA
探究Python中isalnum()方法的使用
2015/05/18 Python
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
python基础教程项目四之新闻聚合
2018/04/02 Python
Python continue继续循环用法总结
2018/06/10 Python
django 单表操作实例详解
2019/07/30 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
2020/03/10 Python
使用CSS3来绘制一个月食图案
2015/07/18 HTML / CSS
音乐教学随笔感言
2014/02/19 职场文书
岗位职责风险点
2014/03/12 职场文书
花坛标语大全
2014/06/30 职场文书
专职安全员岗位职责
2015/04/11 职场文书
法律讲堂观后感
2015/06/11 职场文书
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python