1. 程式人生 > >利用爬蟲、SMTP和樹莓派3B發送郵件(爬取墨跡天氣預報信息)

利用爬蟲、SMTP和樹莓派3B發送郵件(爬取墨跡天氣預報信息)

zip ont 一份 receive 編譯 zh-cn 郵件 接受 code

-----------------------------------------------------------學無止境------------------------------------------------------

前言:大家好,歡迎來到譽雪飛舞的博客園,我的每篇文章都是自己用心編寫,

算不上精心但是足夠用心分享我的自學知識,希望大家能夠指正我,互相學習成長。

轉載請註明:https://www.cnblogs.com/wyl-pi/p/10635476.html

墨跡天氣,不是老年人大都耳熟能詳吧,用著呢吧或者或用過吧,嗯...的確不錯。

(過一陣子再給大家更新一個帶語音播報的電子郵箱之類的東西出來,分享給大家,敬請期待吧。)

會運行錯誤,得先安裝庫 sudo pip install SMTP or sudo apt-get SMTP

尷尬我也忘了.....

先上一個百度的非常實用簡單易懂的小實例,作為下文的學習基石。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import smtplib
from email.mime.text import MIMEText
from email.header import Header
 
# 第三方 SMTP 服務
mail_host="smtp.sohu.com"  #設置服務器
mail_user="wyl1346****[email protected]
" #用戶名 mail_pass="**密碼-password**" #口令 sender = wyl1346*****[email protected] ##搜狐向QQ發送郵件 receivers = [1346*****[email protected]] # 接收郵件,可設置為你的QQ郵箱或者其他郵箱 ##郵件的來去地址 message = MIMEText(Here is email_text.Python 郵件發送測試..., plain, utf-8) message[From] = Header(sender, utf-8) message[To] = Header(receivers[0],
utf-8) ## 郵件內容 經過Header函數編譯成utf-8格式的郵件 ## subject = Python SMTP 郵件測試 message[Subject] = Header(subject, utf-8) try: SmtpObj = smtplib.SMTP() # 創建 SMTP 對象 print("SMTP complete") SmtpObj.connect(mail_host, 25) # 25 為 SMTP 端口號 print("connect complete") # mail_host服務器 地址 SmtpObj.login(mail_user,mail_pass) print("login complete") ## SMTP.sendmail(from_addr, to_addrs, msg) ## ## from發送者地址 to接受者地址 msg發送的內容 SmtpObj.sendmail(sender, receivers, message.as_string()) print("郵件發送成功") except smtplib.SMTPException: print("Error: 無法發送郵件")

以後有我這個文章你手機可以刪掉某APP,緩解內存壓力了。而且每天通過郵件查看天氣非常個性,

高大上說不上起碼是不走尋常路的奇葩,哈哈,沒錯我就是這樣。

畢竟好鉆研不是壞事,不要總是拿一些唾手可得的東西,沒啥意思,沒有技術含量,自己動手,嗯,是吧!那感覺就是不一樣。

技術分享圖片

