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を指定してあげる必要があります。

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