【node.js】Qiitaの組織一覧をスクレイピングで取得【puppeteer】

puppeteerを使ってQiitaの組織一覧を取得する

qiitaAPIでorganization listを引っこ抜けるかなと思ったのですが、そんなAPIは無さそうなのでpuppeteerを使ってスクレイピングで取得しました。

https://qiita.com/organizations

コード

(async function() {
    const puppeteer = require('puppeteer')
    const startDiv = 2
    const organizationPerPage = 20
    let organizationList = []
    const browser = await puppeteer.launch({
        headless: true,
        slowMo: 50
    })
    const page = await browser.newPage()
    await page.goto('https://qiita.com/organizations')
    const pagination = await page.$x('/html/body/div[1]/div[3]/div[2]/div/div[1]/div/div[22]/ul/li[1]')
    const paginationMaxTypeString = await (await pagination[0].getProperty('textContent')).jsonValue() // ここ正規表現にしたいけど後で考える
    const paginationMax = paginationMaxTypeString.slice(-2) // 画面下部のページネーションからページ数を取得
    for ( let startPage = 0; startPage < paginationMax; startPage ++) {
      for (let divNumber = startDiv; divNumber < organizationPerPage; divNumber++ ) {
        await page.waitForXPath(`/html/body/div[1]/div[3]/div[2]/div/div[1]/div/div[${divNumber}]/div[2]/strong`)
        const target = await page.$x(`/html/body/div[1]/div[3]/div[2]/div/div[1]/div/div[${divNumber}]/div[2]/strong`)
        const value = await (await target[0].getProperty('textContent')).jsonValue()
        organizationList.push(value)
      }
    }
    await browser.close()
    console.log(organizationList)
  }
)()

github:https://github.com/Yishida05/organizationScraping

一応わかりにくそうな部分はコメントをつけてありますが少し補足

    const browser = await puppeteer.launch({
        headless: true,
        slowMo: 50
    })

ここでpuppeteerの起動オプションが選べるのですが気になった値を紹介
・slowMo
 これは動作の速度になっていて、例えばクリック⇛クリックの間隔を選べます。50だと50msつまり0.05秒の待ちが入ります。
(読み込みが遅い場合とかに使えるとは思うのですが、厳密に行うのであれば
await page.waitForXXXなどで、どこのボタンが表示されるまで待つなどの操作を行うほうが確実です。)
・executablePath
 これは実行時にChromeを起動するのですが、どこに存在するChromeなのかを指定できます。lambdaやfargateを利用して起動する場合などはChromeが見つからないことがあるので executablePathを指定してあげる必要があります。

コード的にはこんな感じで配列にして出力するようにしています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です