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

.

相关文章
|
1月前
|
数据采集 存储 XML
Python爬虫:深入探索1688关键词接口获取之道
在数字化经济中,数据尤其在电商领域的价值日益凸显。1688作为中国领先的B2B平台,其关键词接口对商家至关重要。本文介绍如何通过Python爬虫技术,合法合规地获取1688关键词接口,助力商家洞察市场趋势,优化营销策略。
|
2天前
|
数据采集 供应链 API
Python爬虫与1688图片搜索API接口:深度解析与显著收益
在电子商务领域,数据是驱动业务决策的核心。阿里巴巴旗下的1688平台作为全球领先的B2B市场,提供了丰富的API接口,特别是图片搜索API(`item_search_img`),允许开发者通过上传图片搜索相似商品。本文介绍如何结合Python爬虫技术高效利用该接口,提升搜索效率和用户体验,助力企业实现自动化商品搜索、库存管理优化、竞品监控与定价策略调整等,显著提高运营效率和市场竞争力。
20 3
|
13天前
|
数据采集 存储 缓存
如何使用缓存技术提升Python爬虫效率
如何使用缓存技术提升Python爬虫效率
|
14天前
|
数据采集 Web App开发 监控
Python爬虫:爱奇艺榜单数据的实时监控
Python爬虫:爱奇艺榜单数据的实时监控
|
23天前
|
数据采集 JSON API
如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
|
28天前
|
数据采集 存储 API
利用Python爬虫获取1688关键词接口全攻略
本文介绍如何使用Python爬虫技术合法合规地获取1688关键词接口数据,包括环境准备、注册1688开发者账号、获取Access Token、构建请求URL、发送API请求、解析HTML及数据处理存储等步骤,强调遵守法律法规和合理使用爬虫技术的重要性。
|
1月前
|
数据采集 JSON 开发者
Python爬虫京东商品详情数据接口
京东商品详情数据接口(JD.item_get)提供商品标题、价格、品牌、规格、图片等详细信息,适用于电商数据分析、竞品分析等。开发者需先注册账号、创建应用并申请接口权限,使用时需遵循相关规则,注意数据更新频率和错误处理。示例代码展示了如何通过 Python 调用此接口并处理返回的 JSON 数据。
|
2月前
|
XML 数据采集 数据格式
Python 爬虫必备杀器,xpath 解析 HTML
【11月更文挑战第17天】XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,通过路径表达式选取节点或节点集。它不仅适用于 XML,也广泛应用于 HTML 解析。基本语法包括标签名、属性、层级关系等的选择,如 `//p` 选择所有段落标签,`//a[@href=&#39;example.com&#39;]` 选择特定链接。在 Python 中,常用 lxml 库结合 XPath 进行网页数据抓取,支持高效解析与复杂信息提取。高级技巧涵盖轴的使用和函数应用,如 `contains()` 用于模糊匹配。
|
16天前
|
数据采集 安全 API
高级技术文章:使用 Kotlin 和 Unirest 构建高效的 Facebook 图像爬虫
高级技术文章:使用 Kotlin 和 Unirest 构建高效的 Facebook 图像爬虫
|
2月前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
下一篇
开通oss服务