抓取天氣信息並定時發郵件
來自專欄小草學python
最近看了一下《Web Scraping with Python_ Collecting Data from the Modern Web》這本書,所以得動手實踐一下,故做此文,與大家分享,希望共同進步
準備工作:
1.安裝模塊: pandas, BeautifulSoup
2. 註冊 mailgun 賬號 (https://www.mailgun.com/email-api),用來發郵件
step1: 點擊SIGN UP 註冊mailgun賬號,記住 不要勾選 Add payment info now
step2: 當註冊完成之後,記住勾選下面的Python 欄, 複製下面的code到spyder中去
3. 當上述準備工作完成之後:導入需要用到的模塊:
from urllib.request import urlopen ,Requestfrom bs4 import BeautifulSoupimport reimport pandas as pdimport timeimport requests
定義function send_simple_message : 主要功能為利用mailgun api 推送郵件
#將複製出來的代碼進行細微的修改,比如自定義 subject 和 text 參數def send_simple_message(subject, text): return requests.post( "https://api.mailgun.net/v3/sandbox3acbbfebb26a46e685e3561ea38876b3.mailgun.org/messages", auth=("api", "fd8db37ccb171b1048e86ffc6f3645fd-b892f62e-0a41511c"), data={"from": "Mailgun Sandbox <postmaster@sandbox3acbbfebb26a46e685e3561ea38876b3.mailgun.org>", # 目標郵箱 "to": "jin zhu <zhujin19@qq.com>", "subject": subject, "text":text })
4. 利用 BeautifulSoup , Request 庫抓取天氣信息,我們這裡以北京地區的信息為例:
【北京天氣】北京天氣預報,藍天,藍天預報,霧霾,霧霾消散,天氣預報一周,天氣預報15天查詢def get_weather_info(chaper_url=http://www.weather.com.cn/weather/101010100.shtml): headers = {User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0} req = Request(url=chaper_url, headers=headers) html= urlopen(req).read() bsObj= BeautifulSoup(html,html.parser) weather= bsObj.find_all(class_=wea) temp = bsObj.find_all(class_=tem) win = bsObj.find_all(class_=win) date = bsObj.find("div", {id: 7d}).find(ul).find_all(li) data= pd.DataFrame(columns=[日期, 天氣, 溫度, 風級],index=[]) for i in range(len(weather)): data.loc[i,日期]=date[i].find(h1).string data.loc[i,天氣]= weather[i].get_text() data.loc[i,溫度]= .join(temp[i].get_text().split()) data.loc[i,風級]=.join(win[i].get_text().split()) data.set_index([日期], inplace=True) data_final= data.to_csv().split() return data_final
可以通過單擊 右鍵查看中國天氣網的源代碼: 可知<p class="wea">,<p class="tem">,<p class="win"> 分別為 天氣, 溫度,風級的標籤。 上述code主要是分開抓取 這些標籤,然後將它們存放為dataframe data裡面保存
5. 定時執行上述code 並發送郵件到指定郵箱: 這裡面是每隔5分鐘執行一次上述程序,如果希望每24小時執行一次上述code,請將 300 改為 86400即可。
while True: subject= 北京未來7天氣預報+time.strftime(%Y-%m-%d,time.localtime(time.time())) send_simple_message(subject,get_weather_info())# 每次間隔5分鐘執行一次code time.sleep(300.0 - time.time()% 300.0)# time.sleep(86400 - time.time()% 86400.0)
這裡可以參考以下鏈接:
What is the best way to repeatedly execute a function every x seconds in Python?
來 定時執行 code
最終呈現的效果如下圖所示:
最後,如果大家想看其它地區的天氣預報,可以通過修改 get_weather_info 裡面的 chaper_url 參數, 也就是下面標粗的部分
(chaper_url=http://www.weather.com.cn/weather/101010100.shtml)
具體的城市代碼可以通過查看:
最全中國城市代碼(python編程查天氣用).doc
推薦閱讀:
※全國開啟「番茄炒蛋」模式,防蚊黑科技了解下?
※Python實現天氣預報
※馬爾可夫版天氣預報,了解一下!
※宇宙天氣預報 9月5日-9月11日 大衛·瑞雷