美文网首页Python养成记
29、BeautifulSoup实例1:网文追更

29、BeautifulSoup实例1:网文追更

作者: 魔方宫殿 | 来源:发表于2022-04-13 23:47 被阅读0次
    Life is short, you need Python!

    上集回顾:

    1. 过滤器
    2. find_all()
    3. find()

    上集学习了BeautifulSoup的搜索功能,BeautifulSoup的基础知识就算学完了,本集进入实战环节。
    网文追更遇到定时更新的作者还好,定时看看就知道更没更新了,但是遇到《剑来》的作者真是没脾气,一天打鱼三天晒网,更新时间还不固定。有时候等的心急就会一遍又一遍的去刷新,看看有没有更新。等一等……一遍又一遍?这事是不是可以让Python来做呢?没学BeautifulSoup的时候可能还不知道怎么做,现在可以知道答案是:必须可以!

    一、分析

    剑来
    先来看下小说介绍页面,可以看到有个最新章节,只要得到这个章节的名称,如果和上次保存的不一样,那就是说明有更新了。 请假

    如果没更新,就再去圈子中看看置顶帖里有没有请假,如果没请假那就休息两分钟再来一遍。

    流程图

    二、代码实现

    from bs4 import BeautifulSoup
    import requests
    import datetime
    import time
    import sys
    import random
    # import win32api,win32con
    import json
    
    FILE_LAST = 'sword.txt'
    URL = "http://book.zongheng.com/book/672340.html"
    forum = "http://forum.zongheng.com/api/forums/postlist?bookId=672340"
    last = ''
    
    def get_header() :
        heads = {}
        heads['User-Agent'] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"
        return heads
        
    def read_last() :
        # 读取上次保存的标题
        with open(FILE_LAST, 'a+') as file :
            file.seek(0)
            return file.read()
    
    def write_last(title) :
        # 保存最新章节标题
        with open(FILE_LAST, 'w') as file :
            file.write(title)
            print('write : ' + title)
            
    def get_least() :
        heads = get_header()
        html = requests.get(URL, headers=heads)
        soup = BeautifulSoup(html.content, "html.parser")
        least = soup.find(class_ = 'book-new-chapter')
        if not least :
            # 未能获得最新章节,脚本可能出错。
            # 1、查询过多需要输入验证码
            # 2、网络错误
            # 3、其他
            print("least: ", html.content)
            # 退出脚本,停止自动检查
            sys.exit()
        return least.find(class_ = 'tit').text
    
    def check_time() :
        time_formatter = '%Y-%m-%d %H:%M:%S'
        time_str = datetime.datetime.now().strftime(time_formatter)
        print('Checked @ %s' % (time_str), flush = True)
    
    def tip(title) :
        # 打印最新章节标题或请假内容。
        print(" new : ", title)
        
        # 弹出提醒对话框提示更新。
        # 可根据需要自行更改。
        # 标题: "提醒"
        # 内容: "好好工作!"
        # win32api.MessageBox(None, "好好工作!", "提醒", win32con.MB_ICONASTERISK)
        
        # 退出脚本,停止自动检查
        sys.exit()
        
    def ask_leave() :
        heads = get_header()
        data_reponse = requests.get(forum, headers=heads)
        data_str = data_reponse.content
        data_json = json.loads(data_str)
        tops = data_json['data']['topThread']
        for top in tops :
            title = top['title']
            if not title :
                title = top['content']
            # 论坛置顶的帖子标题包含‘请假’、‘么么哒’,视为请假!
            if title.find('请假') > 0 or title.find('么么哒') > 0 :
                return title
    
    def check() :
        global last
        # 获取最新章节的标题
        least = get_least()  
        if least == last :
            # 最新章节和已保存相同,说明没有更新。
            # 检查有没有请假。
            leave = ask_leave()
            if leave :
                # 请假内容不为空,说明又请假!
                tip(leave)
            else :
                # 没有请假,打印检查时间。
                check_time()
        else :
            # 保存最新章节标题
            write_last(least)
            if last :
                # 如果上次保存章节不为空,说明有更新。
                # 提示已更新!
                tip(least)
            else :
              last = least
    
    if __name__ == '__main__' :
        # 从文件从文件FILE_LAST中读取上一次保存的最新章节标题
        last = read_last()
        print("last : ", last)
        
        # 随机120~180秒(2~3分钟)检查一下更新,太频繁有可能触发验证码
        while True :
            check()
            s = 60 * 2 + 60 * random.random()
            time.sleep(s)
    

    本集总结:

    1. 分析编程思路
    2. 代码实现

    下集见

    相关文章

      网友评论

        本文标题:29、BeautifulSoup实例1:网文追更

        本文链接:https://www.haomeiwen.com/subject/rerosrtx.html