GASによるTwitterへの定期自動投稿を作る Vol.3 〜自分のnote記事リストを作る①〜
こんにちは!KCompany代表のケータです!
前回↓の続きです!
自動投稿では、これまでのnoteの自分の記事を定期的にシェアするようにしたいと思っています。ところが、お陰様で(?)すでに50記事ほどあり、逐一タイトルとリンクをまとめるのは面倒だなと。ちょっと探したのですが、自動で抽出するようなツールはなさそうだったので、せっかくなので自作してみようということで作ってみました。
Node.js(puppeteer)によるスクレイピング
数年前にpythonでスクレイピングしたこともあったのですが、GASメインでやってるところもありNode.jsでやってみようと思いました。
調べたらpuppeteerというのが最近は主流だということで、こちらを使ってみることにしました。
とりあえず結論ですが、今回は下記のコードを動かしました。
const puppeteer = require('puppeteer');
const main = async () => {
const browser = await puppeteer.launch({
headless: false,
slowMo: 250,
defaultViewport: null
});
let page = await browser.newPage();
await page.goto('https://note.com/workstream');
// title, linkを取得する
const h3s = await page.$$('h3');
console.log("h3s length " + h3s.length);
for (let i = 0; i < h3s.length; i++){
const h3 = h3s[i];
const title = await page.evaluate(el => el.innerText, h3);
const n = i+1;
const target = '#__layout > div > div:nth-child(1) > main > div > div > div > div > div > section:nth-child('+n+') > div > div.renewal-l-main > div > div.renewal-c-card__body > div.renewal-p-cardItem > h3 > a';
const links = await page.$$eval(target, links => {
return links.map(link => link.href);
});
console.log(title + ' ' + links);
}
browser.close();
}
main();
そして、以下のタイトルとリンクを取得することに成功しました!
ところが、これだと数件しか取得することができません。下記にアクセスするとわかるのですが、ページ下部には「もっとみる」ボタンがあり、こちらを読み込まないとそれ以上のページ取得できないと推測されます。
で、これを解消するコードをいま試しているのですが、タイムアウトやらそれを解消しようとすると時間がかかったりしてしまい、目下調整中です。
流れでpuppeteerをさわってみましたが、クローリングも色々楽しそうですね。今回参考にさせて頂いたサイトを列挙して本日は終わりたいと思います。
参考
【お仕事のご依頼について】
こちらの記事に記載した内容以外にも、Google Apps Script開発やGoogle Workspaceを活用したデジタル化推進のお仕事を行っています。【GAS】そのまま使えるシリーズのカスタマイズのご相談ももちろん大丈夫です。
ちょっとしたお困りごとでも、こちらのサイトのお問い合わせフォームからご連絡いただければ、折り返しご連絡いたします。
よろしければサポートをお願いします!いただいたサポートは、サービス開発・改善のために使わせていただきます。主に書籍代や勉強会の参加費用などを想定しています。よろしくお願いします。