前言
最近又找到一个还不错的新闻源,更新新闻源的同时,把之前一直想做的新闻归档也顺便做了出来,接下来就来给大家分享这整个过程。
EverydayTechNews
这个项目的初衷就是通过爬虫爬取特定的新闻板块,每天发到我的邮箱,这样就能直接在邮箱看到我感兴趣的新闻了,而不需要使用其他的软件。
如果你也想订阅一下,可以点击这里
新闻源
这次找到的新闻源是IT之家的数码板块,链接是:https://digi.ithome.com/
爬取的内容是网页中日榜的部分,如下图

据我观察,这个部分更新的频率还比较快,当然后续也可能再此基础上再增加其他的板块,或者修改为其他的板块。
所以目前新闻源这部分就是这样。
爬取
相比之前那种每天只爬取一次,获得到的都是爬取时间点附近的新闻,很可能错过一天中其他时点的新闻,所以这次我对爬取逻辑进行了重构。
爬取次数
最开始我设置为每半小时爬取一次,但我发现有半数以上的爬取是无效的,没有新闻更新导致的无效爬取,因此最终我把爬取次数定为每小时爬取一次。
这样可以很大程度上利用好爬取的次数来更新新闻,同时也不会漏掉一闪而过的新闻。
同时也正是因为这次做了新闻归档,所以才能够一天多次爬取,把爬取和发邮件的函数彻底分开。
爬取逻辑
在最开始的测试中,我设定的逻辑是只要这个新闻是现在在网站上,今天没有出现过,那么久把这条新闻写入今日新闻的归档中。
但我发现这样的逻辑存在着很大的问题,就是临近零点的新闻既会被写入前一天的新闻归档中,又会被写入后一天的归档中,导致重复。
所以我开始的解决方法就是,添加一个每月新闻,把这个月出现过的新闻都添加进去,这样就不会出现上述问题了,但是这时候就出现了一个新问题,就是临近月末的新闻既会出现在上个月的新闻中又回出现在下个月的新闻中。
所以我又做了一些改进,在写入一条新闻前,会同时查找昨日新闻和本月新闻,这样能很大程度上解决这个问题,但是实际上并不是最优解,但也能解决的不错。
(我目前想到的最优解就是创建一个100条的新闻池,然后存满之后保留新的覆盖旧的,按照每日20条新闻来计算,这个新闻池能否存5天的新闻,应该不会有什么新闻能在一个新闻网站上挂超过5天的吧)
爬取动态网页
本次是我第一次尝试在GitHub Action上实现非静态网页的爬取,使用的库是selenium,一个自动化常用到的库,因为本次爬取的网页是动态的,所以需要使用这个库来模拟真实浏览,来获取到内容。
虽然整个过程不难,但是当我在GitHub Action上尝试到时候遇到了问题,最开始我使用的是Ubuntu的服务器来运行,总是出现Chrome的错误,当我觉得是不是行不通的时候,我突然想到是不是系统兼容问题,于是尝试换成Macos的服务器来运行,结果,一次成功。
也算是打开了新世界的大门,从此可以把更多更灵活的爬虫部署在Github Action上来运行了。
新闻归档
目前我的归档方案是按照“年-月”来建立文件夹,来文件夹中设置从00.md一直到这个月有多少天这么多文件,其中00.md就是本月新闻。
然后归档新闻“年-月”文件夹统一放置在“news_archive”这个文件夹下。
5月12日更新
万万没想到这么快就出问题了,更新完新闻源之后我右顺手把数码热榜的新闻也加上了,然后我就发现每天能获取到的新闻数量有点多,大概有30~40条,那么排序要安排上日程了,于是我加班加点写出来了一个排序算法,目前是会在发邮件前对昨天的新闻进行排序然后只选取前25条进行发送
排序算法
新闻的排序算法我大概想了好几种,一个就是按照评论数,另一个就是按照每条新闻下面有一个投票,会根据正向票和反向票来打分,这个分数也就代表了新闻的价值,虽然这个价值也是网友来评判的,不过我暂且相信网友的眼光。
为什么不用评论数呢,因为新闻并不是同一时间获取的,有早的有晚的,所以评论数并不是特别公平,当然我觉得新闻的评论数/发布时间这个数值也就是相对评论数应该还是很有参考价值的,后续我再观察一下。
如果说网友的评级和我差别较大那么我获取会改变成按照相对评论数来排序。
目前的原理部分就是分别进入每个新闻网站找到价值然后排序,再写回。
计划改动
虽然这次更新已经是挺大的更新了,但是我也会还是有一些想法想要实现,就先放在这里,如果你对哪一项感兴趣的话或者你有什么想法也可以在下面留言。
目前这个新闻列表模式对于订阅是很友好的,但是对于想自己部署的不是很友好,需要做一下兼容,没有新闻列表的就使用部署的模式
把新闻订阅网站重新设计一下
接入GPT对获取到的新闻总结归纳,做成推送的形式
做成多板块模式可以选择性订阅
提供RSS订阅源
……
新闻源:刚才我看了一下发现数码热榜的新闻也不错,更新速度应该会比日榜更快
排序:对每日新闻按照某种逻辑进行排序