【Python3爬虫】用Python发送天气预报邮件

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

 

1、爬取天气预报

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

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

而后就是把URL复制下来进行爬取,不过要注意加上User-Agent和Referer字段,并且若是一直用一个User-Agent的话就会被识别出来,因此咱们须要定义一个函数来返回随机的User-Agent以供使用。服务器

 1 def get_agent():
 2     import random
 3     user_agent_list = [
 4         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"
 5         "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
 6         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
 7         "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
 8         "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
 9         "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
10         "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
11         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
12         "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
13         "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",
14         "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
15         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
16         "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
17         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
18         "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
19         "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
20         "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
21         "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
22     ]
23     return random.choice(user_agent_list)

 爬取后的结果以下:dom

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

 

 二、咱们已经能爬取天气预报的内容了,可是若是咱们想要爬取任意城市的天气预报,又要怎么办呢?函数

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

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

 而当咱们用鼠标左键点击的时候,就可以查看这个省的总体天气状况:网站

 

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

 

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

 

2、发送邮件

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

我使用的是163邮箱,用别的邮箱也能够,不过方法会有所不一样。在发送邮件以前,须要先设置受权码,在设置完以后,要记住你的受权码,在后面会用到的:

一个测试的例子以下:

 1 import smtplib
 2 from email.header import Header
 3 from email.mime.text import MIMEText
 4 
 5 sender = "xxx@163.com"  # 发件人的邮箱
 6 password = "xxx"  # 这里的密码不是登录邮箱的密码,而是受权码
 7 receiver = "xxx@163.com"  # 收件人的邮箱,能够是同一个
 8 mail = MIMEText("这是邮件内容", 'plain', 'utf-8')  # 邮件内容
 9 mail['Subject'] = Header('这是邮件主题', 'utf-8')  # 邮件主题
10 mail['From'] = sender  # 发件人
11 mail['To'] = receiver  # 收件人
12 smtp = smtplib.SMTP()
13 smtp.connect('smtp.163.com', 25)  # 链接邮箱服务器
14 smtp.login(sender, password)  # 登陆邮箱
15 smtp.sendmail(sender, receiver, mail.as_string())  # 第三个是把邮件内容变成字符串
16 smtp.quit()  # 发送完毕,退出
17 print('邮件已成功发送!')

有几点要注意的是:

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

(2)因为使用的是163邮箱,因此链接服务器的时候使用的是smtp.163.com;

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

 

3、运行结果

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

而后打开邮箱查看:

 

完整代码已上传到GitHub

相关文章
相关标签/搜索