NodeRED에서 모두 사랑하는 IGR 시간표 스크래핑

이와테 현립 대학 어드벤트 캘린더이므로 이와테 같은 재료로합니다.

최근 NodeRED (enebular)를 자주 사용하기 때문에 공부가 테라 스크래핑에 도전합니다.

@omega999 군의 모두가 사랑하는 IGR 시간표를 스크래핑 의 기사 인스파이어입니다.

IGR



모두가 좋아, 이와테 은하철도 네요.



이번에는 타키자와 역의 시각표를 꺼내 보겠습니다. h tp // w w. 이 gr. jp / wp / 치메타 b / 타키자와



최종적으로 이런 JSON으로 출력해 API화합니다.



enebular에서 스크래핑 챌린지



우선 그대로 HTML 리소스 취득



  • http in
  • http request
  • http response
  • debug

  • 의 각 노드를 연결합니다.


    http requestノード 의 URL에 이번 엔드 포인트가 되는 타키자와역의 시간표 페이지 http://www.igr.jp/wp/timetable/takizawa 를 지정합니다.

    배포하고 URL에 액세스하여 디버그 콘솔을 확인합니다.



    제대로 잡히네요.

    이것을 사용자 정의해 봅시다.

    html 노드 사용



    다른 좋은 방법이 있을지도 모릅니다만, html 노드를 사용하면 HTML로부터 CSS 셀렉터를 사용해 요소를 꺼낼 수 있는 모양.
    편리하자.



    그래서 사용해 보겠습니다.

    조사한 바 class="post" 의 p요소에 시간표가 들어 있는 모양입니다.



    이런 느낌으로 설정해주면 그와 같은 시간표를 얻을 수 있었습니다.
  • 추출할 요소: .post p
  • 출력 : 요소 텍스트 만, 요소 당 여러 메시지



  • p 요소가 배열로 취득할 수 있는 이미지입니다.

    Switch 노드로 필터링



    현대생이 자주 사용하는 타키자와역에서 모리오카역 방면으로의 전철(오르막)을 좁힙니다.

    Switch 노드에서 盛岡라는 단어가 포함된 요소를 필터링합니다.
  • contains: 盛岡



  • function 노드에서 json으로 성형



    마지막으로 function 노드를 사이에 두고 JavaScript를 작성합니다. 마지막은 http out의 노드에 연결하면 JSON 출력됩니다.


    const tmp = msg.payload.match(/(.*) (.*)/g); // 6:16 盛岡の形式を取得
    
    let content = [];
    for(let i = 0,len = tmp.length; i<len; i++){
        const item = tmp[i].split(' ');
        content.push({
            time: item[0],
            destination: item[1]
        })
    }
    
    msg.payload = {
        title: '滝沢駅上り',
        items: content
    }
    return msg;
    
    msg.payload.match(/(.*) (.*)/g); 의 개소에서 정규 표현으로 매치한 시각 정보를 배열로서 취해 오고, for문의 개소에서 json에 정형하고 있습니다.

    결과



    사용성이 좋은지 모르지만 JSON 출력할 수 있었습니다.



    요약



    function 노드를 사용하지 않고 기존 노드를 구사하고 싶었지만 NodeRED 힘이 너무 많아 한계를 느꼈습니다.

    더 스마트하게 할 수 있는 방법이 생각나는 사람이 있으면 꼭 가르쳐 주세요!

    좋은 웹페이지 즐겨찾기