【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

相關文章
相關標籤/搜索