1. 程式人生 > >Python泡妹爬蟲,用Python傳送天氣預報郵件!

Python泡妹爬蟲,用Python傳送天氣預報郵件!

此次的目標是爬取指定城市的天氣預報資訊,然後再用Python傳送郵件到指定的郵箱。

一,爬取天氣預報

 
1、首先是爬取天氣預報的資訊,用的網站是中國天氣網,網址是http://www.weather.com.cn/static/html/weather.shtml 

 

任意選擇一個城市(比如武漢),然後要爬取的內容為下面的部分:

 

 

 

 

 

先檢視網頁原始碼,並沒有找到第一張圖中的內容,說明是這些天氣資訊是通過別的方式加載出來的。我們開啟開發者工具,點選XHR選項,發現沒有任何內容,但是點選JS選項後可以找到如下內容:

 

 

 

然後就是把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

很明顯每個城市有一個對應的編碼,而我們只要獲得全國主要城市的編碼資訊,也就能得到這些城市的天氣預報了。

 

這一步花費了我不少時間,問題就在於從哪裡得到這些編碼資訊,最後找到了一個辦法。首先是檢視國內天氣預報,當我們的滑鼠移到某個省的地圖上的時候,就會顯示其省會的天氣情況:

 

而當我們用滑鼠左鍵點選的時候,就能夠檢視這個省的整體天氣情況:

 

 

開啟開發者工具,點選XHR選項,可以發現有如下內容,而這些資料裡就包含著我們需要的編碼資訊:

 

 

 

做到這一步我們就可以獲得全國主要城市的編碼資訊了,不過要注意的是,這些編碼並不都是能直接新增到我們的程式碼中進行使用的,通過觀察可以發現,四個直轄市的編碼是不需要做改變的,其餘的省需要在得到的編碼後面加上一個01。

 

二、傳送郵件

要使用Python來發送郵件,需要使用兩個模組:smtplib和email。這兩個模組是Python自帶的,只需import即可使用,其中smtplib模組主要負責傳送郵件,email模組主要負責構造郵件。

 

我使用的是163郵箱,用別的郵箱也可以,不過方法會有所不同。在傳送郵件之前,需要先設定授權碼,在設定完之後,要記住你的授權碼,在後面會用到的:

 

 

 

一個測試的例子如下:

 
import smtplib from email.header import Header from email.mime.text import MIMEText sender = "[email protected]" # 發件人的郵箱 password = "xxx" # 這裡的密碼不是登陸郵箱的密碼,而是授權碼 receiver = "[email protected]" # 收件人的郵箱,可以是同一個 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”,不然會被標記為垃圾郵件。

 

三、執行結果

首先是程式執行的結果截圖:

 

 

然後開啟郵箱檢視:

 

 

 

 
☞完整程式碼已上傳到GitHub:https://github.com/QAQ112233/Weather