使用python實現定時報天氣的示例代碼

前言

如果你和我一樣偶爾看看股票,看看自己關註的股票是漲瞭還是跌瞭,或者想快速獲取到想看的頭條新聞,我們不必把過多的註意力放在去尋找上面,我們隻需要讓爬蟲程序每天自動為你發送你想要瞭解的信息就可以瞭,這樣就能掌控我們的註意力,更好的去享受生活。

一.分析爬取目標

這裡就不爬取股票的信息,我來爬一個天氣預報的信息,然後實現每天定時發送。打開下面的鏈接就能跳轉到中國氣象網
http://www.weather.com.cnnn/

在這裡插入圖片描述

點擊溫度那個位置就可以進入下面的圖

在這裡插入圖片描述

我們可以看到7天的天氣和8-15天的天氣,再往後對我們來說就沒必要瞭。我們查看七日的天氣預報,直接爬11日的天氣,鼠標右鍵->檢查->Network->刷新網頁->查看列表第一個,再點擊preview

在這裡插入圖片描述

可以看到數據在HTML裡面,然後回到element

在這裡插入圖片描述

可以發現,溫度數據放在<p class="tem">之下。“多雲”所在的位置是<p title="晴" class="wea">晴</p>

在這裡插入圖片描述

import requests

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36'}

# 封裝headers
#這裡對應的是我選的城市,可以換自己所在城市
url = 'http://www.weather.com.cn/weather/101010100.shtml'

# 把URL鏈接賦值到變量url上

res = requests.get(url, headers=headers)

# 發送requests請求,並把響應的內容賦值到變量res中。

print(res.text)

# 打印出res對象的網頁源代碼

print(res.status_code)

# 檢查響應狀態是否正常

看結果可以看到是響應是正常的,但是出現瞭亂碼。但是莫慌。加上一句res.encoding='utf-8'就行瞭。

在這裡插入圖片描述

接下來就可以寫完整的爬取信息的代碼瞭

import requests

from bs4 import BeautifulSoup



headers={'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36'}

#封裝headers

url='http://www.weather.com.cn/weather/101010100.shtml'

#把URL鏈接賦值到變量url上

res=requests.get(url,headers=headers)

#發送requests請求,並把響應的內容賦值到變量res中

res.encoding='utf-8'



bsdata=BeautifulSoup(res.text,'html.parser')

#使用bs模塊解析獲取到的數據

data_temperature= bsdata.find(class_='tem')

#使用find()取出天氣的溫度數據

data_weather= bsdata.find(class_='wea')

#使用find()取出天氣的文字描述

print(data_temperature.text)

#取出變量data_temperature中的字符串內容,並打印

print(data_weather.text)

#取出變量data_weather中的字符串內容,並打印

可以成功的得到需要的數據。

在這裡插入圖片描述

其實最難的不是爬蟲,爬這種信息新手應該都會,接下裡才是重頭戲。

二.信息的發送

如果我們想要實現發送郵件,這裡以qq郵件為例要經過以下的步驟:

  • 連接郵件服務器
  • 使用郵箱賬號密碼登錄
  • 填寫收件人,主題,正文等
  • 發送郵件

所以連接服務器要用到用到smtplib庫,填寫主題和撰寫正文,需要用到email庫(python真的是yyds)

1.連接服務器

SMTP代表簡單郵件傳輸協議,相當於一種計算機之間發郵件的約定

smtplib是不需要安裝的,smtplib是python的一個內置庫,有興趣的小夥伴可以看看官方文檔

看下面的代碼

import smtplib
mailhost='smtp.qq.com'
#把qq郵箱的服務器地址賦值到變量mailhost上,地址需要是字符串的格式。
qqmail = smtplib.SMTP()
#實例化一個smtplib模塊裡的SMTP類的對象,這樣就可以SMTP對象的方法和屬性瞭
qqmail.connect(mailhost,25)
#連接服務器,第一個參數是服務器地址,第二個參數是SMTP端口號

**mailhost=‘smtp.qq.com’**這句是qq郵箱的服務器地址,這個是可以查得到的

用SMTP對象的connect()方法連接服務器,第一個參數是獲取到的服務器地址,第二個參數是SMTP端口號——25。端口號的選擇不是唯一的,但是25是一個最簡單、最基礎的端口號,所以我們填25。

2.獲取賬號和密碼

此密碼非彼密碼,這個密碼需要我們去到這裡獲取:https://mail.qq.com/,登錄你的郵箱。然後點擊位於頂部的【設置】按鈕,選擇【賬戶設置】。

在這裡插入圖片描述

下拉到這個位置

在這裡插入圖片描述

