<span>newsexpress--利用github_actions建立自动运行爬取学校官网通知并自动发送邮件的小玩意</span>

早上起来刷博客, 看到了一个很有意思的东西---Github Actions, 作者利用Github Actions制作了一个定时发送天气邮件的玩意儿, 一下子来了兴趣, 想了一会决定先写个小爬虫试试水~

然后一下午过去了, 目前做成了这个 :

https://github.com/L***/newsexpress

效果长这样 :

好啦, 接下来大概介绍下过程吧 :

Github Actions

首先简单介绍下Github Actions这玩意

GitHub Actions 是一个 CI/CD(持续集成/持续部署)工具,但也可用作代码运行环境

官方文档 : https://help.github.com/en/actions

功能非常强大, 文档我也只看了一些最基本的配置方面的内容, 我只用到了其中一点点

我把它理解为一个可以自动执行你放在仓库里项目的东西

配置方法

首先在github下建个仓库, 然后只要你建立这么一条路径以及一个action.yml文件就可以自动触发github actions

关于workflow文件 ( .yml文件 ) 的配置, 这里大概介绍一下 :

这里的on表示执行的时间, 比如我这里是每次push之后和每天的10,21点( 国际事件, 换成北京时间是早上5点和晚上6点 )执行, schedule的设置遵循POSIX cron 语法, 这里 是它的使用方法

这里表示运行的系统为ubuntu最新版, python版本是3.8, 然后安装根目录下的依赖 ( 比如爬虫中的requests和beautifulsoup, 自己是不带的, 需要在运行机里pip安装 )

