請務必每天早上8點將前十條科技要聞發給三爺


需求:

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)
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM