puppeteer でリンク遷移する
前回は、puppeteer でトップページの画像を保存しました。
今回は、リンク遷移させたいと思います。例えば、このサイトのトップの「ラズパイで遊ぼう!」リンクから辿り、「RTL-SDR 用 FM ラジオフロントエンド」のページを開かせてみたいと思います。
単純にページ遷移するだけなら、page.goto('URL’) でいいのですが、例えば、このサイトの「ラズパイでエロゲ」のページは、同じリンクで違う内容を返すように作ってあるので単純なページ遷移ではありません。きちんとリンクを辿らなければ、正しいページの内容が表示されないように作ってあります。
puppeteer でリンク操作をやってみました。このサイトの「ラズパイで遊ぼう!」->「ソフトウェア」->「RTL-SDR 用 FM ラジオフロントエンド」と辿っていき、最後のページのスクリーンショットを撮ります。次のような内容になりました。
#!/usr/bin/node const puppeteer = require("puppeteer-core"); const URL = "https://sirius10.net/"; // この順番でリンクをクリックしていく const link_text = [ "ラズパイで遊ぼう!", "ソフトウェア", "RTL-SDR 用 FM ラジオフロントエンド" ]; (async () => { console.log("*** Start ***"); console.log("Chromium 起動"); const browser = await puppeteer.launch({ headless: false, slowMo: 50, executablePath: "/usr/bin/chromium-browser" }); console.log("新しいタブ"); const page = await browser.newPage(); console.log("ビューポート/デバイス設定"); await page.setViewport({ width: 1024, height: 1997 }); console.log("sirius10 へ移動"); await page.goto(URL); console.log("リンクをたどる"); for( let i = 0; i < link_text.length; i++ ) { // a タグの中で指定したテキストを持つ要素を求める。 let aTags = await page.$x('//a[contains(text(), "' + link_text[i] + '")]''); if( aTags.length == 0 ) { console.log('"' + link_text[i] + '" リンクが見つかりません'); continue; } console.log(link_text[i] + "をクリック"); await aTags[0].click(); await page.waitForNavigation(); } console.log("スクリーンショットを test2.png に保存"); await page.screenshot({ path: "test2.png", fullPage: true }); console.log("Chromium 終了"); await browser.close(); console.log("*** End ***"); })();
link_text 配列の順番にリンクをクリックしていきます。await page.$x('//a[contains(text(), “' + link_text[i] + '")]") はページ内の a タグ要素の中で、テキストに link_text[i] がある要素の配列を返します。見つかれば、その要素をクリックします。
クリックは、見つけた要素.click() で行います。page.waitForNavigation() はページがロードされるのを待ちます。
以上を link_text の順番に繰り返し、最後にスクリーンショットを撮ります。

試してみたら、「ラズパイでエロゲ」の年齢確認も大丈夫でした。スクリーンショットを目的としないなら、十分使えそうです。
ディスカッション
コメント一覧
まだ、コメントがありません