利用爬蟲、SMTP和樹莓派3B發送郵件(爬取墨跡天氣預報信息)
-----------------------------------------------------------學無止境------------------------------------------------------
前言:大家好,歡迎來到譽雪飛舞的博客園,我的每篇文章都是自己用心編寫,
算不上精心但是足夠用心分享我的自學知識,希望大家能夠指正我,互相學習成長。
轉載請註明: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發送郵件(爬取墨跡天氣預報信息)