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读取视频的两种方法(imageio和cv2)
Apr 15 Python
django 删除数据库表后重新同步的方法
May 27 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
Jun 04 Python
根据DataFrame某一列的值来选择具体的某一行方法
Jul 03 Python
python生成1行四列全2矩阵的方法
Aug 04 Python
python实现的config文件读写功能示例
Sep 24 Python
python爬虫模拟浏览器访问-User-Agent过程解析
Dec 28 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
Feb 28 Python
Django框架models使用group by详解
Mar 11 Python
Python类super()及私有属性原理解析
Jun 15 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
Nov 01 Python
详解Python中*args和**kwargs的使用
Apr 07 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实现根据浏览器跳转不同语言页面代码
2013/08/02 PHP
php使用Cookie实现和用户会话的方法
2015/01/21 PHP
php实现向javascript传递数组的方法
2015/07/27 PHP
PHP的全局错误处理详解
2016/04/25 PHP
PHP删除字符串中非字母数字字符方法总结
2019/01/20 PHP
将函数的实际参数转换成数组的方法
2010/01/25 Javascript
js中widow.open()方法使用详解
2013/07/30 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
2014/02/24 Javascript
display和visibility的区别示例介绍
2014/02/26 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
2015/07/01 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
2016/01/07 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
JavaScript 对象字面量讲解
2016/06/06 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
React 使用recharts实现散点地图的示例代码
2018/12/07 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
2020/01/08 Javascript
JS实现可视化音频效果的实例代码
2020/01/16 Javascript
Vue单文件组件开发实现过程详解
2020/07/30 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
2020/11/16 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
Python使用Paramiko模块编写脚本进行远程服务器操作
2016/05/05 Python
对Django 中request.get和request.post的区别详解
2019/08/12 Python
python提取xml里面的链接源码详解
2019/10/15 Python
python list多级排序知识点总结
2019/10/23 Python
python实现门限回归方式
2020/02/29 Python
Python爬虫教程知识点总结
2020/10/19 Python
如何进行Linux分区优化
2013/02/12 面试题
中专生自我鉴定范文
2014/02/02 职场文书
社会学专业学生职业规划书
2014/02/07 职场文书
小学运动会演讲稿
2014/08/25 职场文书
留学推荐信中文范文
2015/03/26 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书