點擊開啟第一個,然後得到授權碼,如果以前獲取過但是忘瞭,就需要發送短信重新獲取,這個碼一定不要外漏!!!

在這裡插入圖片描述

import smtplib

mailhost='smtp.qq.com'
#把qq郵箱的服務器地址賦值到變量mailhost上

qqmail = smtplib.SMTP()
#實例化一個smtplib模塊裡的SMTP類的對象,這樣就可以SMTP對象的方法和屬性瞭

qqmail.connect(mailhost,25)
#連接服務器,第一個參數是服務器地址,第二個參數是SMTP端口號。

sender = input('請輸入你的郵箱:')
#獲取郵箱賬號

password = input('請輸入你的密碼:')
#獲取郵箱密碼

qqmail.login(sender,password)
#登錄郵箱,第一個參數為郵箱賬號,第二個參數為郵箱密碼

receiver=input('請輸入收件人的郵箱:')
#獲取收件人的郵箱

所填密碼就是剛才獲取的授權碼

3.填寫主題和撰寫正文

在這裡就需要用到email庫。

from email.mime.text import MIMEText

from email.header import Header

content=input('請輸入郵件正文:')

#輸入你的郵件正文

message = MIMEText(content, 'plain', 'utf-8')

#實例化一個MIMEText郵件對象,該對象需要寫進三個參數,分別是郵件正文,文本格式和編碼

subject = input('請輸入你的郵件主題:')

#用input()獲取郵件主題  

message['Subject'] = Header(subject, 'utf-8')

我們還需要引入瞭email庫中的MIMEText模塊和Header模塊
最後一行代碼:在等號的右邊,是實例化瞭一個Header郵件頭對象,該對象需要寫入兩個參數,分別是郵件主題和編碼,然後賦值給等號左邊的變量message[‘Subject’],message[‘Subject’]就代表著根據MIMEText類裡面的Subject的屬性名取到該屬性

代碼有註釋還不明白的話可以去看看文檔,

4.發送郵件和退出郵箱

將前面的代碼整合以下

from email.mime.text import MIMEText

from email.header import Header

#引入Header和MIMEText模塊

content=input('請輸入郵件正文:')

#輸入你的郵件正文

message = MIMEText(content, 'plain', 'utf-8')

#實例化一個MIMEText郵件對象,該對象需要寫進三個參數,分別是郵件正文,文本格式和編碼

subject = input('請輸入你的郵件主題:')

#用input()獲取郵件主題

message['Subject'] = Header(subject, 'utf-8')

qqmail.sendmail(sender, receiver, message.as_string())

qqmail.quit()
#退出郵箱

sendmail() 發送郵件,括號裡面有三個參數,第1個是發件人的郵箱地址,第2個是收件人的郵箱地址,第3個是正文,但必須是字符串格式,所以用as_string()函數轉換瞭一下。

但是我們希望發送成功後能顯示“郵件發送成功”,失敗的時候能提示我們“郵件發送失敗”,可以使用try語句來實現。

try:
    qqmail.sendmail(sender, receiver, message.as_string())
    print ('郵件發送成功')
except:
    print ('郵件發送失敗')
qqmail.quit()

三.定時發送

關於時間,其實Python有兩個內置的標準庫——time和datetime,但是我們不用,誒,就是玩,我們可以用第三方庫schedule其實是有原因的:對於我們需要的定時功能,time和datetime當然能實現,但操作邏輯會相對復雜;而schedule就是可以直接解決定時功能,代碼比較簡單,這是我們選擇schedule的原因。
官方文檔鏈接:https://pypi.org/project/schedule/
根據文檔我們做一個每3秒運行一次的程序

import schedule
import time
#引入schedule和time模塊
def job():
    print("Working in progress...")
#定義一個叫job的函數,函數的功能是打印'I'm working...'
schedule.every(3).seconds.do(job)        
while True:
    schedule.run_pending()
    time.sleep(1)

也可以設置在某個時間發送,用法很多,這裡就不展開。最後把這些代碼全部合並整合一下,下面看效果

四.效果

在這裡插入圖片描述

這裡我定的下午三點四十六,然後發送成功,我打開我的郵箱確實能收到

在這裡插入圖片描述

這個功能我放在服務器上用瞭很久瞭,爬一些平時自己必看的信息,然後發送,減少瞭自己被其他東西吸引註意力的幾率。

這篇文章不在於爬取天氣信息這塊,而是通過這種方式去實現定時發送郵件,隻要用的好能為自己省下很多的時間和精力去在信息大海裡面查找自己想要的信息。

到此這篇關於使用python實現定時報天氣的示例代碼的文章就介紹到這瞭,更多相關python 定時報天氣內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: