?抗战直播:以图文形式“直播”1931年9月18日至1945年9月2日抗日战争的日日夜夜?开源地址:https://github.com/kokohuang/WarOfResistanceLive欢迎star收藏一波?预览地址:https://kokohuang.github.io/WarOfResistanceLive前言在当下浮躁的互联网环境下,并不难做一件好事,但很难连续做8年,这是一件有意义的事。微博上就有这样一位博主。2012年7月7日至2020年9月2日,@战战直播以图文形式记录1937年7月7日至1945年9月中华民族全面抗战史1月2日,2980天不间断,以平均每天12篇,共35214篇。2020年9月18日7点07分,沉寂半个月的@战战直播恢复更新。他们将继续以图文形式记录从1931年9月18日到1937年7月7日这六年。抗战史.未来6年,他们已经在路上了。历史是不能忘记的。作为程序员,面对历史,我能做些什么?除了佩服@战战直播这么多年的坚持,我也想做一些力所能及的有意义的事情。在得到博主@战战直播的同意和支持后,抗日直播项目诞生了。WarOfResistanceLive(https://kokohuang.github.io/WarOfResistanceLive)是一个以图文形式“活”抗战历史从1931年9月18日到1945年9月2日的网站,每天更新历史的一些今天发生的重大历史事件。通过图文并茂的抗战内容,我们仿佛置身于从局部抗战到全面抗战,再从全面抗战到光复的14年。山山水水,与中国人民一起经历抗战的每一个日日夜夜。感受他们的屈辱和绝望,感受他们的荣耀和梦想。本项目主要由Python爬虫+Hexo+GithubActions持续集成服务组成,开源在GitHub上,部署在GithubPages上。目前包含以下功能:每天定时自动更新数据查看博主当前所有微博数据支持RSS订阅功能基于GithubActions的持续集成服务...项目结构如下:├──.github/workflows#工作流配置文件├──resources#微博数据├──site#网站源码└──spider#微博爬虫接下来简单介绍一下项目的一些核心逻辑和实现。Python爬虫本项目使用的爬虫是基于weibo-crawler项目(仅供研究使用)的精简修改实现,感谢作者dataabc。实现原理通过访问手机版微博,绕过其登录验证,可以查看博主的大部分微博数据,如:https://m.weibo.cn/u/2896390104通过开发者工具查看,即可通过json接口获取微博数据列表https://m.weibo.cn/api/container/getIndex:defget_json(self,params):"""获取网页中的json数据"""url='https://m.weibo.cn/api/container/getIndex?'r=requests.get(url,params=params,headers=self.headers,verify=False)returnr.json()如何使用和安装依赖:pip3install-rrequirements.txt使用:pythonweibo.py运行效果:注意速度太快容易被系统限制:可以通过加入随机等待逻辑降低被系统限制的风险;获取不到所有微博数据:可以添加cookie逻辑获取所有数据;更多详细信息,请参见微博爬虫。经过一番选择,Hexo最终选择了Hexo+Nexttheme作为本项目网站的框架。Hexo是一个基于Node.js的静态博客框架。它具有很少的依赖性,并且易于安装和使用。它可以轻松生成静态网页并将它们托管在GitHubPages上。还有丰富的主题可供选择。详细的Hexo安装和使用方法可以参考官方文档:https://hexo.io/zh-cn/docs/。那么,如何实现RSS订阅功能呢?得益于Hexo丰富的插件功能,hexo-generator-feed可以非常方便的帮我们实现。首先在博客根目录安装插件:$npminstallhexo-generator-feed--save然后在博客根目录的_config.yml文件中添加相关配置:feed:enable:true#是否启用插件type:atom#Feed类型,支持atom和rss2,默认atompath:atom.xml#生成文件路径limit:30#生成最大文章数,如果为0或false,所有文章都会生成content:true#如果为true则显示文章的所有内容content_limit:#文章显示的内容长度,只有当内容为false时才有效order_by:-date#按日期排序template:#自定义模板路径最后在主题RSS订阅入口根目录下的_config.yml文件中添加:menu:RSS:/atom.xml||fafa-rss#atom.xml文件路径地址和图标设置这样我们就可以给博客添加RSS订阅功能了。WarOfResistanceLive的订阅地址为:https://kokohuang.github.io/WarOfResistanceLive/atom.xml订阅效果如下:GithubActions持续集成GithubActions是Github于2018年10月推出的持续集成服务。在此之前,我们可能更多的使用TravisCI来实现持续集成服务。在我个人看来,GithubActions比TravisCI非常强大,可玩性也更高。GithubActions拥有丰富的动作市场。结合这些动作,我们可以轻松完成许多有趣的事情。下面我们来了解一下GithubActions的一些基本概念:workflow:工作流。即持续集成运行一次的过程。该文件存放在仓库的.github/workflows目录下,可以包含多个;职:任务。一个工作流可以包含一个或多个作业,代表一个集成的操作,可以完成一个或多个任务;步:步骤。一个作业由多个步骤组成,这些步骤代表完成一个任务所需要的步骤;行动:动作。每个步骤可以包含一个或多个动作,这意味着可以在一个步骤中执行多个动作。了解了GithubActions的这些基本概念之后,我们就来看看WarOfResistanceLive的持续集成服务是如何实现的。以下是本项目使用的工作流的完整实现:??#工作流名称:SpiderBot#设置时区env:TZ:Asia/Shanghai#设置工作流触发模式.on:#定时触发,每2小时更新一次between8:00-24:00(https://crontab.guru)#由于cron设置的时间是UTC时间,所以+8是北京时间schedule:-cron:"00-16/2***"#允许手动触发Actionsworkflow_dispatch:jobs:build:#使用ubuntu-latest作为运行环境runs-on:ubuntu-latest#要执行的任务序列步骤:#checkout仓库-name:CheckoutRepositoryuses:actions/checkout@v2#设置Python环境-name:SetupPythonuses:actions/setup-python@v2with:python-version:"3.x"#Cachepipdependencies-name:CachePipDependenciesid:pip-cacheuses:actions/cache@v2with:path:~/.cache/pipkey:${{runner.os}}-pip-${{hashFiles('./spider/requirements.txt')}}恢复键:|${{runner.os}}-pip-#安装pip依赖-name:Inst所有Pip依赖项工作目录:./spider运行:|python-mpipinstall--upgradepippipinstallflake8pytestif[-frequirements.txt];然后pipinstall-rrequirements.txt;fi#运行爬虫脚本-name:RunSpiderBotworking-directory:./spider#指定工作目录,只对运行命令有效run:pythonweibo.py#获取系统当前时间-name:GetCurrent日期id:daterun:echo"::set-outputname=date::$(date+'%Y-%m-%d%H:%M')"#Commitchanges-name:CommitChangesuses:EndBug/add-and-commit@v5with:author_name:KokoHuangauthor_email:huangjianke@vip.163.commessage:"最新数据已同步(${{steps.date.outputs.date}})"add:"./"env:GITHUB_TOKEN:${{secrets.GITHUB_TOKEN}}#Pushremote-name:PushChangesuses:ad-m/github-push-action@masterwith:branch:maingithub_token:${{secrets.GITHUB_TOKEN}}#设置Node.js环境-name:UseNode.js12.xuses:actions/setup-node@v1with:node-version:"12.x"#CacheNPMdependencies-name:CacheNPMDependenciesid:npm-cache使用:actions/cache@v2with:path:~/.npmkey:${{runner.os}}-node-${{hashFiles('./site/package-lock.json')}}恢复密钥:|${{runner.os}}-node-#InstallNPMdependencies-name:InstallNPMDependenciesworking-directory:./siterun:npminstall#BuildHexo-name:BuildHexoworking-directory:./site#指定工作目录,仅对运行命令有效run:npmrunbuild#PublishGithubPages-name:DeployGithubPagesuses:peaceiris/actions-gh-pages@v3with:github_token:${{secrets.GITHUB_TOKEN}}publish_dir:。/site/public#指定要发布的路径地址publish_branch:gh-pages#指定远程分支的名字执行效果图如下:工作流文件中有很多配置字段,在里面也有详细的注释配置文件接下来,我们主要看以下几个重要的配置:Workflowtriggermode#设置工作流触发模式。on:#定时触发,8:00-24:00每2小时更新一次(https://crontab.guru)#由于cron设置的时间为UTC时间,+8为北京时间schedule:-cron:"00-16/2***"#Allowmanualtriggerworkflowworkflow_dispatch:我们可以使用onworkflow语法将工作流配置为针对一个或多个事件运行。支持自动和手动触发。schedule事件允许我们在预定的时间触发工作流,我们可以使用POSIXcron语法来安排工作流在特定时间运行。定时任务语法有五个字段,用空格分隔,每个字段代表一个时间单位:┌────────────────分钟(0-59)│┌─────────────────小时(0-23)││┌────────────一个月中的第几天(1-31)│││┌──────────────────月份(1-12或JAN-DEC)││││┌──────────────星期几(0-6或SUN-SAT)│││││││││││││││*****我们还可以在这五个字段中使用以下运算符:运算符描述示例*任何值*每天每分钟运行,值列表分隔符2,104,5*在一天中的第4和第5小时的第2和第10分钟运行-值范围04-6*在第4、5、6小时的第0分钟运行/步长值20/15从Runevery15minutesfrom20minutesto59minutes(20,35and50minutes)我们可以使用https://crontab.guru生成crontab语法,你也可以查看更多crontabguru示例。此外,我们还可以通过配置workflow_dispatch和repository_dispatch字段来手动触发工作流。on字段也可以配置为push,即当仓库中有push操作时,会触发工作流的执行。详细的触发工作流配置请参考配置工作流事件。步骤顺序从配置文件中可以看出,项目的一次持续集成运行包括以下步骤:检出仓库-->搭建Python环境-->缓存pip依赖-->安装pip依赖-->运行爬虫脚本-->获取当前时间-->提交修改-->远程推送-->设置Node.js环境-->缓存NPM依赖-->安装NPM依赖-->构建Hexo-->发布GithubPages项目的工作流程主要有以下几点:运行环境:整个工作流程运行在虚拟环境ubuntu-latest。也可以指定其他虚拟环境,如WindowsServer、macOS等;缓存依赖:通过依赖缓存,可以提高安装相关依赖的速度。具体使用可以查看:缓存依赖,加快工作流程;获取当前时间:后续提交修改步骤中的commit消息用于获取本步骤中的当前时间,这里用到步骤上下文的相关概念。指定一个id,在后续的步骤中,我们可以使用steps.
