You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Github Actions定时运行R爬虫并提交生成的CSV文件

问题诊断与修复方案

1 YAML配置问题修复

  • 缩进错误(致命问题):原配置中Commit files步骤的缩进层级错误,和autoscrape job平级,不属于steps下的执行步骤,导致工作流解析失败。需调整缩进和Scrape步骤对齐。
  • 运行器兼容性问题:windows-latest运行器对R环境、git命令的兼容性更差,且启动速度慢,建议替换为ubuntu-latest。
  • 路径不匹配问题:你在commit步骤指定git add data/*,但R脚本将csv文件写入仓库根目录,git找不到对应文件会导致commit失败。要么修改R脚本写入路径为data/Headlinks.csv,要么修改add命令为git add Headlinks.csv。
  • 空提交报错问题:如果某次运行没有产生文件改动,git commit会返回非0状态码导致工作流失败,需增加无改动跳过逻辑。
  • 包安装超时问题:tidyverse安装耗时长,默认CRAN源在海外容易超时,建议指定国内镜像,同时合并包安装命令减少执行步骤。
  • 权限配置问题:默认GITHUB_TOKEN只有仓库读权限,需要手动开启写权限:可以在仓库Settings > Actions > General > Workflow permissions中选择Read and write permissions,或者在YAML中增加权限声明。

2 R脚本问题修复

  • 表头重复问题:write.csv的append=TRUE参数会每次写入都插入表头,最终csv文件会存在大量重复表头行,需修改写入逻辑,仅在文件不存在时写入表头。
  • 网络容错问题:请求目标网站超时、被拦截时脚本会直接崩溃,建议增加异常捕获逻辑避免工作流失败。

3 修复后参考代码

修正后的YAML配置

name: Aljazeera_headlines_scraper

on:
  schedule:
    - cron:  '*/20 * * * 1-5'
  # 可选:添加手动触发方便测试
  workflow_dispatch:

permissions:
  contents: write

jobs: 
  autoscrape:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: r-lib/actions/setup-r@v2

    - name: Install packages
      run: |
        R -e 'install.packages(c("rvest", "tidyverse"), repos = "https://mirrors.tuna.tsinghua.edu.cn/CRAN/")'

    - name: Scrape
      run: Rscript Aljazeera_scraper.R
      
    - name: Commit files
      run: |
        git config --local user.name actions-user
        git config --local user.email "actions@github.com"
        git add Headlinks.csv
        git commit -am "GH ACTION Headlines $(date)" || echo "No changes to commit"
        git push origin main
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

修正后的R脚本

library(rvest)
library(tidyverse)

# 增加异常捕获
tryCatch({
  aljurl <- read_html("https://www.aljazeera.com/")
  
  headlinks <- aljurl %>% 
    html_nodes(".u-clickable-card__link") %>% 
    html_attr("href")
  
  links <- data.frame(
    date = Sys.Date(),
    headline_links = headlinks
  )
  
  # 避免重复写入表头,去掉行号
  write.table(links, 
              file = "Headlinks.csv", 
              append = TRUE, 
              sep = ",", 
              col.names = !file.exists("Headlinks.csv"), 
              row.names = FALSE,
              quote = FALSE)
}, error = function(e) {
  print(paste("Scrape failed:", e$message))
  quit(status = 0)
})

内容的提问来源于stack exchange,提问作者Ifeanyi Idiaye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:15:04