你想第一时间得知垠神是否发表了新博客么?

背景

今天给大家分享一个python爬虫 ,其实很早之前就在这写过一个类似的,只不过这个是用于部署在vps上用的,因为这个爬虫每次运行的时候都要检测上次爬虫生成的一个文本文件中的内容来判断是否发表了新博客。

可现在本站所分享的python脚本都由腾讯云的云函数来托管了,因为云函数是severless化的,不可能用每次检测上次爬虫生成的一个文本文件中的内容来判断是否发表了新博客。

腾讯云官方推荐用其自家的对象存储COS来实现,我觉得比较麻烦,后来我又想到可以把临时生成的文件放到免费的ftp空间上,每次比较的时候再取回本地进行比较,但想了想还是有点麻烦懒得实现,就在我一筹莫展的时候突然灵光一现,发现可以用当天的日期和博客列表的第一篇博客的发表日期进行比较,如果相同就代表今天发表了新博客,就这样我用这种技巧巧妙的再次实现了serverless化,快给我点赞👍!

P.S.

  • 当然这样子也有个bug,即是:如果云函数的触发条件是每天一次,而垠神恰巧一天发了两篇及以上的博客,那么就会漏掉当天发表的第一篇博客,当然话说回来据我多年对垠神的观察,垠神很少有或者说没有一天发表两篇博客的时候
  • 还有个问题要着重说一下,这个也是我在写本文的时候刚想到的(在写本文之前本人已经把这个python爬虫 打包部署上去了),就是云函数的触发时间不能设为每一天,因为云函数的每一天默认的是每天0点0分0秒执行一次,如果这样设置的话可能永远不会收到垠神发表了新博客的邮件通知了,具体原因大家自己想一下,我就不赘述了,反过来大家最好把触发时间设置为每天的23:59,好了不啰嗦了,我要去改云函数的触发时间点了,bye👋!
  • 最后再来讨论一个话题,本篇博客的标题提到了‘第一时间’,如果你真想实现第一时间的话,你在云函数的触发周期设置的时候就要尽可能设置的频繁一些了,比如每5分钟执行一次,但是这样的话我有点担心过不了多久你就会把云函数的每月资源使用量的免费部分给消耗完了,大家自己权衡吧。

代码

好了,废话不多说了,来看代码

#!/usr/bin/env python3
# coding = 'utf-8'
"""
@Time    : 2020/3/26-15:22
@Author  : sharp
@FileName: yinwang.py
@Software: PyCharm
@Blog    :https://www.sharpgan.com/
"""
import time
import smtplib
import requests
from bs4 import BeautifulSoup
from email.mime.text import MIMEText

HOST = 'smtp.126.com'
PORT = 25
SENDER = '@126.com'
RECEIVER = '@qq.com'
PWD = ''


def mail_send(subject, mail_body):
    try:
        msg = MIMEText(mail_body, 'plain', 'utf-8')
        msg['Subject'] = subject
        msg['From'] = SENDER
        msg['To'] = RECEIVER
        s = smtplib.SMTP(HOST, PORT)
        s.debuglevel = 0
        s.login(SENDER, PWD)
        s.sendmail(SENDER, RECEIVER, msg.as_string())
        s.quit()
    except smtplib.SMTPException as e:
        print(str(e))


def main(arg1, arg2):
    url = 'http://www.yinwang.org'
    current_date = time.strftime("%Y年%m月%d日", time.localtime())
    soup = BeautifulSoup(requests.get(url).text, 'html5lib')
    curr_blog = soup.select_one('div.outer ul li')
    curr_blog_date = curr_blog.select_one('div.date').get_text()
    if curr_blog_date == current_date:
        print('垠神发表了一篇新博客!')
        blog_title = curr_blog.select_one('a').get_text()
        blog_href = curr_blog.select_one('a').get('href')
        blog_url = url + blog_href
        mail_send(subject=current_date + ' ' + '垠神发表了一篇新博客',
                  mail_body=blog_title + '\n' + blog_url)
    else:
        print('垠神今天没有发表新博客!')

 

具体如何使用和部署上面的代码请一定要参考本站的这篇博客哦~