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基于ThreadingTCPServer创建多线程代理的方法示例
Jan 11 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
Feb 22 Python
Python装饰器知识点补充
May 28 Python
Python3使用pandas模块读写excel操作示例
Jul 03 Python
使用Flask集成bootstrap的方法
Jul 24 Python
python2 与 pyhton3的输入语句写法小结
Sep 10 Python
python 利用jinja2模板生成html代码实例
Oct 10 Python
大家都说好用的Python命令行库click的使用
Nov 07 Python
python实发邮件实例详解
Nov 11 Python
Python 中判断列表是否为空的方法
Nov 24 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
Nov 17 Python
Python函数对象与闭包函数
Apr 13 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+DBM的同学录程序(1)
2006/10/09 PHP
如何用php生成扭曲及旋转的验证码图片
2013/06/07 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
2015/12/24 PHP
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
jQuery之选择组件的深入解析
2013/06/19 Javascript
JS获得URL超链接的参数值实例代码
2013/06/21 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
2016/09/17 Javascript
JS中的作用域链
2017/03/01 Javascript
微信小程序实现动态设置页面标题的方法【附源码下载】
2017/11/29 Javascript
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
Python中输出ASCII大文字、艺术字、字符字小技巧
2015/04/28 Python
Python使用redis pool的一种单例实现方式
2016/04/16 Python
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
Python模拟脉冲星伪信号频率实例代码
2018/01/03 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
opencv 获取rtsp流媒体视频的实现方法
2019/08/23 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
2020/02/13 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
css3圆角样式分享自定义按钮样式
2013/12/27 HTML / CSS
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
浅谈Html5中视频 音频标签 进度条的问题
2016/07/26 HTML / CSS
美国网上鞋城:Shoeline.com
2016/11/17 全球购物
汽车专业毕业生自荐信
2013/11/03 职场文书
合伙经营协议书范本
2014/04/18 职场文书
2014年教师德育工作总结
2014/11/10 职场文书
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python
总结Pyinstaller打包的高级用法
2021/06/28 Python
Java基础之线程锁相关知识总结
2021/06/30 Java/Android
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript