每天定時打開某個網頁_Python科普帖定時通知

0 復習

上一關我們學習了selenium,它有可視模式與靜默模式這兩種瀏覽器的設置方法,二者各有優勢。然后學習了使用.get('URL')獲取數據,以及解析與提取數據的方法。

34dc911f885237abd74b55ea71b2b043.png

在這個過程中,我們操作對象的轉換過程:

ddcd2e7b3049faa8e1e30fd0968f43c0.png

除了上面的方法,還可以搭配BeautifulSoup解析提取數據,前提是先獲取字符串格式的網頁源代碼。

HTML源代碼字符串 = driver.page_source

以及自動操作瀏覽器的一些方法。

c97b3a4456d18a43521ed614d03a1f1f.png

1 定時與郵件

在這一關,我們希望為一般的爬蟲程序新增兩個實用性比較強的功能:第一是定時功能,即程序可以根據我們設定的時間自動爬取數據;第二是通知功能,即程序可以把爬取到的數據結果以郵件的形式自動發送到我們的郵箱。

這兩個功能可以讓爬蟲程序定時向我們匯報。

試想一下,如果你是一位股票(或比特幣)的持有者,你希望及時爬取股票(或比特幣)每日的價格數據,方便你能及時賣出或買入,那每天都去啟動一遍爬蟲程序是極其不高效的。

而此時,如果你的爬蟲程序有定時和發送郵件功能,能自動爬取每天的數據,并且只有當價格達到某個你設置的價位時,才通知你可以有所行動了,平時都不打擾你,是不是很爽?

不止如此,如果你有特別想看的演唱會,但一開售就賣完了,有定時和發送郵件功能的爬蟲程序同樣可以辛勤地幫你刷票,當刷到有余票時,馬上通知你去購票,多好。(買火車票也是一樣的道理噢)。

這兩個功能不僅能幫你獲取這種實時變化的數據,還可以幫你獲取周期性的數據。比如,你所在的公司每周都會把周報發到官網上,而你所在的部門是由你去負責下載周報,并整理相關信息,再傳遞給部門成員。那如果有定時和通知功能的程序,每周你就可以靜待程序把更新的周報信息爬下來,并自動發送到你郵箱。

了解這兩個功能的意義后,我們就可以開始今天正式的學習了。

按照一向以來的規矩,實現一個項目的流程是這樣的:

423f4c011c85234b9be0be0973667521.png

2 明確目標

我們選擇的項目是——自動爬取每日的天氣,并定時把天氣數據和穿衣提示發送到你的郵箱。之所以選擇這個相對樸實的爬蟲項目,是因為天氣每天都會有變化,那么在學完這一關之后,不出意外,你就可以在明早收到天氣信息了。以此,親身體驗程序的作用。

3 分析過程

總體上來說,可以把這個程序分成三個功能塊:【爬蟲】+【郵件】+【定時】

對爬蟲部分,我們比較熟悉;而對通知部分,選擇的是用郵件來通知,我們將使用smtplib、email庫來實現這一需求;對定時功能,有一個schedule,方便好用。

這三個功能對應的是三段代碼,分別寫出三段代碼后再組裝起來,就能實現我們的項目目標。

3.1 爬蟲

在百度搜索天氣,彈出來的第一個網址是:

http://www.weather.com.cn/weather/101280601.shtml

點進去的是中國氣象網的天氣預報:

ded03a89a52ac8c49890fde6cb83d358.png

我打開這個網站的時間是2019年1月11日,我所在的地點是深圳,瀏覽器會自動定位,所以你能看到上圖顯示的是1月11日-1月17日深圳的天氣。

我要爬取的是1月11日的天氣,即下圖框內的“23/18℃”和“多云”兩個數據:

b0ff6eed10a229a8d239ba400bf15003.png

很自然地,我們點擊"右鍵"——"檢查"——"Network",刷新頁面,點看第0個請求:

a4854d5b0d0be60f933cc198f7776675.png

數據放在HTML里,沒問題。那我們點擊Elements:

169bf7a9f458a8db77982e8a0013c10f.png

可以發現,溫度數據放在

之下。

同樣,可以發現“多云”這個數據所在的位置:

