Python爬蟲入門教程 52-100 Python3爬蟲獲取博客園文章定時發送到郵箱

寫在前面

關於獲取文章自動發送到郵箱,這類需求其實可以寫好幾個網站,弄完博客園,弄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("[email protected]", "授權碼")


        sender = '[email protected]'
        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了~
python3爬蟲入門教程

部署到服務器

最後一個步驟,如果想要持續的獲取,那麼找一個服務器,然後部署就行啦,有興趣的博友,繼續研究下去吧~

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章