人とノードを用いたWikipediaデータのデータ収集



イントロ
この記事では、我々はPoppeteerとノードを使用してCovid - 19データを使用してWikipediaのテーブルをこすって通過します.私がこのプロジェクトのために使用したオリジナル記事はhereにあります.
私は、以前ウェブサイトを決してこすりませんでした.私はいつもそれをするのが嫌なこととして見た.しかし、この小さなプロジェクトを通過した後、私はこのようなものの値を見ることができます.データは見つけるのが難しいです、そして、あなたがそれのためにウェブサイトをscrapeすることができるならば、私の意見で、どうしても、それをしてください.

セットアップ
このプロジェクトの設定は非常に簡単だった.あなたがしなければならないのは、Pumpeteerを242479142コマンドでインストールすることです.しかし、セットアップ中に混乱した問題がありました.私が最初にそれをインストールしたとき、Puppeteerパッケージは正しく解凍されませんでした.記事の最初の例を実行している間、私はこれを見つけました.npm install puppeteerなどのようなエラーが発生した場合は、次の手順に従います.
  • からFailed to launch browser processからchrome-winを解凍します
  • それから、
  • フォルダをその242479142フォルダのnode_modules/puppeteer/.local-chromium/フォルダに加えてください.
  • win64がこの経路.local-chromiumにあることを確認します
  • これは特にWindows用です.Macは似ているかもしれませんが、確実ではありません.
  • ここに私に答えにつながるlinkです.すべてが適切に機能していることを確認することに関係なく、これをするのは良い考えであるかもしれません.

    暗号
    私は既存のコードにいくつかの小さな変更をしなければなりませんでした.

    最初の例
    最初の例は私には効かなかった.この問題を解決するために、変数にasync関数を割り当て、関数の後に変数を呼び出した.私はこれが問題を処理する最もよい方法であると確信しません、しかし、ちょっと、それは働きます.以下がコードです.
    const puppeteer = require('puppeteer');
    
    const takeScreenShot = async () => {
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        await page.goto('https://www.stem-effect.com/');
        await page.screenshot({path: 'output.png'});
    
        await browser.close();
    };
    
    takeScreenShot();
    

    ウィキペディア
    私もWikipediaスクレーパーコードで問題を抱えました.何らかの理由で、私は国の名前のヌル値を取得していた.これは私が作成していたJSONファイルに私のすべてのデータをねじ込んだ.
    また、スクレーパーはWikipediaページの上のあらゆるテーブルを『こすり落としていました』.私はそれが欲しくなかった.私はCOVID - 19に起因するケースと死の総数で最初のテーブルが欲しかっただけです.以下に使用する修正コードを示します.
    const puppeteer = require('puppeteer');
    const fs = require('fs')
    
    const scrape = async () =>{
        const browser = await puppeteer.launch({headless : false}); //browser initiate
        const page = await browser.newPage();  // opening a new blank page
        await page.goto('https://en.wikipedia.org/wiki/2019%E2%80%9320_coronavirus_pandemic_by_country_and_territory', {waitUntil : 'domcontentloaded'}) // navigate to url and wait until page loads completely
    
        // Selected table by aria-label instead of div id
        const recordList = await page.$$eval('[aria-label="COVID-19 pandemic by country and territory table"] table#thetable tbody tr',(trows)=>{
            let rowList = []    
            trows.forEach(row => {
                    let record = {'country' : '','cases' :'', 'death' : '', 'recovered':''}
                    record.country = row.querySelector('a').innerText; // (tr < th < a) anchor tag text contains country name
                    const tdList = Array.from(row.querySelectorAll('td'), column => column.innerText); // getting textvalue of each column of a row and adding them to a list.
                    record.cases = tdList[0];        
                    record.death = tdList[1];       
                    record.recovered = tdList[2];   
                    if(tdList.length >= 3){         
                        rowList.push(record)
                    }
                });
            return rowList;
        })
        console.log(recordList)
        // Commented out screen shot here
        // await page.screenshot({ path: 'screenshots/wikipedia.png' }); //screenshot 
        browser.close();
    
        // Store output
        fs.writeFile('covid-19.json',JSON.stringify(recordList, null, 2),(err)=>{
            if(err){console.log(err)}
            else{console.log('Saved Successfully!')}
        })
    };
    scrape();
    
    私が作った微妙な変更についてのコメントを書きましたが、ここで説明します.
    最初に、私がchrome.exeによって使いたかったテーブルを特定する代わりに、私はアリアラベルでテーブルを特定しました.これはもう少し正確でした.もともと、コードがページ上のすべてのテーブルをこすっていたのは、IDが同じだったからです(私は知っています.良い練習ではありません.アリアラベルを通してテーブルを特定するのは、少なくともこのシナリオで私が欲しかった正確なテーブルをこすっただけであることを確実とするのを助けました.
    次に、スクリーンショットコマンドをコメントアウトしました.それは何らかの理由でコードを壊しました、そして、我々がちょうどテーブルデータからJSONオブジェクトを作成しようとしているならば、私はそれの必要性を見ませんでした.
    最後に、正しいテーブルからデータを取得した後、実際にチャートで使用したいと思った.私はHTMLファイルを作成し、データをGoogleチャートを使用して表示します.あなたが好奇心旺盛なら私のGithubの完全なプロジェクトを見ることができます.公正な警告、私はダウンして、この部分を一緒に入れて汚れて(非常にハッキー)が、その日の終わりに、私はちょうど私のために採掘したデータを消費するより簡単な方法を望んだ.私のHTMLページで行うことができるリファクタリングの量についての全記事があります.

    結論
    このプロジェクトは本当に楽しかったです.一緒にそれを置くために著者、モヒットマイタニに感謝します.それは、ウェブ掻き取りの世界と可能性の全く新しい領域に私の目を開けました!高いレベルでは、Webスクレーピングは、どこからでもデータを取得することができます.
    私の好きなYoutubersのように、ベンSullinsは言うことが好きです.
    愛y ' all.ハッピーコーディング!