1d8f50ae63ee5d302da2a9562d2fc049.png

“小雨”所在的位置是

小雨

在網頁源代碼里面搜索觀察了一番,發現可以使用和來匹配目標數據。

import requests

from bs4 import BeautifulSoup

#引入requests庫和BeautifulSoup庫

headers={'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}

#封裝headers

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

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

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

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

print(res.status_code)

#檢查響應狀態是否正常

print(res.text)

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

運行結果返回的是200,證明狀態是正常的,再來看看網頁源代碼,滑動看看:等等,好像出現了一些奇怪的東西......(⊙o⊙)噢,是亂碼,這意味著出現了編碼問題。不過還好,我們在第0關就知道碰到編碼可以怎么解決,用response.encoding屬性就好。好滴,那我們在網頁上點擊"右鍵"——"查看網頁源代碼",會彈出一個新的標簽頁,然后搜索charset,查看一下編碼方式。

d85717de7d1937a9924b848eb5c788b8.png

噢,網頁是用utf-8編碼的。

那么只要用response.encoding轉換一下編碼就可以了,請你來寫一寫代碼,定義Response對象的編碼,還有檢查請求的結果,并且打印網頁源代碼:

import requests
from bs4 import BeautifulSoup
headers={'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
url='http://www.weather.com.cn/weather/101280601.shtml'
res=requests.get(url,headers=headers)
res.encoding='utf-8'
print(res.status_code)
print(res.text)

這次沒問題了喲。接下來,就可以用BeautifulSoup模塊解析和提取數據了:

import requests

from bs4 import BeautifulSoup

headers={'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}

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

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

res.encoding='utf-8'

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

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

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

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

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

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

print(data1.text)

#取出變量data1中的字符串內容,并打印

print(data2.text)

#取出變量data2中的字符串內容,并打印

搞定啦~(≧▽≦)/~啦啦啦。

當然,每個人所在的地區都不一樣,所以你要選擇好你所在地區的天氣網址來替換這段代碼中的URL。

接下來,就可以進入到通知功能,我們選擇的是用郵件來發送爬蟲結果。

進入到郵件功能部分的學習,先來模仿一下平時我們發郵件時計算機的操作:

0eebfd3ebe4cf2d14f85f34e7d808b42.png

我們的代碼邏輯也會按照上圖來進行,并且在其中用到兩個庫——smtplib和email。

以qq郵箱為例,先來看第0步:連接服務器。

連接服務器需要用到smtplib庫。為什么叫這個名字呢?其實,SMTP代表簡單郵件傳輸協議,相當于一種計算機之間發郵件的約定。

好,來看下具體怎么用smtplib庫來連接服務器:

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

解釋一下:第1行代碼是引入庫,第3行代碼是qq郵箱的服務器地址,這個地址是可以通過搜索引擎查到的。

4b568af5407c80d3f976551082ac1844.png

點進去第一個網址:

c85c7a9e5690341080b99e7498d4114a.png

這樣就拿到了qq郵箱的smtp地址。此刻,我們用的是qq郵箱,所以搜索qq郵箱的smtp服務器地址,如果你之后想用網易郵箱,也可以搜索網易郵箱的smtp服務器地址。

繼續看代碼的第5行:

第5行代碼是實例化了一個smtplib里的SMTP對象。

第7行代碼是用SMTP對象的connect()方法連接服務器,第一個參數是獲取到的服務器地址,第二個參數是SMTP端口號——25。

端口號的選擇不是唯一的,但是25是一個最簡單、最基礎的端口號,所以我們填25。

連接服務器就講完了,馬上來看第1和第2步:通過賬號和密碼登錄郵箱;填寫收件人。

來看登錄郵箱的代碼(第11行為新增代碼):

account = input('請輸入你的郵箱:')
#獲取郵箱賬號
password = input('請輸入你的密碼:')
#獲取郵箱密碼
qqmail.login(account,password)
#登錄郵箱,第一個參數為郵箱賬號,第二個參數為郵箱密碼
receiver=input('請輸入收件人的郵箱:')
#獲取收件人的郵箱

解釋一下從11行新增的代碼:第11行是用input()獲取郵箱賬號。第13行是用input()獲取郵箱密碼,但注意了,這里可不是你平時登錄郵箱的密碼!這個密碼需要我們去到這里獲取:請打開https://mail.qq.com/,登錄你的郵箱。然后點擊位于頂部的【設置】按鈕,選擇【賬戶設置】,然后下拉到這個位置。

8c2ecf2ca5ddb4912225f389dc401c42.png

就像上面的一樣,把首個SMTP服務開啟。這時,QQ郵箱會提供給你一個授權碼,注意保護好你的授權碼:

6c6fdd981d3835732b86513bd66b788b.png

接下來,在你使用SMTP服務登錄郵箱時,就可以輸入這個授權碼作為密碼登錄了。

然后看上面第18行代碼,就是獲取收件人的郵箱,沒有太多可說的。

至此,第1步和第2步都完成了。

繼續看第3步和第4步:填寫主題和撰寫正文,在這里需要用到email庫。

來看用法:

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')

#在等號的右邊,是實例化了一個Header郵件頭對象,該對象需要寫入兩個參數,分別是郵件主題和編碼,然后賦值給等號左邊的變量message['Subject']。

解釋一下:第1行和第2行代碼是引入了email庫中的MIMEText模塊和Header模塊。

第4行代碼是用input()函數獲取郵件正文,第6行代碼是實例化一個MIMEText的郵件對象,這樣我們就構造了一個純文本郵件了。

這個MIMEText對象有三個參數,一個是郵件正文;另一個是文本格式,一般設置為plain純文本格式;最后一個是編碼,設置為utf-8,因為utf-8是最流行的萬國碼。

繼續看第8行代碼,是用input()函數獲取郵件主題,第10行代碼比較重要,我們仔細講解一下:message['Subject'] = Header(subject, 'utf-8'),等號右邊是實例化了一個Header郵件頭對象,該對象需要寫入兩個參數,分別是郵件主題和編碼。等號左邊的message['Subject']的變量是一個a['b']的代碼形式,它長得特別像字典根據鍵取值的表達,但是這里的message是一個MIMEText類的對象,并不是一個字典,那message['Subject']是什么意思呢?

其實,字典和類在結構上,有相似之處。請看下圖:

eb2c8c60ebb3929d4ee125006c964d21.png

字典里面的元素是【鍵】和【值】一一對應,而類里面的【屬性名】和【屬性】也是一一對應的。我們可以根據字典里的【鍵】取到對應的【值】,同樣的,也可以根據類里面的【屬性名】取到【屬性】。

所以message['Subject']就代表著根據MIMEText類里面的Subject的屬性名取到該屬性。

需要注意的是,不是每一個類都可以這樣訪問其屬性的,之所以能這樣訪問是因為這個MIMEText的類實現了這個功能。所以,message['Subject'] = Header(subject, 'utf-8')?就是在為message['Subject']這個屬性賦值。好啦,到現在,我們就明白如何填寫主題和撰寫正文了。

接下來就是最后兩步:發送郵件和退出郵箱了。

來看代碼:

qqmail.sendmail(account, receiver, message.as_string())
#發送郵件,調用了sendmail()方法,寫入三個參數,分別是發件人,收件人,和字符串格式的正文。
qqmail.quit()
#退出郵箱

解釋一下:第33行代碼的意思是調用sendmail()發送郵件,括號里面有三個參數,第0個是發件人的郵箱地址,第1個是收件人的郵箱地址,第2個是正文,但必須是字符串格式,所以用as_string()函數轉換了一下。但是我們希望發送成功后能顯示“郵件發送成功”,失敗的時候能提示我們“郵件發送失敗”,可以使用try語句來實現。

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

到此,發送郵件的程序就完成了,一起看看完整的代碼。

import smtplib
from email.mime.text import MIMEText
from email.header import Header
#引入smtplib、MIMETex和Header
mailhost='smtp.qq.com'
#把qq郵箱的服務器地址賦值到變量mailhost上,地址應為字符串格式
qqmail = smtplib.SMTP()
#實例化一個smtplib模塊里的SMTP類的對象,這樣就可以調用SMTP對象的方法和屬性了
qqmail.connect(mailhost,25)
#連接服務器,第一個參數是服務器地址,第二個參數是SMTP端口號。
#以上,皆為連接服務器。
account = input('請輸入你的郵箱:')
#獲取郵箱賬號,為字符串格式
password = input('請輸入你的密碼:')
#獲取郵箱密碼,為字符串格式
qqmail.login(account,password)
#登錄郵箱,第一個參數為郵箱賬號,第二個參數為郵箱密碼
#以上,皆為登錄郵箱。
receiver=input('請輸入收件人的郵箱:')
#獲取收件人的郵箱。
content=input('請輸入郵件正文:')
#輸入你的郵件正文,為字符串格式
message = MIMEText(content, 'plain', 'utf-8')
subject = input('請輸入你的郵件主題:')
#輸入你的郵件主題,為字符串格式
message['Subject'] = Header(subject, 'utf-8')
#以上,為填寫主題和正文。
try:
qqmail.sendmail(account, receiver, message.as_string())
print ('郵件發送成功')
except:
print ('郵件發送失敗')
qqmail.quit()
#以上為發送郵件和退出郵箱。

好,我們可以再次試著梳理一下剛剛的流程:

首先是連接服務器和登錄,然后就是發送,發送的內容是郵件數據。郵件數據由兩部分構成,一部分是郵件的主題,一部分是郵件的正文(即爬蟲獲取到的數據)。當然,發送的動作里必須填寫收件人,發送完畢后就可以退出郵箱了。

而smtplib庫主要負責的是橫向的連接服務器、登錄、發送和退出;而email庫主要負責的是郵件主題和正文。

好,現在,咱們來看看如何實現爬蟲的定時功能。

3.2 定時

關于時間,其實Python有兩個內置的標準庫——time和datetime。

但在這里,我們不準備完全依靠標準庫來實現,而準備選取第三方庫——schedule。原因在于:標準庫一般意味著最原始最基礎的功能,第三方庫很多是去調用標準庫中封裝好了的操作函數。比如schedule,就是用time和datetime來實現的。而對于我們需要的定時功能,time和datetime當然能實現,但操作邏輯會相對復雜;而schedule就是可以直接解決定時功能,代碼比較簡單,這是我們選擇schedule的原因。

這并不意味著time和datetime比schedule差,只是這個項目場景下,我們傾向于調用schedule。

馬上來看代碼,官方文檔上的代碼也很簡潔,你可以先嘗試著自己閱讀一下。

ca548e10e7363b38463dfea5748214d9.png

最上面的一行很好理解,因為是第三方庫,所以需要安裝。下面的代碼我們放到代碼框里好好研究一下:

import schedule

import time

#引入schedule和time

def job():

? ??print("I'm working...")

#定義一個叫job的函數,函數的功能是打印'I'm working...'

schedule.every(10).minutes.do(job) ? ? ? #部署每10分鐘執行一次job()函數的任務

schedule.every().hour.do(job) ? ? ? ? ? ?#部署每×小時執行一次job()函數的任務

schedule.every().day.at("10:30").do(job) #部署在每天的10:30執行job()函數的任務

schedule.every().monday.do(job) ? ? ? ? ?#部署每個星期一執行job()函數的任務

schedule.every().wednesday.at("13:15").do(job)#部署每周三的13:15執行函數的任務

while True:

? ? schedule.run_pending()

? ? time.sleep(1)

#15-17都是檢查部署的情況,如果任務準備就緒,就開始執行任務。

第1行和第2行,是引入schedule和time。

第5行和第6行,是定義了一個叫job()的函數,調用這個函數時,函數會打印I'm working...。

第9行-13行都是相關的時間設置,你可以根據自己的需要來確定。

第15-17行是一個while循環,是去檢查上面的任務部署情況,如果任務已經準備就緒,就去啟動執行。其中,第17行的time.sleep(1)是讓程序按秒來檢查,如果檢查太快,會浪費計算機的資源。

其實,就算不懂具體的代碼什么意思,我們先試著來用,發現誒,成功了,再去研究,也是不錯的。

為了展示一下schedule的作用,我們看下面這段代碼:是每兩秒就運行job()函數。

import schedule

import time

#引入schedule和time模塊

def job():

? ??print("I'm working...")

#定義一個叫job的函數,函數的功能是打印'I'm working...'

schedule.every(2).seconds.do(job) ? ? ? ?#每2s執行一次job()函數

while True:

? ? schedule.run_pending()

? ? time.sleep(1)

好啦,定時功能我們也都搞定了。也就是說,第二步分析過程,我們也搞定了。

4 代碼組裝

因為剛剛在分析過程里面,就已經分別搞定了三段程序,所以在這一部分,只要組合起來就好啦。我們一個一個功能來封裝,首先是爬蟲的代碼,封裝前的代碼是這樣的:

import requests

from bs4 import BeautifulSoup

headers={'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}

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

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

res.encoding='utf-8'

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

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

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

print(data1.text)

print(data2.text)

封裝后是這樣的:

import requests

from bs4 import BeautifulSoup

def weather_spider():

?headers={'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}? ??

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

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

? ? res.encoding='utf-8'

? ? soup=BeautifulSoup(res.text,'html.parser')

? ? data1= soup.find(class_='tem')

? ? data2= soup.find(class_='wea')

? ? tem=data1.text

? ? weather=data2.text

? ??return tem,weather

第4行代碼:定義這個函數叫weather_spider();第14行代碼:設置函數返回的變量是tem和weather。其他代碼都是和封裝前一致的。接著是郵件的程序,封裝前的代碼是這樣的:

import smtplib?

from email.mime.text import MIMEText

from email.header import Header

mailhost='smtp.qq.com'

qqmail = smtplib.SMTP()

qqmail.connect(mailhost,25)

account = input('請輸入你的郵箱:')

password = input('請輸入你的密碼:')

qqmail.login(account,password)

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

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

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

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

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

try:

? ? qqmail.sendmail(account, receiver, message.as_string())

? ??print ('郵件發送成功')

except:

? ??print ('郵件發送失敗')

qqmail.quit()

封裝后是這樣的:

import smtplib

from email.mime.text import MIMEText

from email.header import Header

account = input('請輸入你的郵箱:')

password = input('請輸入你的密碼:')

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

def send_email(tem,weather):

? ? mailhost='smtp.qq.com'

? ? qqmail = smtplib.SMTP()

? ? qqmail.connect(mailhost,25)

? ? qqmail.login(account,password)

? ? content= '親愛的,今天的天氣是:'+tem+weather

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

? ? subject = '今日天氣預報'

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

? ??try:

? ? ? ? qqmail.sendmail(account, receiver, message.as_string())

? ? ? ??print ('郵件發送成功')

? ??except:

? ? ? ??print ('郵件發送失敗')

? ? qqmail.quit()

看第5-7行:定義account、password和receiver為全局變量,即用input()獲取到的數據。

第9行:定義了函數的名字叫send_email(),定義了兩個參數tem和weather。當然,等下需要把爬蟲獲取到的溫度信息和天氣信息傳遞給該函數的參數。

第14行:是把郵件正文寫為天氣數據。其他代碼基本一致。

好現在只剩定時功能了,可以和上面兩個程序組合在一塊兒了。

import requests
import smtplib
import schedule
import time
from bs4 import BeautifulSoup
from email.mime.text import MIMEText
from email.header import Header
account = input('請輸入你的郵箱:')
password = input('請輸入你的密碼:')
receiver = input('請輸入收件人的郵箱:')
def weather_spider():
?headers={'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
? ?url='http://www.weather.com.cn/weather/101280601.shtml'
? ?res=requests.get(url,headers=headers)
? ?res.encoding='utf-8'
? ?soup=BeautifulSoup(res.text,'html.parser')
? ?tem1= soup.find(class_='tem')
? ?weather1= soup.find(class_='wea')
? ?tem=tem1.text
? ?weather=weather1.text
? ?return tem,weather
def send_email(tem,weather):
? ?mailhost='smtp.qq.com'
? ?qqmail = smtplib.SMTP()
? ?qqmail.connect(mailhost,25)
? ?qqmail.login(account,password)
? ?content= tem+weather
? ?message = MIMEText(content, 'plain', 'utf-8')
? ?subject = '今日天氣預報'
? ?message['Subject'] = Header(subject, 'utf-8')
? ?try:
? ? ? ?qqmail.sendmail(account, receiver, message.as_string())
? ? ? ?print ('郵件發送成功')
? ?except:
? ? ? ?print ('郵件發送失敗')
? ?qqmail.quit()
def job():
? ?print('開始一次任務')
? ?tem,weather = weather_spider()
? ?send_email(tem,weather)
? ?print('任務完成')
schedule.every().day.at("07:30").do(job)
while True:
? ?schedule.run_pending()
? ?time.sleep(1)

第1-7行是把所有引入都放到程序的頂部;從9-11行,把獲取數據也放到函數的外面;然后13-39行,我們都講過了。從41行開始,定義一個函數叫job();42行是打印'開始一次任務',為了記錄和顯示任務的開始。

第43行,是調用爬蟲函數weather_spider(),然后把這個函數內部return的兩個變量tem、weather賦值給job()函數里面的變量tem,weathe;第44行是調用函數send_email(),并且把參數傳入。

第45行打印'任務完成',表示這部分程序運行正常。

47-50行都是定時功能我們見過的函數,我們設定的是每天早上七點半把天氣信息傳遞給收件人。

到此,這一關的任務就圓滿完成了,我們學習了用Python發郵件,用Python定時執行一個程序,并且完成了一個每日爬取天氣并把結果發送到郵箱的程序。給你比個大拇哥。

不過,老師有個小小的提醒,如果你想要明早真正收到天氣信息的話,需要做兩件事:首先,讓該程序在本地電腦運行;其次,保持程序一直運行的狀態,和電腦在一直開機的狀態。因為如果程序結束或者電腦關機了的話,就不會定時爬取天氣信息了。

事實上,在程序員真實的開發環境中,程序一般都會掛在遠端服務器,因為遠端服務器24小時都不會關機,就能保證定時功能的有效性了。如果你也想讓程序掛在遠端服務器的話,需要自己去做一些額外的學習。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446186.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446186.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446186.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 構造器

概念 案例1 package lesson.l11_oop2;/*** Illustration** author DengQing* version 1.0* datetime 2022/7/3 15:28* function*/ public class Person {private int age;private String name;public Person() {this.age 18;}public Person(int age, String name) {this.age …

密碼學專題 信息摘要和數字簽名指令

信息摘要 區別于對稱加密和非對稱加密,信息摘要算數是一種不可逆的操作,無論輸入數據的大小輸出的數據長度是固定的信息摘要算數對輸入很敏感,即使數據變化很細微,輸出的結果會出現很大的差異從不同輸入得到相同的輸出的概率非常…

dataframe 篩選_Spark.DataFrame與Spark.ML簡介

本文是PySpark銷量預測系列第一篇,后面會陸續通過實戰案例詳細介紹PySpark銷量預測流程,包含特征工程、特征篩選、超參搜索、預測算法。在零售銷量預測領域,銷售小票數據動輒上千萬條,這個量級在單機版上進行數據分析/挖掘是非常困…

密碼學專題 證書和CA指令 證書和CA功能概述

為什么需要證書 實現了公鑰和私鑰的相互驗證,但是任何人都可以生成很多的密鑰對,密鑰對并沒有關聯實體身份,因此誕生可數字證書前提是CA是所有用戶都信任的用戶需要將自己的信息和公鑰交給CA進行認證生成一個屬于自己并被其與用戶認可的數字…

python怎么接外活_java和Python兩門語言,哪個適合接活單干?

謝邀。 根據知乎規矩:不說需求就挑語言的行為就是耍流氓。 如果接的活傾向于OA系統、管理系統之類的,建議是java,畢竟框架模板都很成熟,也比較好找,快速開發什么的在晚上搜一下,改改樣式就可以了。這些項目…

密碼學專題 證書和CA指令 申請證書|建立CA|CA操作|使用證書|驗證證書

Req指令介紹 功能概述和指令格式 req指令一般來說應該是提供給證書申請用戶的工具,用來生成證書請求以便交給CA驗證和簽發證書。但是,OpenSSL的req指令的功能遠比這樣的要求強大得多,它不僅可以生成RSA密鑰、DSA密鑰,以及將它們…

python語言編寫一個生成九宮格圖片的代碼_python實現圖片九宮格分割

大家都知道在微信朋友圈或者微博以及QQ動態中,有很多“強迫癥患者”發圖片都愛發9張,而有些圖是一張圖片分成的九宮圖,對于這種操作,大家知道是怎么做到的嗎? 本文就是用Python做的一個九宮格圖片生成器,是…

密碼學專題 OpenSSL標準轉換指令

概述 繁多復雜的各種文件編碼格式、證書格式和密鑰格式等。事實上,并非OpenSSL開發者想要將數字世界弄得如此令人頭疼,只是由于各種原因,數字世界存在各種不同的標準,為了盡量兼容這些不同的標準,OpenSSL開發者才相應…

java pakage、import關鍵字

package介紹 常用的包 import 案例

python數組初始化_Python Numpy 數組的初始化和基本操作

Python 是一種高級的,動態的,多泛型的編程語言。Python代碼很多時候看起來就像是偽代碼一樣,因此你可以使用很少的幾行可讀性很高的代碼來實現一個非常強大的想法。 一.基礎: Numpy的主要數據類型是ndarray,即多維數組…

密碼學專題 OpenSSL中SSL相關指令

再談SSL和OpenSSL 由于SSL協議已經是密碼學和PKI技術中非常具體的一個應用協議,為了實現它,OpenSSL在密碼學基礎應用和PKI技術的基礎實現上做了大量的工作,才逐漸形成和奠定了OpenSSL在密碼學應用和PKI技術開發中的重要基礎軟件包地位。Open…

python企業發放的獎金_你公司的年終獎發了嗎?

沒發, 被裁了. 跨境電商行業, 2017.7 入職,2018.11.19 下午接到裁員通知.. 人事找我聊了下,叫我一個星期之內走,補償1個月工資.... 我想想有點不對勁.. 于是我百度了下,5分鐘之后,提出了我的方案: 1、按照勞動法應該補償1.5個月,并且提前1月通知 2、補償2.5個月. 我立馬走. 最后…

使用MetaMask實現轉賬交易時附帶Input Data數據

進入如下頁面,點擊View Assert in Explorer進入Etherscan網站,就可以看到本賬戶先前所有的交易信息。 字段分析 Txn Hash 是交易的HashMethod:交易的類型,一般是兩種,如果是Transfer指定的是合約部署;如…

Ubuntu安裝Google瀏覽器

下載谷歌瀏覽器 直接使用Ubuntu自帶的火狐瀏覽器進行下載 默認下載到/tmp臨時文件夾里面,考慮到權限問題,需要將其移動到 Downloads文件夾下面使用命令 sudo mv ./goo(Tab)~/Down(Tab)使用命令行的方式進行下載 wget https://dl.g…

普通類創建獲取session 方式_猿蛻變11——一文搞懂mybatis花式使用方式

看過之前的蛻變系列文章,相信你對mybatis有了初步的認識。但是這些還不夠,我們今天進一步來了解下mybatis的一些用法。猿蛻變同樣是一個原創系列文章,幫助你從一個普通的小白,開始掌握一些行業內通用的框架技術知識以及鍛煉你對系…

Ubuntu配置IPFS的環境

參考鏈接 Ubuntu上IPFS環境搭建 - 簡書 下載安裝包 下載地址:https://dist.ipfs.io/#go-ipfs頁面會自動根據你的操作系統提供適合的下載安裝包,所以需要在Ubuntu環境下點開上面那個鏈接,網頁自動識別當前的平臺并提供對應的版本&#xff0c…

composer升級_Composer-命令簡介

簡介Composer 是一個用于 PHP 依賴管理的工具。它實現了讓你聲明項目所依賴的庫,并幫你完成安裝/更新過程。以下命令來自 composer version 1.8.0。翻譯使用【百度翻譯】。通過在命令窗口執行:composer或者:composer list得到 composer 的全部…

Ubuntu搭建聯盟鏈,實現節點之間數據同步

安裝go環境 從參考鏈接選擇Linux版本的go的安裝包 使用命令 mv go(Tab補全)/usr/local 移動go安裝包到/usr/local目錄下使用命令解壓 sudo tar -xvzf go(Tab補全) 配置環境 sudo gedit ~/.profile export PATH$PATH:/usr/local/go/bin激活生效 sou…