好,上面的小實例看懂後,後面也好辦,no problem.

  1 import time
  2 import smtplib
  3 import requests
  4 import random
  5 import socket
  6 import bs4
  7 from bs4 import BeautifulSoup
  8 from email.mime.text import MIMEText
  9 from email.header import Header
 10 
 11 def get_content(url):
 12         header = {
 13         Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,
 14         Accept-Encoding : gzip, deflate,
 15         Accept-Language : zh-CN,zh;q=0.9,en;q=0.8,
 16         Cache-Control : max-age=0,
 17     Connection : keep-alive,
 18         User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36
 19         }
 20         timeout = random.choice(range(80, 180))
 21         while True:
 22                 try:
 23                         rep = requests.get(url,headers = header,timeout = timeout)
 24                         rep.encoding = utf-8
 25                         break
 26                 except socket.timeout as e:
 27                         print( 3:, e)
 28                         time.sleep(random.choice(range(8,15)))
 29                 except socket.error as e:
 30                         print( 4:, e)
 31                         time.sleep(random.choice(range(20, 60)))
 32         return rep.text
 33 
 34 def get_weather(url,data):
 35         air_list = []
 36         weather_list = []
 37         #weather_status = []
 38         soup = BeautifulSoup(data,lxml)
 39         div = soup.find(div,{class : forecast clearfix})
 40 
 41         air_quality = div.find(strong,class_=level_2).string    #空氣質量
 42         date = div.find(a,href=https://tianqi.moji.com/today/china/shandong/penglai).string
 43         wind_direction = div.find(em).string   #風向
 44         wind_grade = div.find(b).string           #風速
 45         ul = div.find(ul,{class : clearfix})
 46 
 47 ##  天氣情況抽取  ##
 48         a = []
 49         li = ul.find_all(li)
 50         j=0
 51         #return li
 52         for i in li:
 53             j+=1
 54             if j==2:
 55                 a = i
 56                 a = str(a).replace(\n,‘‘).replace(\t,‘‘).replace( ,‘‘).replace("</li>","").replace(\r,‘‘)
 57                 a = a.replace(<li><span>,‘‘).replace(<imgalt=,‘‘).replace(src="https://h5tq.moji.com/tianqi/assets/images/weather/,‘‘)
 58                 a = a.replace(.png/></span>,‘‘).replace(.png"/></span>,‘‘).replace(",‘‘).replace(\t,‘‘)
 59                 
 60                 for x in range(100,0,-1):
 61                     #print("w{0}".format(x))
 62                     a = a.replace(("w{0}".format(x)),‘‘)
 63 
 64         if(len(a)==2):
 65             a = a[0:1]
 66         if(len(a)==4):
 67             a = a[0:2]
 68 
 69         for day in li:
 70             if not isinstance(day,bs4.element.Tag): 
 71                 date = day.find(a,href=https://tianqi.moji.com/today/china/shandong/penglai).string
 72 
 73             weather_list.append(day.string)
 74             if not isinstance(day,bs4.element.Tag):
 75                 wind_direction = day.find(em).string
 76                 wind_grade = day.find(b).string
 77                     
 78         Tempreture = weather_list[2]
 79         air_quality =air_quality.replace("\n","").replace( ,‘‘)
 80         #air_quality = str(air_quality).replace(‘\n‘,‘‘).replace(‘ ‘,‘‘)
 81         #print("‘data‘ {0} ‘Tempreture‘ {1},air_quality {2}\n,‘wind_grade‘ {3},‘wind_direction‘ {4}".format(date,Tempreture,air_quality,wind_grade,wind_direction))
 82         return (" 時   間 : {}\n 天氣情況: {}\n 溫   度 : {}\n 風   向 : {}\n 風   速 : {}\n 空氣質量: {}\n".format(date,a,Tempreture,wind_direction,wind_grade,air_quality))
 83                        
 84 def send_email(email):
 85         ‘‘‘
 86         sender = input(‘From: ‘)
 87         password = input(‘password: ‘)
 88         smtp_server = input(‘SMTP_Server: ‘)
 89 ‘‘‘
 90 
 91         ##     FROM    ##
 92         sender = [email protected]
 93         sent_host = smtp.sohu.com
 94         sent_user = [email protected]
 95         sent_pass = cxlgWYL1
 96 
 97         ##     TO     ##
 98         receivers = [24******[email protected]‘] 99 
100         #message = MIMEText("親愛的,我現在來播報今天的蓬萊天氣。\n(嗯...其實現在還只能看不能播)如下所示:\n 時 間| 天氣情況 | 溫 度 | 風 向 | 風 速 | 空氣質量\n‘{0}\n".format(result),‘plain‘,‘utf-8‘)
101         message = MIMEText("親愛的今天蓬萊天氣是這樣的呦 :\n{}\n".format(result),plain,utf-8)
102         
103         ##   JUST USE TO DISPLAY   ##
104         message[From] = Header(自定義From,utf-8)
105         message[To] = Header(自定義To,utf-8)
106         Subject = "今天的天氣預報詳情!"
107         message[Subject] = Header(Subject,utf-8)   #標題
108         try:
109             server = smtplib.SMTP()
110             #server = smtplib.SMTP(sent_host,25)
111             print("SMTP complete")
112 
113             server.connect(sent_host,25)
114             print("connect complete")
115             
116             #server.set_debuglevel(1)
117             server.login(sent_user,sent_pass)
118             print("login complete")
119 
120             server.sendmail(sender,receivers[0],message.as_string())
121             print("郵件發送成功")
122             #server.quit()
123 
124         except smtplib.SMTPException:
125             print("Error:發生未知錯誤,無法發送郵件!")
126 
127 if __name__  == __main__:
128         result =[]
129         url = http://tianqi.moji.com/weather/china/shandong/penglai
130         data = get_content(url)
131         result = get_weather(url,data)
132         result = str(result).replace("\\r","").replace(\t,‘‘).replace(\r,‘‘).replace("\\n","")
133         print("result is \n{}\n".format(result))
134         send_email(result)

註:這篇文章我是在win10系統下的演示,我昨天試了一下在樹莓派用戶交互界面下一樣,只是需要安裝一下庫SMTP,小改動根據提示來就行,好吧我的錯,

我抽出空來再把在樹莓派下的測試結果分享給大家,然後寫完.py 文件的python腳本,在.sh下編輯生成一個開機自啟的腳本就每天都能發送今天的天氣預報到

你的郵箱裏,received設置接受人群,不知可以給你發送可以給你的愛人,你的兄弟姐妹,你的爸爸媽媽,沒錯,送上一份你的愛,傳遞溫暖。

技術分享圖片

嗯中間有很多小BUG我都修復了,但是這個運行結果還是有問題,細心的朋友應該發現了,看到了吧,天氣情況:晴w

我們先找到天氣情況的變量名為 a,所以找到對於變量 a 的編輯的地方查詢問題。

技術分享圖片

先print(a)看為什麽 天氣情況 剪裁後的信息,輸出變量 a 為:"晴w0晴",哦.....經過我的查詢,發現是因為for x in range(100,1,-1)的原因

(這張截圖是我改動之後的)它只遍歷到w1,沒有到w0,,,粗心了,很多朋友可能會問我為什麽加這些多此一舉的for直接去掉w0不就行了,我第一天也是這麽想的,

然而第二天它就變成了w3、w1、w10、、、、,所以我就簡單粗暴的直接for遍歷;後面的 len 函數是因為每天的天氣狀況不同比如"小雨","晴","陰"字數上有不同我通

過 len 函數進行處理截取我想要留下的內容,呈現給用戶;(因為初期bug挺多的,而且使用BeautifulSoup庫裏有個挺廢頭的問題,過了挺久了,忘了,反正差不多是類

型的問題,網上能百度出來很多,但是出問題的解析答案寥寥無幾,幾乎沒有,也只能FQ出去還有不少,但英語硬傷的,翻譯很多原意就曲解了,致使本來就懵,

看完之後可想而知的狀態.......)我後來呢是另辟新徑找到了別的解決方法,所以沒有繼續太過糾結這個問題,我推薦大家還是耐住性子鉆研下去,的確成長,不過

也要把握個度(我是因為要比賽趕進度時間不多,不允許我鉆下去),不要非得不撞南墻不回頭,不整出來誓不罷休,精神可嘉但效果欠佳。

  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment

如有網友大佬有推薦切實可行的優化方法,我一定洗耳恭聽,我在這提前謝謝您了。

技術分享圖片

修復好bug運行檢測:

技術分享圖片

檢驗郵箱結果:

技術分享圖片

過一陣子再給大家更新一個帶語音播報的郵件出來?我也不知道沒想好,會分享給大家,敬請期待吧。

當然這篇教程只是用來學習,請勿進行商業活動甚至非法活動,切勿侵害他人權益,提前聲明概不負責。

如果覺得我的文章還不錯,關註一下,頂一下 ,我將會用心去創作更好的文章,敬請期待。

利用爬蟲、SMTP和樹莓派3B發送郵件(爬取墨跡天氣預報信息)