Python爬虫入门教程 52-100 Python3爬虫获取博客园文章定时发送到邮箱

简介: 写在前面关于获取文章自动发送到邮箱,这类需求其实可以写好几个网站,弄完博客园,弄CSDN,弄掘金,弄其他的,网站多的是呢~哈哈先从博客园开始,基本需求,获取python板块下面的新文章,间隔60分钟发送一次,时间太短估摸着没有多少新博客产出~抓取的页面就是这个https://www.

写在前面

关于获取文章自动发送到邮箱,这类需求其实可以写好几个网站,弄完博客园,弄CSDN,弄掘金,弄其他的,网站多的是呢~哈哈

先从博客园开始,基本需求,获取python板块下面的新文章,间隔60分钟发送一次,时间太短估摸着没有多少新博客产出~

抓取的页面就是这个

https://www.cnblogs.com/cate/python

需求整理

  1. 获取指定页面的所有文章,记录文章相关信息,并且记录最后一篇文章的时间
  2. 将文章发送到指定邮箱,更新最后一篇文章的时间

实际编码环节

查看一下需要导入的模块

模块清单

import requests
import time
import re
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from email.header import Header
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart

初始化基本数据

    # 初始化数据
    def __init__(self):
        self.start_url = "https://www.cnblogs.com/cate/python"
        self.headers = {
            "user-agent": "Mozilla/..... Safari/537.36",
            "referer": "https://www.cnblogs.com/cate/python/"
        }
        self.pattern = r'<div class="post_item_body">[\s\S.]*?<h3><a class="titlelnk" href="(.*?)" target="_blank">(.*?)</a></h3>[\s\S.]*?<div class="post_item_foot">[\s\S.]*?<a href=".*?" class="lightblue">(.*?)</a>([\s\S.]*?)<span class="article_comment">'
        self.last_blog_time = 0
        self.need_send_articles = []

参数说明

  • self.start_url 数据爬取地址
  • self.headers 头文件
  • self.pattern 正则表达式,用来匹配我们需要的数据内容的,你可以使用BS4,LXML,PyQuery等内容实现
  • self.last_blog_time 最后一篇博客的更新时间
  • self.need_send_articles 需要发送的博客地址

解析博客网页内容

涉及代码较多,我将关键点编写相应的注释

    # 解析网页内容
    def get_articles(self):
        try:
            # 正常的数据获取
            res = requests.get(self.start_url,headers=self.headers,timeout=3)
        except Exception as e:
            print("error %s"% e)
            time.sleep(3)
            return self.get_articles()  # 重新发起请求

        html = res.text
        # 这个地方的正则表达式是考验你正则功底的地方了
        all = re.findall(self.pattern,html)
        # 判断,如果没有新文章
        last_time = self.change_time(all[0][3].strip().replace("发布于 ", ""))

        if last_time <= self.last_blog_time:
            print("没有新文章更新")
            return

        for item in all:
            public_time = item[3]
            if public_time:
                # 格式化时间
                public_time = self.change_time(public_time.strip().replace("发布于 ",""))

                if(public_time > self.last_blog_time):
                    self.need_send_articles.append({
                        "url":item[0],
                        "title":item[1],
                        "author":item[2],
                        "time":public_time
                    })

        # 文章获取完毕,更新时间
        self.last_blog_time = last_time
        ##### 测试输出
        print(self.need_send_articles)
        print("现在文章的最后时间为",self.last_blog_time)
        ##### 测试输出

时间字符串转换成时间戳

采用时间戳可以直接比较大小,非常方便

   def change_time(self,need_change_time):
        '''
        # 时间的转换
        :param need_change_time:
        :return:返回时间戳
        '''
        time_array = time.strptime(need_change_time, "%Y-%m-%d %H:%M")
        time_stamp = int(time.mktime(time_array))
        return time_stamp

邮件发送环节

本篇博客采用的是QQ邮箱发送
关于QQ邮箱发送的一些参考文章,我给大家列一下,方便你查阅

参考文章
# https://blog.csdn.net/qiye005/article/details/80789666
# https://blog.csdn.net/Momorrine/article/details/79881251
# https://www.cnblogs.com/lovealways/p/6701662.html
# https://www.cnblogs.com/yufeihlf/p/5726619.html

因为我采用的是QQ邮箱,所以有的地方设定起来比较麻烦,发短信还花了2毛钱,建议你采用其它的邮箱,设置是一样的哦~~

发送邮件send_email函数

你看一下上面的文章之后,就可以对邮件发送进行相应的编写了,非常简单