这里是发送邮件的机制, 我本来用的是163的smtp服务器, 然后下午push了五十多次后IP被封了(((

(我....)

这里的username和password要在setting里自己设置, 具体可以参考官方文档

然后在我写完脚本之后发现一个问题, 就是我的脚本需要依赖于update.txt文件判断信息是否更新, 而每次在处理机上运行的时候它不会帮我更新我的仓库, 所以还得自己写github的update方案:

百度了好大一圈, 最后这么实现了 :

注意这里的uses和上面的uses大概可以理解为别人写的actions, 你只需要按他所说的设定规则就好.

这里 是github的官方市场, 里面都是别人写好的actions

爬虫

其实到上面基本就结束了, 毕竟github actions的使用才是重点, 至于我这个爬虫... 我只能说达到了目的, 但是代码写的稀烂, 毕竟只是写个demo, 重点在于了解actions的使用以后如果还想干别的肯定还会写其他脚本的.

# coding=utf-8
import requests
import re
from bs4 import BeautifulSoup as bs

def geturl(url):
    try:
        requ = requests.get(url, headers={
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36'})
        requ.encoding = requ.apparent_encoding
        req = requ.text
        return req
    except:
        print("wrong")


if __name__ == '__main__':
    x = 0
    flag = 0
    cnt = 0
    retry=0
    body = []
    while(x <= 50) :
        try:
            url = 'https://jwc.xidian.edu.cn/'
            text = geturl(url)
            regex = re.compile(r'<a href="(.*?)" class="c49782"')
            body = regex.findall(text)
            print("successful")
            x=100
        except:
            x+=1
            continue

    print(body)
    with open("./update.txt", "r", encoding="utf-8") as f:
        date = f.read()
    newbody = []
    if(date == body[0]):
        flag = 1

    for i in body:
        if(date == i):
            break  # 到此为止, 之后的为之前内容
        else:
            newbody.append(i)
    date = body[0]
    body = newbody

    with open("./update.txt", "w", encoding="utf-8") as f:
        f.write(date)

    if(flag==0):
        with open("./text.html", "w", encoding="utf-8") as f:
            f.write(r"<h1>今日更新内容 :<br><br><br> </h1>")
            for i in body:
                retry = 0
                while(retry < 100):               
                    try:
                        url = 'https://jwc.xidian.edu.cn/' + i
                        html = geturl(url)
                        soup = bs(html, 'html.parser')
                        title = soup.find(name="td", attrs={"class" : "titlestyle49757"})
                        text = soup.find(name="div", attrs={"class" :"v_news_content"})
                        #print(str(title))
                        # print(str(text))
                        f.write(r"<h1>"+str(title)+r"</h1>"+r"&nbsp url : <a href="+url+r">" + url + r"</a>")
                        f.write(str(text))
                        f.write(r"<br><br><br><br><br><br><br>")
                        retry = 1000
                    except:
                        retry+=1  # 重复尝试
    else:
        with open("./text.html", "w", encoding="utf-8") as f:
            f.write(r"<h1>今天没有更新哦~~~</h1>")


    f.close()
    print("successful")

关于爬虫网上参考资料一堆

本来想直接用正则表达式提取字段展示就完了, 奈何re不给力半天没写好匹配, 就查了查beautifulsoup的使用方法然后用beautifulsoup十分钟解决了两小时没解决的问题

----好工具是十分重要的

然后在网页的请求上, 为了防止请求出错, 我设置了一个retry和一个x字段都是为了在出错时循环尝试的

然后就是update.txt了, 这里存的是网站最后一个通知的url链接, 下次一调用脚本时先打开update.txt, 判断当前最新的url是否与其是否相等, 如果相等就是没更新, 不相等的话就继续遍历当前的url集合, 直到找到更新的最后一条消息为止, 然后再把update更新一波就完了, 这俺想到的比较简单的解决方案

大概就扯这么多吧


全部评论

相关推荐

自从我室友在计算机导论课上听说了“刷&nbsp;LeetCode&nbsp;是进入大厂的敲门砖”,整个人就跟走火入魔了一样。他在宿舍门口贴了一张A4纸,上面写着:“正在&nbsp;DP,请勿打扰,否则&nbsp;Time&nbsp;Limit&nbsp;Exceeded。”日记本的扉页被他用黑色水笔加粗描了三遍:“Talk&nbsp;is&nbsp;cheap.&nbsp;Show&nbsp;me&nbsp;the&nbsp;code。”连宿舍聚餐,他都要给我们讲解:“今天的座位安排可以用回溯算法解决,但为了避免栈溢出,我建议用动态规划。来,这是状态转移方程:dp[i][j]&nbsp;代表第&nbsp;i&nbsp;个人坐在第&nbsp;j&nbsp;个位置的最优解。”我让他去楼下取个快递,他不直接去,非要在门口踱步,嘴里念念有词:“这是一个图的遍历问题。从宿舍楼(root)到驿站(target&nbsp;node),我应该用&nbsp;BFS&nbsp;还是&nbsp;DFS?嗯,求最短路径,还是广度优先好。”和同学约好出去开黑,他会提前发消息:“集合点&nbsp;(x,&nbsp;y),我们俩的路径有&nbsp;k&nbsp;个交点,为了最小化时间复杂度,应该在&nbsp;(x/2,&nbsp;y/2)&nbsp;处汇合。”有一次另一个室友低血糖犯了,让他帮忙找颗糖,他居然冷静地分析道:“别急,这是一个查找问题。零食箱是无序数组,暴力查找是&nbsp;O(n)。如果按甜度排序,我就可以用二分查找,时间复杂度降到&nbsp;O(log&nbsp;n)。”他做卫生也要讲究算法效率:“拖地是典型的岛屿问题,要先把连通的污渍区块都清理掉。倒垃圾可以用双指针法,一个指针从左往右,一个从右往左,能最快匹配垃圾分类。”现在我们宿舍的画风已经完全变了,大家不聊游戏和妹子,对话都是这样的:“你&nbsp;Two&nbsp;Sum&nbsp;刷了几遍了?”“别提了,昨天遇到一道&nbsp;Hard&nbsp;题,我连暴力解都想不出来,最后只能看题解。你呢?”“我动态规划还不行,总是找不到最优子结构。今天那道接雨水给我整麻了。”……LeetCode&nbsp;真的害了我室友!!!
老六f:编程嘉豪来了
AI时代还有必要刷lee...
点赞 评论 收藏
分享
04-02 10:09
门头沟学院 Java
用微笑面对困难:这里面问题还是很多的,我也不清楚为啥大家会感觉没啥问题。首先就是全栈开发实习9个月的内容都没有java实习生的内容多,1整个技术栈没看出太核心和难点的内容,感觉好像被拉过去打杂了,而且全栈基本上很容易被毙。里面能问的bug是在太多了比如L:继承 BaseMapper 可直接使用内置方法’。请问你的 BaseMapper 是如何扫描实体类注解如果瞬时产生 100 个上传任务,MySQL 的索引设计是否会有瓶颈?你做过分库分表或者索引优化吗?全栈的内容可以针对动态难点去搞,技能特长写在下面吧,你写了这么多技能,项目和实习体现了多少?你可以在项目里多做文章然后把这个放下去,从大致来看实习不算太水,有含金量你也要写上内容针对哨兵里面的节点变化能问出一万个问题,这个很容易就爆了。
提前批简历挂麻了怎么办
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务