Github Actions运行代码并发布到Pages上

前文生成了python代码爬取豆瓣电影信息,得到静态页面,可以创建一个 GitHub Actions 工作流,自动运行 Python 脚本抓取数据,并生成 HTML 页面,然后将其部署到 GitHub Pages 上。

准备GitHub仓库

  • 创建一个新的 GitHub 仓库(如 douban-movies-nowplaying)。
  • 将之前的 Python 脚本保存为 main.py(确保它能正确生成 douban_hot_movies.html)。
  • 添加 requirements.txt 文件,列出依赖:
    1
    2
    requests
    beautifulsoup4

创建 GitHub Actions 工作流

在项目根目录创建 .github/workflows/deploy.yml,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
name: Deploy Douban Movies

on:
schedule:
- cron: '0 16 * * *' # 北京时间每天0点(UTC 16:00)
workflow_dispatch: # 允许手动触发
push:
branches: [ main ] # 推送时触发

jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: write # 必需:写入权限

steps:
# 步骤1:检出代码
- name: Checkout
uses: actions/checkout@v4

# 步骤2:设置Python环境
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.10"

# 步骤3:安装依赖
- name: Install dependencies
run: |
pip install -r requirements.txt
pip install pytz # 时区支持

# 步骤4:运行爬虫脚本(生成HTML)
- name: Generate HTML
run: python main.py

# 步骤5:部署到GitHub Pages
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./docs # 推荐使用子目录
publish_branch: gh-pages # 部署到gh-pages分支
force_orphan: true # 确保分支干净

建立gh-pages分支并修改文件生成路径

python脚本生成的html文件换到docs子目录下。
导入import os

1
2
3
4
def save_html(html_content, filename="docs/douban_movies.html"):
os.makedirs("docs", exist_ok=True)
with open(filename, "w", encoding="utf-8") as f:
f.write(html_content)

新建gh-pages分支。

启用 GitHub Pages

进入仓库的 Settings > Pages。
选择 部署来源 为 GitHub Actions。

手动触发首次运行

提交代码后,进入 Actions 标签页。
选择 Deploy Douban Movies 工作流,点击 Run workflow 手动触发。

访问生成的页面

工作流运行完成后,访问:
https://<GitHub用户名>.github.io/douban-movies-nowplaying/douban_hot_movies.html
示例(html文件名改成了index.html):
https://qs100371.vip/douban-movies-nowplaying/
最终效果:

  • 自动运行:每天更新豆瓣热映电影数据;
  • 自动部署:生成 HTML 并发布到 GitHub Pages;
  • 手动触发:可随时手动更新数据。

还有,数据生成时间是按utc得来的,和东8区差8个小时,ds也给出了修改方法。

1
2
3
4
5
6
7
from datetime import datetime
def get_beijing_time():
tz = pytz.timezone('Asia/Shanghai')
return datetime.now(tz).strftime('%Y-%m-%d %H:%M:%S')

# 在生成HTML时使用
update_time = get_beijing_time()

详细代码:qs100371/douban-movies-nowplaying