QQ邮箱是SSL认证的邮箱系统,因此用QQ邮箱发送邮件,需要创建一个SMTP_SSL对象,而不是SMTP对象

    # 发送邮件
    def send_email(self,articles):
        smtp = smtplib.SMTP_SSL()  # 这个地方注意
        smtp.connect("smtp.qq.com",465)
        smtp.login("860866679@qq.com", "授权码")


        sender = '860866679@qq.com'
        receivers = ['找个自己的其他邮箱@163.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

        # 完善发件人收件人,主题信息
        message = MIMEMultipart()
        message['From'] = formataddr(["博客采集器", sender])
        message['To'] = formataddr(["hi,baby", ''.join(receivers)])
        subject = '你有新采集到的文章清单'
        message['Subject'] = Header(subject, 'utf-8')
        # 正文部分
        html = ""
        for item in articles:
            html+=("<p><a href='{url}'>{title}</a>--文章作者{author}--发布时间{time}</p>".format(title=item["title"],url=item["url"],author=item["author"],time=item["time"]))

        textmessage = MIMEText('<p>新采集到的文章清单</p>' +html,
                               'html', 'utf-8')
        message.attach(textmessage)

        # 发送邮件操作
        smtp.sendmail(sender, receivers, message.as_string())
        smtp.quit()

邮箱收到邮件

当收到邮件的那一刻,你就可以感受到happy了~
image

部署到服务器

最后一个步骤,如果想要持续的获取,那么找一个服务器,然后部署就行啦,有兴趣的博友,继续研究下去吧~

image

更多内容,欢迎关注 https://dwz.cn/r4lCXEuL

.

相关文章
|
存储 数据采集 自然语言处理
Python爬取公众号文章并实现关键词分析
Python爬取公众号文章并实现关键词分析
|
存储 算法 API
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
5129 82
|
数据采集 存储 监控
Python爬虫自动化:定时监控快手热门话题
Python爬虫自动化:定时监控快手热门话题
|
存储 API 数据安全/隐私保护
【02】整体试验思路,在这之前我们发现sec_uid,sec_uid是什么和uid的关系又是什么?相互如何转换?python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
【02】整体试验思路,在这之前我们发现sec_uid,sec_uid是什么和uid的关系又是什么?相互如何转换?python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
3747 6
|
JSON Linux 数据格式
Python模块:从入门到精通,只需一篇文章!
Python中的模块是将相关代码组织在一起的单元,便于重用和维护。模块可以是Python文件或C/C++扩展,Python标准库中包含大量模块,如os、sys、time等,用于执行各种任务。定义模块只需创建.py文件并编写代码,导入模块使用import语句。此外,Python还支持自定义模块和包,以及虚拟环境来管理项目依赖。
Python模块:从入门到精通,只需一篇文章!
|
IDE 开发工具 iOS开发
【10月更文挑战第3天】「Mac上学Python 3」入门篇3 - 安装Python与开发环境配置
本篇将详细介绍如何在Mac系统上安装Python,并配置Python开发环境。内容涵盖Python的安装、pip包管理工具的配置与国内镜像源替换、安装与配置PyCharm开发工具,以及通过PyCharm编写并运行第一个Python程序。通过本篇的学习,用户将完成Python开发环境的搭建,为后续的Python编程工作打下基础。
1590 2
【10月更文挑战第3天】「Mac上学Python 3」入门篇3 - 安装Python与开发环境配置
|
测试技术 开发者 Python
对于Python中的异常要如何处理,raise关键字你真的了解吗?一篇文章带你从头了解
`raise`关键字在Python中用于显式引发异常,允许开发者在检测到错误条件时中断程序流程,并通过异常处理机制(如try-except块)接管控制。`raise`后可跟异常类型、异常对象及错误信息,适用于验证输入、处理错误、自定义异常、重新引发异常及测试等场景。例如,`raise ValueError(&quot;Invalid input&quot;)`用于验证输入数据,若不符合预期则引发异常,确保数据准确并提供清晰错误信息。此外,通过自定义异常类,可以针对特定错误情况提供更具体的信息,增强代码的健壮性和可维护性。
|
存储 Go C语言
Python 的整数是怎么实现的?这篇文章告诉你答案
Python 的整数是怎么实现的?这篇文章告诉你答案
548 7
|
编解码 UED Python
Python批量修改指定目录下图片的大小名文章
Python批量修改指定目录下图片的大小名文章
308 1
|
安全 Linux 开发者

推荐镜像

更多