需求:
1、獲取前十條科技要聞
2、通過郵件發送給指定收件人
3、定時發送
1、獲取要聞,選的是新浪科技網https://tech.sina.com.cn/,爬取前十名要聞
import requests from requests import exceptions from urllib.request import urlopen from bs4 import BeautifulSoup import re # 獲取前十條科技新聞 def get_tech_news(): # 獲取網頁文本 resp = urlopen('https://tech.sina.com.cn/') # 使用爬蟲工具BeautifulSoup查找需要的文本內容 soup = BeautifulSoup(resp, 'html.parser') news = soup.find('ul', class_='rank-con') news_list = [] for new in news: if len(new.string) > 5: news_list.append(new.string.replace(' ', ',')) # 組裝郵件文本,<br>換行 news_contents = f''' 今日科技要聞<br> 1、{news_list[0]}<br> 2、{news_list[1]}<br> 3、{news_list[2]}<br> 4、{news_list[3]}<br> 5、{news_list[4]}<br> 6、{news_list[5]}<br> 7、{news_list[6]}<br> 8、{news_list[7]}<br> 9、{news_list[8]}<br> 10、{news_list[9]}<br> 詳情,請進入https://tech.sina.com.cn 查看 '''.replace('\t', '') print(news_contents) send_email("今日科技要聞", news_contents)
2、定義發送郵件函數,跟上次一樣,同級目錄需要config.yml配置文件
# config.yml配置文件 email: sender: 'mikasama007@163.com' receiver: 'mikasama007@163.com' smtpserver: 'smtp.163.com' username: 'mikasama007' password: '郵箱密碼'
import time import yaml import smtplib import sys from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email.header import Header def get_conf(): with open ("config.yml", "r", encoding='utf-8') as f: cfg = f.read() dic = yaml.load(cfg) # print(type(dic)) # print(dic) sender = dic['email']['sender'] receiver = dic['email']['receiver'] smtpserver = dic['email']['smtpserver'] username = dic['email']['username'] password = dic['email']['password'] # print(sender, receiver, smtpserver, username, password) return sender, receiver, smtpserver, username, password def send_email(title, text): today = time.strftime('%Y.%m.%d',time.localtime(time.time())) sender, receiver, smtpserver, username, password = get_conf() # subject為郵件主題 text為郵件正文 subject = "{}:{}".format(title, today) msg = MIMEText(text, 'html', 'utf-8') msg['Subject'] = subject msg['From'] = sender msg['To'] = "".join(receiver) # smtp = smtplib.SMTP() # smtp.connect(smtpserver) # 變量名不能為stmp,改為server # windows上端口為25,linux上使用SMTP_SSL # server = smtplib.SMTP(smtpserver, 25) # https://blog.csdn.net/zekdot/article/details/81013176 server = smtplib.SMTP_SSL(smtpserver, 465) server.set_debuglevel(0) server.login(username, password) server.sendmail(sender, receiver, msg.as_string()) server.quit()
3、引入schedule庫,定時發送郵件
import schedule # 每天早上8點發送郵件通知 schedule.every().day.at("08:00").do(do_all_get_tech_news) # 確保schedule一直運行 while True: schedule.run_pending() time.sleep(1)
4、丟服務器上去
運行python send_news.py
居然發不了郵件?換個地方就不行?
將登陸模式改為SSL即可:
server = smtplib.SMTP_SSL(smtpserver, 465)
修改后,可以正常發送郵件,cool!
但是這樣可不行,ssh連接關閉,程序肯定會退出的,我們需要后台運行:
nohup python send_news.py &
查看下:
# root @ www in /home/cool_things/send_news [23:06:35] C:1 $ nohup python send_news.py & [1] 24713 # root @ www in /home/cool_things/send_news [23:06:45] $ nohup: ignoring input and appending output to ‘nohup.out’ # root @ www in /home/cool_things/send_news [23:06:50] $ ps -ef | grep python root 724 1 0 Apr01 ? 00:25:52 /usr/bin/python -Es /usr/sbin/tuned -l -P root 10357 1 0 Apr01 ? 00:03:20 /usr/bin/python -Es /usr/sbin/firewalld root 23391 1 0 Sep01 ? 00:10:10 python send_msg_to_wx.py root 24713 21231 1 23:06 pts/1 00:00:00 python send_news.py # root @ www in /home/cool_things/send_news [23:06:58] $ ps -ef | grep send_news root 24713 21231 0 23:06 pts/1 00:00:00 python send_news.py
搞定,程序已經在后台運行,從明天開始,三爺每天早上8點就能收到每日要聞郵件了。
全部代碼:

# !/usr/bin/env python # -*- coding:utf-8 -*- import requests from requests import exceptions from urllib.request import urlopen from bs4 import BeautifulSoup import re import schedule import time import yaml import smtplib import sys from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email.header import Header def get_conf(): with open ("config.yml", "r", encoding='utf-8') as f: cfg = f.read() dic = yaml.load(cfg) # print(type(dic)) # print(dic) sender = dic['email']['sender'] receiver = dic['email']['receiver'] smtpserver = dic['email']['smtpserver'] username = dic['email']['username'] password = dic['email']['password'] # print(sender, receiver, smtpserver, username, password) return sender, receiver, smtpserver, username, password def send_email(title, text): today = time.strftime('%Y.%m.%d',time.localtime(time.time())) sender, receiver, smtpserver, username, password = get_conf() # subject為郵件主題 text為郵件正文 subject = "{}:{}".format(title, today) msg = MIMEText(text, 'html', 'utf-8') msg['Subject'] = subject msg['From'] = sender msg['To'] = "".join(receiver) # smtp = smtplib.SMTP() # smtp.connect(smtpserver) # 變量名不能為stmp,改為server # windows上端口為25,linux上使用SMTP_SSL # server = smtplib.SMTP(smtpserver, 25) # https://blog.csdn.net/zekdot/article/details/81013176 server = smtplib.SMTP_SSL(smtpserver, 465) server.set_debuglevel(0) server.login(username, password) server.sendmail(sender, receiver, msg.as_string()) server.quit() # 獲取前十條科技新聞 def get_tech_news(): # 獲取網頁文本 resp = urlopen('https://tech.sina.com.cn/') # 使用爬蟲工具BeautifulSoup查找需要的文本內容 soup = BeautifulSoup(resp, 'html.parser') news = soup.find('ul', class_='rank-con') news_list = [] for new in news: if len(new.string) > 5: news_list.append(new.string.replace(' ', ',')) # 組裝郵件文本,<br>換行 news_contents = f''' 今日科技要聞<br> 1、{news_list[0]}<br> 2、{news_list[1]}<br> 3、{news_list[2]}<br> 4、{news_list[3]}<br> 5、{news_list[4]}<br> 6、{news_list[5]}<br> 7、{news_list[6]}<br> 8、{news_list[7]}<br> 9、{news_list[8]}<br> 10、{news_list[9]}<br> 詳情,請進入https://tech.sina.com.cn 查看 '''.replace('\t', '') print(news_contents) send_email("今日科技要聞", news_contents) # 調試 news = get_tech_news() def do_all_get_tech_news(): try: get_tech_news() except exceptions as e: print(e) time.sleep(10) get_tech_news() # 每天早上8點發送郵件通知 schedule.every().day.at("08:16").do(do_all_get_tech_news) # 確保schedule一直運行 while True: schedule.run_pending() time.sleep(1)