Nodejs와 Puppeteer로 축구 데이터 스크랩하기

10064 단어 scrapingsportsnode
저는 최근 스포츠 데이터, 특히 축구 데이터가 필요한 상황이었습니다. 몇 가지 초기 문제를 극복해야 했기 때문에 이 게시물을 작성하고 있습니다. 나를 해결책으로 이끄는 내 생각과 길을 따라갈 수 있어야 합니다.

이 튜토리얼을 위해 나는 많은 리그를 제공하고 경기와 라이브 경기를 다루는 웹사이트 fleshscore.com을 발견했습니다.

다음 기본 스크립트로 시작했습니다.

const axios = require('axios');
    //performing a GET request
axios.get('https://www.flashscore.com/')
    .then(response => {

    //handling the success
    const html = response.data;
    console.log(response.data);
})
//handling error
.catch( error => {
  console.log(error);
});

스크립트에서 반환되는 내용을 조사하기 위해 반환된 모든 콘텐츠를 test.html 파일로 전달했습니다.

node scraper.js > test.html

내 브라우저에서 HTML 파일을 연 후, 원래 웹사이트에 표시된 모든 경기 정보가 누락되었음을 금방 깨달았습니다. 콘텐츠가 자바스크립트에 의해 렌더링될 것으로 예상했기 때문에 이는 그리 놀라운 일이 아닙니다.

위의 스크립트는 nodejs로 작성되었으므로 headless Chrome 또는 Chromium을 제어하기 위한 고수준 API를 제공하는 노드 라이브러리인 puppeteer를 가지고 놀기 시작했습니다.

얼마 후, 나는 다음과 같은 코드 조각으로 끝났습니다.

const puppeteer = require ('puppeteer');

//initiating Puppeteer
puppeteer
    .launch ()
    .then (async browser => {

        //opening a new page and navigating to Fleshscore
        const page = await browser.newPage ();
        await page.goto ('https://www.flashscore.com/');
        await page.waitForSelector ('body');

        //manipulating the page's content
        let grabMatches = await page.evaluate (() => {
        let allLiveMatches = document.body.querySelectorAll ('.event__match--oneLine');

        //storing the post items in an array then selecting for retrieving content
        scrapeItems = [];
        allLiveMatches.forEach (item => {

            let postDescription = '';
                try {
                    let homeTeam = item.querySelector ('.event__participant--home').innerText;
                    let awayTeam = item.querySelector ('.event__participant--away').innerText;
                    let currentHomeScore = item.querySelector('.event__scores.fontBold span:nth-of-type(1)').innerText;
                    let currentAwayScore = item.querySelector('.event__scores.fontBold span:nth-of-type(2)').innerText;
                    scrapeItems.push ({
                        homeTeam: homeTeam,
                        awayTeam: awayTeam,
                        currentHomeScore: currentHomeScore,
                        currentAwayScore: currentAwayScore,
                    });
                } catch (err) {}

            });
            let items = {
                "liveMatches": scrapeItems,
            };
            return items;
        });
        //outputting the scraped data
        console.log (grabMatches);
        //closing the browser
        await browser.close ();
    })
    //handling any errors
    .catch (function (err) {
        console.error (err);
    });

이제 다음 명령을 사용하여 스크립트를 다시 실행했습니다.

node scraper.js



보시다시피 아름다운 JSON 데이터 목록을 검색했습니다.
물론 이제 리그, 국가 등으로 데이터를 정렬하는 데 사용할 수 있는 많은 작업이 있습니다.

내 사용 사례에는 이 스니펫으로 충분했습니다. 보다 심각한 스크래핑을 목표로 하는 경우 일반 스포츠 또는 축구 API(예: sportdataapi.com , xmlsoccer.com )를 선택하는 것이 좋습니다.

해피 스크래핑 :-)

좋은 웹페이지 즐겨찾기