GitHub Actions + Selenium으로 스크래핑 정기 실행

GitHub Actions와 docker-selenium을 사용하여 정기적으로 스크래핑을 수행하는 방법을 소개합니다.

샘플 리포지토리 - 닛덴 고객 페이지에서 전력 사용량을 스크래핑하고 있습니다.

여기에서는 자세히 다루지 않지만,
  • GAS에서 Nature Remo API를 두드려 실온/습도/조명을 얻습니다
  • 전력 사용량 스크래핑
  • Google Spread Sheet에 각각 기록
  • Google Data Portal에서 시각화

  • 놀아 보았습니다.



    GitHub Actions



    구체적으로는 다음과 같은 YAML 파일을 준비합니다.

    .github/workflows/actions.yml
    on:
      schedule:
      - cron: 0 0 * * *
    jobs:
      scraping:
        runs-on: ubuntu-latest
        services:
          selenium:
            image: selenium/standalone-chrome:3.141.59-vanadium
            ports:
              - 4444:4444
            volumes:
              - /dev/shm:/dev/shm
        steps:
        - uses: actions/checkout@v1
        - name: execute
          run: ...
    

    설명


    - on:
      schedule:
      - cron: 0 0 * * *
    
    on 에서 워크플로를 시작할 이벤트를 지정합니다. 정기 실행시키고 싶기 때문에, schedule 로서 cron 형식으로 기동 시각을 지정합니다. 타임 존은 UTC 같기 때문에 주의가 필요합니다.
    runs-on: ubuntu-latest
    
    runs-on 에서 작업을 실행할 가상 머신 유형을 지정합니다. Docker 컨테이너를 사용하는 경우 Linux여야 하는 것 같습니다.
    services:
      selenium:
       image: selenium/standalone-chrome:3.141.59-vanadium
       ports:
         - 4444:4444
       volumes:
         - /dev/shm:/dev/shm
    
    services 에서 서비스를 호스팅하는 컨테이너를 정의할 수 있습니다. 여기서는 Selenium을 실행하기 위해 selenium/standalone-chrome를 서비스로 정의합니다.

    포트와 볼륨 설정은 selenium/standalone-chrome기본 시작 방법 을 그대로 사용하고 있습니다.
    steps:
      - uses: actions/checkout@v1
      - name: execute
        run: ...
    
    steps 에 실제로 실행하고 싶은 스크립트들을 정의해 갑니다. uses: actions/checkout@v1 는 공용 동작으로 소스 코드를 워크플로에 복사합니다.
    run: ... 로 스크래핑할 프로그램을 시작합니다. 구체적으로는 run: ruby main.rb 등.

    이 파일을 준비해 두는 것만으로 나머지는 마음대로 정기 실행해 줍니다만, 테스트로 실행하는 방법이 보이지 않았습니다. . 어쩔 수 없이 cron에서 최근 시간을 지정하여 동작 확인했습니다.

    Badges



    README에 붙이는 배지도 있습니다.
    [![Actions Status](https://github.com/{owner}/{repo}/workflows/{workflow_name}/badge.svg)](https://github.com/{owner}/{repo}/actions)
    
    workflow_name 는 파일 이름이 아니라 워크플로에 지정한 이름입니다. (위의 설명에서는 생략하고 있습니다만, 샘플 리포지토리에 있는 파일로 하면(자) 1 행째의 name: scraping electric power consumption 입니다. 스페이스는 %20 (으)로 할 필요가 있습니다.)

    스크래핑하는 프로그램



    서비스로서 시작한 selenium/standalone-chrome 위에서 Selenium 를 움직이므로, driver 의 생성 방법이 로컬로 움직이는 경우와 다릅니다.

    구체적으로는 ( Ruby 의 경우)
    driver = Selenium::WebDriver.for :remote, desired_capabilities: :chrome
    

    결론



    스스로 손을 움직여 만져 보는 것으로, 「빽빽하게 부풀려 완전히 이해한」상태가 되었습니다.

    평소에는 GitLab CI를 만지고 있으므로, 명시적으로 checkout 하지 않으면 안되는 곳이라든지 조금 귀찮게 느껴 버렸습니다.

    GitHub Actions의 향후 기대.

    참고


  • GitHub Help
  • 좋은 웹페이지 즐겨찾기