每天定时用爬虫爬取新闻发送给三爷

2023-11-02

需求:

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)

欢迎扫描关注我的公众号,欢迎投稿,一起探讨技术、人生,谢谢。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每天定时用爬虫爬取新闻发送给三爷 的相关文章

  • Python 多处理示例不起作用

    我正在尝试学习如何使用multiprocessing但我无法让它发挥作用 这是代码文档 http docs python org 2 library multiprocessing html from multiprocessing imp
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • 为什么 Linux 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • Geopandas 设置几何图形:MultiPolygon“等于 len 键和值”的 ValueError

    我有 2 个带有几何列的地理数据框 我将一些几何图形从 1 个复制到另一个 这对于多边形效果很好 但对于任何 有效 多多边形都会返回 ValueError 请指教如何解决这个问题 我不知道是否 如何 为什么应该更改 MultiPolygon
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • Python 分析:“‘select.poll’对象的‘poll’方法”是什么?

    我已经使用 python 分析了我的 python 代码cProfile模块并得到以下结果 ncalls tottime percall cumtime percall filename lineno function 13937860 9

随机推荐

  • STC89C52单片机中指针的运用与实际案例演示

    目录 小端分配的方式 C语言中 的功能 数据宽度 传递参数 传递返回值 直接访问物理地址下的数据 访问硬件指定内存下的数据 如设备ID号等 将复杂格式的数据转换为字节 方便通信与存储 指针 Pointer 是C语言的一个重要知识点 其使用灵
  • Elastic Search 安装部署最全教程(Docker)

    一 部署单点ES 1 首先创建网络 因为我们还需要部署kibana容器 因此需要让es和kibana容器互联 这里先创建一个网络 docker network create es net 2 加载镜像 docker pull elastic
  • 全网最详linux命令学习,教你快速入门。适合小白学习的几大命令,对文件的操作命令

    目录 一 文件内容浏览 查看文件内容 二 cut命令 三 uniq命令的使用 四 sort命令 五 tr命令 一 文件内容浏览 查看文件内容 1 cat查看 etc passwd 文件内容 且输出时带行号 cat 查看文本的内容 n 显示文
  • 深度学习之AdaGrad算法

    AdaGrad 算法根据自变量在每个维度的梯度值调整各个维度的学习率 从而避免统一的维度难以适应所有维度的问题 特点 小批量随机梯度按元素累加变量 出现在学习率的分母项中 若目标函数有关自变量的偏导数一直都较大 那么学习率下降较快 反之亦然
  • STM32407 FreeRtos系统下lwip实现发送和接收数据包进行链路测试

    下面是一个基于STM32F407 FreeRTOS系统下lwIP实现发送和接收数据包进行链路测试的案例 硬件配置和软件环境搭建 首先 需要准备好STM32F407开发板 以太网网线和一台电脑 然后在电脑上安装好STM32CubeMX工具和K
  • HTML:实现鼠标拖拽,释放效果

    第一部分body 先定义一个块标签 例如div class drag 第二部分style 自由书写其样式 不可或缺的属性position absolute 第三部分script 鼠标拖动元素移动 即元素的位置放上变化 坐标 var drag
  • ChatGPT总结(持续更新)

    目录 体验渠道 weTab CSDN AI助手 其他插件 ChatGPT简介 ChatGPT主要用途 ChatGPT发展历程 GPT 4架构的特点和优势 ChatGPT的工作原理 神经网络和自然语言处理技术 Transformer模型 模型
  • c++纯虚数一个报错 cannot declare variable ‘a‘ to be of abstract ty

    官方点说是因为没有在子类中完成对基类的虚函数的定义 使得子类不能实例化 通俗点点说是因为父类中的纯虚数在子类中没有全部实例化 就是说明这个是做什么的 即使不用也要在子类中实例化一下 我今天就是因为想着不用先不写 结果一直报错
  • 大数据:Hive视图和索引

    一 视图 1 1 简介 Hive 中的视图和 RDBMS 中视图的概念一致 都是一组数据的逻辑表示 本质上就是一条 SELECT 语句的结果集 视图是纯粹的逻辑对象 没有关联的存储 Hive 3 0 0 引入的物化视图除外 当查询引用视图时
  • 三极管工作原理分析,精辟、透彻,看后你就懂

    说明 内容与之前那篇一样 由于之前那篇是转载百度的 现在图片受限 无法阅读 这篇自己添加了图片资源 随着科学技的发展 电子技术的应用几乎渗透到了人们生产生活的方方面面 晶体三极管作为电子技术中一个最为基本的常用器件 其原理对于学习电子技术的
  • 软件测试的原则和测试需求分析

    软件测试的原则 1 所有的测试都是以需求规格说明书为准的 2 软件测试必须基于 质量第一 的思想开展工作 如果时间与质量冲突 时间服从质量 3 事先定义好产品的质量标准 只要有了质量标准 才能根据测试结果 对产品质量进行分析和评估 4 软件
  • 蓝桥杯 基础练习 矩阵乘法

    问题描述 给定一个N阶矩阵A 输出A的M次幂 M是非负整数 例如 A 1 2 3 4 A的2次幂 7 10 15 22 输入格式 第一行是一个正整数N M 1 lt N lt 30 0 lt M lt 5 表示矩阵A的阶数和要求的幂数 接下
  • 国产代码审计工具Pinpoint介绍

    硬核国产代码审计工具Pinpoint介绍 简介 Pinpoint是由国内源伞科技所研制的一款静态代码审计工具 源伞科技公司是香港科技大学安全实验室的众多博士创建的 产品集成了实验室多年的研究成果 在众多国际顶级学术会议上都发表了成果论文 在
  • MinGW/GCC/CodeBlocks 等在 Win7 编译出现 Permission Denied 错误 - 解决方法

    本文分享了以 MinGW 为主要编译模块的编译器 如 MinGW 自身 以及Dev Cpp CodeBlocks 这些调用 MinGW 进行编译的编译器 在编译连接过程中出现 Permission Denied 错误的解决方法 同样 可能也
  • js搜索关键字,并高亮显示

    当我们搜索时 总想要自己输入的字体显示为重点 今天我为大家解决这个问题
  • 集成spring-boot-admin(一)搭建admin-server

    1 什么是SBA SBA全称为Spring Boot Admin 是一个管理和监控Spring Boot应用程序的开源项目 分为admin server 与 admin client 两个组件 admin server是一个单独的微服务 通
  • C++算术类型

    算术类型分为两类 整型 integral type 包含字符类型和布尔类型 和浮点型 算术类型的尺寸在不同机器有所差别 C 算术类型 类型 含义 最小尺寸 bit 字节 byte bool 布尔类型 未定义 1 char 字符型 8位 1
  • 不相交的线

    不相交的线 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数 现在 可以绘制一些连接两个数字 nums1 i 和 nums2 j 的直线 这些直线需要同时满足满足 nums1 i nums2 j 且绘制的直线不与任
  • 解决VirtualBox只能安装32位系统的问题

    安装VirtualBox虚拟机后发现只能安装32位系统 如下图 原因分析 电脑未开启cpu虚拟化技术 解决方式 需要到电脑BIOS里设置一下 方可安装 64位系统 操作方式 1 进入BIOS设置 根据电脑型号不同进入方式不一致 可网上查找进
  • 每天定时用爬虫爬取新闻发送给三爷

    需求 1 获取前十条科技要闻 2 通过邮件发送给指定收件人 3 定时发送 1 获取要闻 选的是新浪科技网https tech sina com cn 爬取前十名要闻 import requests from requests import