-----------------------------------------------學無止境-----------------------------------------------html
前言:你們好,歡迎來到譽雪飛舞的博客園,個人每篇文章都是本身用心編寫,python
算不上精心可是足夠用心分享個人自學知識,但願你們可以指正我,互相學習成長。web
轉載請註明:http://www.javashuo.com/article/p-diomrqjf-cr.html網絡
先給你們道個歉,個人上一篇文章中沒有在樹莓派的交互界面進行操做實驗,並且我答應你們必定會把這個實驗補上,雖然沒太有空整理,app
可是本身說出來的承諾,我必需要兌現,認真對待個人每一篇文章,認真對待個人每一個讀者,認真對待本身的心裏,不能應付着就過去了,dom
因此我特地給擠出時間懷着愧疚與堅決地心情再次分享完善這個小項目。socket
一開始出了不少問題,果真仍是那句金句名言,切勿眼高手低函數
既然答應給你們一個交代,那我們一個個慢慢說:學習
一、上來直接運行有錯誤的說缺少bs四、beautifulsoup庫,命令安裝;測試
#python2:
sudo apt-get install python-bs4 sudo pip install beautifulsoup4
#python3:
sudo apt-get install python3-bs4
sudo pip3 install beautifulsoup4
關於報錯信息:pip3無效命令的解決
首先安裝setuptools(必定要用sudo管理員權限作,若是長時間鏈接不上主機Ctrl+C,從新執行命令)
cd /usr/local/src/ sudo wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-19.6.tar.gz tar -zxvf setuptools-19.6.tar.gz cd setuptools-19.6/ python3 setup.py build python3 setup.py install
其次安裝pip3(網絡不佳很正常,多試幾回多試幾回)
cd /usr/local/src/ sudo wget --no-check-certificate https://pypi.python.org/packages/source/p/pip/pip-8.0.2.tar.gz tar -zxvf pip-8.0.2.tar.gz cd pip-8.0.2/ python3 setup.py build python3 setup.py install
https://www.jianshu.com/p/d4c1a08b993f
測試安裝成功,運行命令pip3成功
二、報錯信息:
FeatureNotFound: Couldn't find a tree builder with the features you requeste
https://blog.csdn.net/qq_16546829/article/details/79405605
在報錯代碼中把函數參數中全部的"lxml"改爲"html.parser"
#例子:
bs = BeautifulSoup(r, 'lxml').find(.... #改爲 bs = BeautifulSoup(r, 'html.parser').find(....
html.parser是調用python解析器,可是沒有解決lxml庫不能用的問題啊
三、看到差異了吧,使用win10_url沒法打開網頁,你能夠試試,因此問題就很嚴重了,咱們根本打不開網頁,
因此後續的爬蟲工做根本從源頭就已經宣告over了.....這也是一個小細節。
四、中文編碼報錯信息與解決方案:
這個報錯信息很顯然就是一向的中文編碼問題,讓人很頭疼,我加上了:
#!/home/pi/SmartHome/SMTP/ok' #*_*coding:utf-8_*_
但依然沒卵用,隨即我百度找到一位網友寫的文章以下:
https://blog.csdn.net/weixin_39221360/article/details/79525341
注意若是你的設備同時安裝了 Python 2.x 和 Python 3.x,你須要用 python3 運行
Python 3.x:
$python3 myScript.py
當你安裝包的時候,若是有可能安裝到了 Python 2.x 而不是 Python 3.x 裏,就須要使用:
$sudo python3 setup.py install
若是用 pip 安裝,你還能夠用pip3 安裝 Python 3.x 版本的包:
$pip3 install beautifulsoup4
https://blog.csdn.net/DoctorLDQ/article/details/73230026
解決方法有三中:
1.在命令行修改,僅本會話有效:
1)經過>>>sys.getdefaultencoding()查看當前編碼(若報錯,先執行>>>import sys >>>reload(sys));
2)經過>>>sys.setdefaultencoding('utf8')設置編碼
2.較繁瑣,最有效
1)在程序文件中如下三句
import sys
reload(sys)
sys.setdefaultencoding('utf8')
3.修改Python本環境(推薦)
在Python的Lib\site-packages文件夾下新建一個sitecustomize.py文件,內容爲:
#coding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
重啓Python解釋器,發現編碼已被設置爲utf8,與方案二同效;這是由於系統在Python啓動的時候,自行調用該文件,
設置系統的默認編碼,而不須要每次都手動加上解決代碼,屬於一勞永逸的解決方法。
#在這裏我是用的是如下方法,感受很方便,可是最後一個我感受很好一勞永逸不錯不錯,可是我沒找着....
import sys reload(sys) sys.setdefaultencoding('utf8')
五、header的改變,這也是一處必定要注意的細節。
如何獲取網頁的header{ ...}方法我仍是簡單說一下吧,會的自行略過,去本身電腦打開的網頁copy吧。
打開url,F12 而後 Ctrl+R ,
按照如下格式進行選取,寫入咱們的程序中。(不要漏掉逗號!!!!)
header = { 'authority':'h5tq.moji.com', 'accept':'image/webp,image/apng,image/*,*/*;q=0.8', 'accept-encoding':'gzip, deflate, br', 'accept-language':'zh-CN,zh;q=0.9', 'cache-control':'no-cache', 'pragma':'no-cache', 'referer':'https://tianqi.moji.com/weather/china/shandong/penglai', 'user-agent':'Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/72.0.3626.121 Chrome/72.0.3626.121 Safari/537.36' }
六、....還沒麼,今下午幾個小時整理的比較急 ,若是還有什麼問題請留言評論或者私信我均可以。
1 #利用樹莓派發送天氣預報郵件
2 import time 3 import smtplib 4 import requests 5 import random 6 import socket 7 import bs4
8 import sys 9 reload(sys) 10 sys.setdefaultencoding('utf8') 11 from bs4 import BeautifulSoup 12 from email.mime.text import MIMEText 13 from email.header import Header 14
15 def get_content(url): 16 header = { 17 'authority':'h5tq.moji.com', 18 'accept':'image/webp,image/apng,image/*,*/*;q=0.8', 19 'accept-encoding':'gzip, deflate, br', 20 'accept-language':'zh-CN,zh;q=0.9', 21 'cache-control':'no-cache', 22 'pragma':'no-cache', 23 'referer':'https://tianqi.moji.com/weather/china/shandong/penglai', 24 'user-agent':'Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/72.0.3626.121 Chrome/72.0.3626.121 Safari/537.36'
25 } 26 timeout = random.choice(range(80, 180)) 27 while True: 28 try: 29 rep = requests.get(url,headers = header,timeout = timeout) 30 rep.encoding = 'utf-8'
31 break
32 except socket.timeout as e: 33 print( '3:', e) 34 time.sleep(random.choice(range(8,15))) 35 except socket.error as e: 36 print( '4:', e) 37 time.sleep(random.choice(range(20, 60))) 38 return rep.text 39
40 def get_weather(url,data): 41 air_list = [] 42 weather_list = [] 43 #weather_status = []
44 soup = BeautifulSoup(data,'lxml') 45 div = soup.find('div',{'class' : 'forecast clearfix'}) 46
47 air_quality = div.find('strong',class_='level_2').string #空氣質量
48 date = div.find('a',href='https://tianqi.moji.com/today/china/shandong/penglai').string 49 wind_direction = div.find('em').string #風向
50 wind_grade = div.find('b').string #風速
51 ul = div.find('ul',{'class' : 'clearfix'}) 52
53 ## 天氣狀況抽取 ##
54 a = [] 55 li = ul.find_all('li') 56 j=0 57 #return li
58 for i in li: 59 j+=1
60 if j==2: 61 a = i 62 a = str(a).replace('\n','').replace('\t','').replace(' ','').replace("</li>","").replace('\r','') 63 a = a.replace('<li><span>','').replace('<imgalt=','').replace('src="https://h5tq.moji.com/tianqi/assets/images/weather/','') 64 a = a.replace('.png/></span>','').replace('.png"/></span>','').replace('"','').replace('\t','') 65
66 for x in range(100,-1,-1): 67 #print("w{0}".format(x))
68 a = a.replace(("w{0}".format(x)),'') 69
70 if(len(a)==2): 71 a = a[0:1] 72 if(len(a)==4): 73 a = a[0:2] 74 #print(a)
75
76 for day in li: 77 if not isinstance(day,bs4.element.Tag): 78 date = day.find('a',href='https://tianqi.moji.com/today/china/shandong/penglai').string 79
80 weather_list.append(day.string) 81 if not isinstance(day,bs4.element.Tag): 82 wind_direction = day.find('em').string 83 wind_grade = day.find('b').string 84
85 Tempreture = weather_list[2] 86 air_quality =air_quality.replace("\n","").replace(' ','') 87 #air_quality = str(air_quality).replace('\n','').replace(' ','')
88 #print("data {0} Tempreture {1}".format(date,Tempreture))
89 return (" 時 間 : {}\n 天氣狀況: {}\n 溫 度 : {}\n 風 向 : {}\n 風 速 : {}\n 空氣質量: {}\n".format(date,a,Tempreture,wind_direction,wind_grade,air_quality)) 90
91 def send_email(email): 92 '''
93 sender = input('From: ') 94 password = input('password: ') 95 smtp_server = input('SMTP_Server: ') 96 '''
97
98 ## FROM ##
99 sender = 'wyl13****25@sohu.com'
100 sent_host = 'smtp.sohu.com'
101 sent_user = 'wyl13*****25@sohu.com'
102 sent_pass = '****密碼****'
103
104 ## TO ##
105 receivers = ['13****25@qq.com','2******09@qq.com'] 106
107 #message = MIMEText("親愛的,我如今來播報今天的蓬萊天氣。\n(嗯...其實如今還只能看不能播)以下所示:\n 時 間| 天氣狀況 | 溫 度 | 風 向 | 風 速 | 空氣質量\n'{0}\n".format(result),'plain','utf-8')
108 message = MIMEText("親愛的今天蓬萊天氣是這樣的呦 :\n{}\n".format(result),'plain','utf-8') 109
110 ## JUST USE TO DISPLAY ##
111 message['From'] = Header('樹莓派(From)','utf-8') 112 message['To'] = Header('win10(To)','utf-8') 113 Subject = "今天的天氣預報詳情,來自樹莓派!"
114 message['Subject'] = Header(Subject,'utf-8') #標題
115 try: 116 server = smtplib.SMTP() 117 #server = smtplib.SMTP(sent_host,25)
118 print("SMTP complete") 119
120 server.connect(sent_host,25) 121 print("connect complete") 122
123 #server.set_debuglevel(1)
124 server.login(sent_user,sent_pass) 125 print("login complete") 126
127 server.sendmail(sender,receivers[0],message.as_string()) 128 print("郵件發送成功") 129 #server.quit()
130
131 except smtplib.SMTPException: 132 print("Error:發生未知錯誤,沒法發送郵件!") 133
134 if __name__ == '__main__': 135 result =[] 136 #win10_url = 'http://tianqi.moji.com/weather/china/shandong/penglai'
137 url = 'https://tianqi.moji.com/weather/china/shandong/penglai'
138 data = get_content(url) 139 result = get_weather(url,data) 140 result = str(result).replace("\\r","").replace('\t','').replace('\r','').replace("\\n","") 141 print("result is \n{}\n".format(result)) 142 #send_email(result)
最後測試結果以下:
你們應該也看到了有個很明顯的BUG就是晴晴,
可是通過個人測試,在python3下徹底ok,畢竟3纔是將來的霸主,2就不要花太多心思了。
我上面也有pip3的教程,安裝好了,把咱們所需的庫安裝到位,打開方式切換爲python3IDLE不然默認都是python2IDLE
並且。。。並且python2中也沒有運行結果沒有輸出,也許是由於python2 和 python3 的輸出函數不同所致,
python2 中print 沒有括號,python3中更加嚴謹規範帶有括號。
終於兌現了,舒心了很多....整理的不夠到位的地方還請指正。
過一陣子再給你們更新一個帶語音播報的郵件出來?我也不知道沒想好,會分享給你們,敬請期待吧。
固然這篇教程只是用來學習,請勿進行商業活動甚至非法活動,切勿侵害他人權益,提早聲明概不負責。
若是以爲個人文章還不錯,關注一下,頂一下 ,我將會用心去創做更好的文章,敬請期待。