Python 每日提醒写博客小程序,使用pywin32、bs4库

用刚学的BeautifulSoup4库,结合pywin32库编写,请确保你已经安装好了相关库

学习网站:w3school  92python  runoob

BeautifulSoup官方文档:Beautiful Soup 4.4.0 文档

总共用时:1小时 (代码在最后面)

学习内容:死循环延迟调用方法,使用bs4库检索博客首页文章的日期是否与今天日期匹配,不匹配则说明今天没写文章,调用pywin32库进行弹窗提醒我写博客。

有待改进:其实这样while true,在win的系统下会一直有一个python进程在运行,占进程,而且每次开机都要运行,在Linux下是推荐每次调用python修改下一次crontab,在win下,用系统定时运行就可以了,不需要在py里计时,或者每次运行去修改下一次运行的时间的注册表,这样比较节省内存。(来自同学 Eakal 的提议)

修改参数:

host = "https://www.cnblogs.com/linxiaoxu"  # ^ 博客园地址
after_time = 18  # ^ 过了下午六点才生效
count = 3  # ^ 一小时提醒几次

踩过的坑

1、Python 函数内如何修改外部全局变量

Python 变量 (w3school.com.cn)


2、Python List index()函数

参数:

  • x-- 查找的对象。
  • start-- 可选,查找的起始位置。
  • end-- 可选,查找的结束位置。
list.index(x[, start[, end]])

该方法返回查找对象的索引位置,如果没有找到对象则抛出异常。


3、Python中关于++和—(自增和自减)的理解

首先要知道的是,Python 中是没有 ++ 和 -- 的。那么要实现自增和自减的话,可以使用如下操作:

a = a + 1
或
a += 1

原因分析

我们知道, python中的数字类型是不可变数据。也就是数字类型数据在 内存 中是不会发生改变,当变量值发生改变时,会新申请一块内存赋值为新值,然后将变量指向新的内存地址。 实验如下:

>>> a = 10
>>> id(a)
140530470127960
>>> a += 1
>>> id(a)
140530470129080

可以看到当 a 的值发生改变时,a 指向的内存地址也发生了改变。而在C语言中,a 指向的内存地址并不会发生改变,而是改变内存的内容。

+= 是改变变量,相当于重新生成一个变量,把操作后的结果赋予这个新生成的变量。
++ 是改变了对象本身,而不是变量本身,即改变数据地址所指向的内存中的内容。

既然 Python 中的数字类型是不可变的,那何来的“自增”这么一说呢?

另外:

int 理论上是每次赋值都创建一个新对象的。但是由于使用频繁,为了提升性能避免浪费,所有 python 有个 整数池,默认 [-5, 256] 的数字都属于这个整数池,这些每次赋值的时候,是取得池中的整数对象。但是其他的除外,如下:

>>> a = 5
>>> b = 5
>>> id(a)
140530470128360
>>> id(b)
140530470128360
>>> a is b
True
 
>>> c = 257
>>> d = 257
>>> id(c)
140530470136432
>>> id(d)
140530470136408

但有时候在 Python 中看到存在 ++i 这种形式,这其实不是自增,只是简单的表示正负数的正号而已。正正得正,负负得正,所以 ++i 和 --i 都是 i 。


4、Python 调用win系统弹框提示

Python 调用win系统弹框提示_byliang502的博客-CSDN博客

win32api (mhammond.github.io)

win32api.MessageBox (mhammond.github.io)


5、Time时间库

Python基础时间库——time - 苦逼运维 - 博客园 (cnblogs.com)

Python库:time库_mulus的博客-CSDN博客_python time库


6、Win10自动运行Python脚本程序

  1. win10自动运行python脚本程序
  2. 管理->系统工具->任务计划程序->任务计划程序库,右键创建基本任务或者在窗口右侧点击创建基本任务。
  3. win10自动运行python脚本程序 进行设置,选择程序,即可

我的代码

# pip install pywin32 -i https://pypi.tuna.tsinghua.edu.cn/simple
import win32api
import win32con
import requests
import time
from bs4 import BeautifulSoup

host = "https://www.cnblogs.com/linxiaoxu"  # ^ 博客园地址
after_time = 18  # ^ 过了下午六点才生效
count = 3  # ^ 一小时提醒几次

times = []  # ^ 统计首页日期
_count = 0  # ^ 统计函数运行次数


def FindLatestPost():
    global _count
    web = requests.get(host)
    if web.status_code != 200:
        print("网络异常", time.ctime())
        return
    web = BeautifulSoup(web.text, 'lxml')
    dayTitles = web.find_all(class_="dayTitle")
    for title in dayTitles:
        times.append(title.a.string)
    t = time.gmtime()
    if t.tm_hour < after_time:
        return
    # t = time.strftime("%Y年%m月%d日", t) # ^ 月份会多一个 0
    t = "{}年{}月{}日".format(t.tm_year, t.tm_mon, t.tm_mday)
    # print(times, t)
    try:
        times.index(t)   # ^ 或 if t in times:
    except:
        win32api.MessageBox(0, "博客还没有写!", "提醒小助手", win32con.MB_ICONWARNING)
    finally:
        _count += 1
        print("FEEDBACK : 执行第", _count, "次", time.ctime())


print("提醒小助手被启用 ", time.ctime())
print("Author: xiaoneng / Blog: cnblogs.com/linxiaoxu")

while True:
    time.sleep(3600/count)
    FindLatestPost()
    # ^ ++_count 不能用

点赞是一种积极的生活态度,喵喵喵!(疯狂暗示)

posted @ 2022-03-13 11:42  小能日记  阅读(151)  评论(0编辑  收藏  举报