Help us understand the problem. What is going on with this article?

PuppeteerでCookieを使ってログインする方法

Slackのボットと様々なWebAPIを組み合わせて、Slack上から情報を得られるのは非常に便利です。
しかし、サービスによってはWebAPIがなくCookie認証が必要な場合があります。
そういったサービスにPuppetteerを使ってログインしてスクレイピングする方法について説明します。
細かい説明は省きますので、以下のサンプルコードを確認してください。

https://github.com/orange634nty/login-by-puppeteer

ログインしてCookieを取得する

まずはIDとパスワードを使ってログインしてCookieを取得します。
ここはログインするページに沿って適切に入力出来るように調節してください。

    const browser = await puppeteer.launch({headless: true});
    const page = await browser.newPage();

    // パスワードを使ってログイン
    await page.goto(LOGIN_URL, {waitUntil: 'domcontentloaded'});
    await page.type('input[name="user[email]"]', ACCOUNT_EMAIL);
    await page.type('input[name="user[password]"]', ACCOUNT_PASS);
    page.click('input[name="commit"]');
    await page.waitForNavigation({timeout: 60000, waitUntil: 'domcontentloaded'});

ログインが完了したら、Cookieをすべてjsonに変えてファイルに保存しましょう。

    // Cookieをローカルに保存
    const afterCookies = await page.cookies();
    fs.writeFileSync(COOKIES_PATH, JSON.stringify(afterCookies));

これでCookieが取得出来ました。

Cookieを利用してスクレイピングを行う

先ほど保存したCookieのファイルを利用して、ログインしてそのページの #title という要素の中の文字を取得しようと思います。

まずは先ほどのCookieを読み込みます。

  // ローカルのCookieを使ってログイン
  const cookies = JSON.parse(fs.readFileSync(COOKIES_PATH, 'utf-8'));
  for (let cookie of cookies) {
    await page.setCookie(cookie);
  }

そのあとは普通にスクレイピングすればOKです。

  // タイトルを取得
  await page.goto(url, {waitUntil: 'domcontentloaded'});
  let title = await page.$eval('#title', item => {
      return item.textContent;
  });

注意

当たり前ですが、スクレイピングする際は利用サイトの負荷をかけることになります。
なので、利用サービスの迷惑にならないように注意してください。
また、WebAPIが用意されているならそちらを利用した方がいいです。
サービスの方で適切に管理されているので安全に利用できます。

orange634nty
サーバーサイドプログラマーです。 仕事ではRuby使ってます。趣味ではC#書いてます。 最近はGCPとk8s気になってます。 でも、実際はUnityでゲーム作ってる時間が多いです。
http://orange634.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした