python3爬取各類天氣信息
本來是想從網(wǎng)上找找有沒有現(xiàn)成的爬取空氣質(zhì)量狀況和天氣情況的爬蟲程序,結(jié)果找了一會兒感覺還是自己寫一個吧。
主要是爬取北京包括北京周邊省會城市的空氣質(zhì)量數(shù)據(jù)和天氣數(shù)據(jù)。
過程中出現(xiàn)了一個錯誤:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 250。
原來發(fā)現(xiàn)是頁面的編碼是gbk,把語句改成data=urllib.request.urlopen(url).read().decode("gbk")就可以了。
然后我把爬到的數(shù)據(jù)寫到文本文檔里了,往后可以導(dǎo)入到excel表中使用。
實(shí)驗(yàn)室的電腦不經(jīng)常開,然后就放到服務(wù)器上了,讓它自己慢慢一小時爬一次吧~哈哈哈~
后面有一次晚上出現(xiàn)了異常,因?yàn)闆]加入異常處理,所以從零點(diǎn)到早上五點(diǎn)的數(shù)據(jù)都沒爬到。。。
(⊙﹏⊙)然后這次修改就加入了異常處理。如果出現(xiàn)URLError,就一分鐘后重試。
代碼:
#coding=utf-8 #北京及周邊省會城市污染數(shù)據(jù)、天氣數(shù)據(jù)每小時監(jiān)測值爬蟲程序 import urllib.request import re import urllib.error import time #模擬成瀏覽器 headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36") opener = urllib.request.build_opener() opener.addheaders=[headers] #將opener安裝為全局 urllib.request.install_opener(opener) def get_pm25_and_weather(city): #首先執(zhí)行獲取空氣質(zhì)量數(shù)據(jù),返回?cái)?shù)據(jù)更新時間 data_time=getpm25(city) #然后將獲取到的數(shù)據(jù)更新時間賦值給獲取天氣數(shù)據(jù)函數(shù)使用 getweather(city,data_time) def getpm25(city): try: #設(shè)置url地址 url="http://pm25.in/"+city data=urllib.request.urlopen(url).read().decode("utf-8") print("城市:"+city) #構(gòu)建數(shù)據(jù)更新時間的表達(dá)式 data_time='<div class="live_data_time">\s{1,}<p>數(shù)據(jù)更新時間:(.*?)</p>' #尋找出數(shù)據(jù)更新時間 datatime=re.compile(data_time, re.S).findall(data) print("數(shù)據(jù)更新時間:"+datatime[0]) #構(gòu)建數(shù)據(jù)收集的表達(dá)式 data_pm25 = '<div class="span1">\s{1,}<div class="value">\n\s{1,}(.*?)\s{1,}</div>' data_o3='<div class="span1">\s{1,}<div class ="value">\n\s{1,}(.*?)\s{1,}</div>' #尋找出所有的監(jiān)測值 pm25list = re.compile(data_pm25, re.S).findall(data) o3list=re.compile(data_o3, re.S).findall(data) #將臭氧每小時的值插入到原列表中 pm25list.append(o3list[0]) print("AQI指數(shù),PM2.5,PM10,CO,NO2,SO2,O3:(單位:μg/m3,CO為mg/m3)") print(pm25list) #將獲取到的值寫入文件中 writefiles_pm25(city,datatime,pm25list) #返回?cái)?shù)據(jù)更新時間值 return datatime except urllib.error.URLError as e: print("出現(xiàn)URLERROR!一分鐘后重試……") if hasattr(e,"code"): print(e.code) if hasattr(e,"reason"): print(e.reason) time.sleep(60) #出現(xiàn)異常則過一段時間重新執(zhí)行此部分 getpm25(city) except Exception as e: print("出現(xiàn)EXCEPTION!十秒鐘后重試……") print("Exception:"+str(e)) time.sleep(10) # 出現(xiàn)異常則過一段時間重新執(zhí)行此部分 getpm25(city) def writefiles_pm25(filename,datatime,pm25list): #將獲取的數(shù)據(jù)寫入文件中,數(shù)據(jù)分別為時間,AQI指數(shù),PM2.5,PM10,CO,NO2,SO2,O3。(單位:μg/m3,CO為mg/m3) f = open("D:\Python\Python35\myweb\data_pm25\data_pm25_"+filename+".txt", "a") f.write(datatime[0]) f.write(",") for pm25 in pm25list: f.write(str(pm25)) f.write(",") f.write("\n") print("該條空氣質(zhì)量數(shù)據(jù)已添加到文件中!") f.close() def getweather(city,datatime): try: #構(gòu)建url url="http://"+city+".tianqi.com/" data=urllib.request.urlopen(url).read().decode("gbk") #構(gòu)建數(shù)據(jù)收集的表達(dá)式 data_weather = '<li class="cDRed">(.*?)</li>' data_wind='<li style="height:18px;overflow:hidden">(.*?)</li>' data_temperature='<div id="rettemp"><strong>(.*?)°' data_humidity='</strong><span>相對濕度:(.*?)</span>' #尋找出所有的監(jiān)測值 weatherlist = re.compile(data_weather, re.S).findall(data) windlist=re.compile(data_wind, re.S).findall(data) temperaturelist = re.compile(data_temperature, re.S).findall(data) humiditylist = re.compile(data_humidity, re.S).findall(data) #將其他值插入到天氣列表中 weatherlist.append(windlist[0]) weatherlist.append(temperaturelist[0]) weatherlist.append(humiditylist[0]) print("天氣狀況,風(fēng)向風(fēng)速,實(shí)時溫度,相對濕度:") print(weatherlist) #將獲取到的值寫入文件中 writefiles_weather(city,datatime,weatherlist) except urllib.error.URLError as e: print("出現(xiàn)URLERROR!一分鐘后重試……") if hasattr(e,"code"): print(e.code) if hasattr(e,"reason"): print(e.reason) time.sleep(60) # 出現(xiàn)異常則過一段時間重新執(zhí)行此部分 getweather(city,datatime) except Exception as e: print("出現(xiàn)EXCEPTION!十秒鐘后重試……") print("Exception:"+str(e)) time.sleep(10) # 出現(xiàn)異常則過一段時間重新執(zhí)行此部分 getweather(city, datatime) def writefiles_weather(filename,datatime,weatherlist): #將獲取的數(shù)據(jù)寫入文件中,數(shù)據(jù)分別為時間,天氣狀況,風(fēng)向風(fēng)速,實(shí)時溫度,相對濕度。 f = open("D:\Python\Python35\myweb\data_weather\data_weather_"+filename+".txt", "a") f.write(datatime[0]) f.write(",") for weather in weatherlist: f.write(str(weather)) f.write(",") f.write("\n") print("該條天氣數(shù)據(jù)已添加到文件中!") f.close() #退出循環(huán)可用Ctrl+C鍵 while True: print("開始工作!") get_pm25_and_weather("beijing") get_pm25_and_weather("tianjin") get_pm25_and_weather("shijiazhuang") get_pm25_and_weather("taiyuan") get_pm25_and_weather("jinan") get_pm25_and_weather("shenyang") get_pm25_and_weather("huhehaote") get_pm25_and_weather("zhengzhou") #每一小時執(zhí)行一次 print("休息中……") print("\n") time.sleep(3600)
運(yùn)行狀態(tài)圖:
更多內(nèi)容請參考專題《python爬取功能匯總》進(jìn)行學(xué)習(xí)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
如何使用Python設(shè)置和讀取config.ini文件
使用配置文件是一種常見的方法,而INI文件是一種簡單而常見的配置文件格式,在本文中,我將介紹如何使用Python設(shè)置和讀取INI格式的配置文件,需要的朋友可以參考下2024-03-03Python編寫memcached啟動腳本代碼實(shí)例
這篇文章主要介紹了Python編寫memcached啟動腳本代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08python防止隨意修改類屬性的實(shí)現(xiàn)方法
這篇文章主要介紹了python防止隨意修改類屬性的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Python while循環(huán)使用else語句代碼實(shí)例
這篇文章主要介紹了Python while循環(huán)使用else語句代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02Python WXPY實(shí)現(xiàn)微信監(jiān)控報(bào)警功能的代碼
本篇文章主要介紹了Python WXPY實(shí)現(xiàn)微信監(jiān)控報(bào)警功能的代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10基于Python實(shí)現(xiàn)股票數(shù)據(jù)分析的可視化
在購買股票的時候,可以使用歷史數(shù)據(jù)來對當(dāng)前的股票的走勢進(jìn)行預(yù)測,這就需要對股票的數(shù)據(jù)進(jìn)行獲取并且進(jìn)行一定的分析。本文將介紹如何通過Python實(shí)現(xiàn)股票數(shù)據(jù)分析的可視化,需要的可以參考一下2021-12-12Python基礎(chǔ)教程之淺拷貝和深拷貝實(shí)例詳解
這篇文章主要介紹了Python基礎(chǔ)教程之淺拷貝和深拷貝實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07