「Puppeteer 입문 스크래핑+Web 조작 자동 처리 프로그래밍」이 움직이지 않는 샘플 코드②

「Puppeteer 입문 스크래핑+Web 조작 자동 처리 프로그래밍」이 움직이지 않는 샘플 코드②



「Puppeteer 입문 스크래핑+Web 조작 자동 처리 프로그래밍」을 구입해, 지금 공부중입니다.
이것 ↓
Puppeteer 입문 스크래핑 + 웹 조작 자동 처리 프로그래밍
움직이지 않는 몇 가지 샘플 코드가 있습니다. 나중에 사용할 수있는 코드는 모처럼이므로 수정하고 남겨두려고 생각했습니다. 우선 puppeteer에 대해서 「Puppeteer 입문 스크래핑+Web 조작 자동 처리 프로그래밍」이 움직이지 않는 샘플 코드① 의 「먼저 puppeteer에 대해」 항목을 봐 주세요.

7장의 3, 「블로그를 PDF로 백업한다」

이 샘플도, 아메브로가 백업에 대응하고 있지 않기 때문에 사용할 수 있을 것 같습니다.
하지만 아무래도 do { 処理 } while(true) 안에 await Promise.all([ 処理 ]); 가 있고, 그 안에 page.click() 가 있으면 도중에 멈췄습니다.

와타시만?
만약 와타시만이라면 본 기사는 스루 해 주세요.

수정 개소는///---수정---///의 행, 2개소만입니다.
/// 修正日(2019年2月11日)修正箇所は'///--修正--///'の行です
const puppeteer = require('puppeteer');
const converter = require('convert-filename-ja');
const path = require('path');
const delay = require('delay');

/**
 * メインロジック.
 */
(async () => {
  // Puppeteerの起動.
  const browser = await puppeteer.launch({
    headless: true, // true: Headlessモードで起動する.
    slowMo: 50, // 指定のミリ秒スローモーションで実行する.
  });

  // 新しい空のページを開く.
  const page = await browser.newPage();

  // view portの設定.
  await page.setViewport({
    width: 1200,
    height: 800,
  });

  // ページの遷移.
  console.log('----------------------------------------goto');
  await page.goto('http://ryoichi0102.hatenablog.com/');

  await delay(1000); // スクレイピングする際にはアクセス間隔を1秒あける.

  // 先頭の記事のurlを取得し、そのurlへ遷移.
  console.log('----------------------------------------goto');
  const firstPage = await page.evaluate(() => document.querySelector('#main article:nth-child(1) h1.entry-title a').href);
  // const firstPage = 'http://ryoichi0102.hatenablog.com/entry/2013/06/28/131913';
  await page.goto(firstPage);

  await delay(1000); // スクレイピングする際にはアクセス間隔を1秒あける.

  // 各記事に対してのそれぞれの処理.
  do {
    console.log('----------------------------------------do');

    // 投稿日を取得.
    const entryDate = await page.evaluate(() => document.querySelector('.entry-date').textContent.trim());
    // 投稿タイトルを取得.
    const titleText = await page.evaluate(() => document.querySelector('h1.entry-title').textContent.trim());
    // ファイル名として保存できるよう変換.
    const filename = converter.convert(`${entryDate}-${titleText}`);
    console.log('ファイル名は、' + filename);

    // 保存先のパス/ファイル名を保持し、pdfに保存.
    const filepath = path.join(__dirname, filename);
    // await page.screenshot({ path: `${filepath}.png` });
    await page.pdf({ path: `${filepath}.pdf`, format: 'A4' });

    console.log('----------------------------------------eval next');
    // 最後の記事までたどると次へボタンは表示されないので、その場合はループを抜ける.

    ///---修正---/// const next = await page.evaluate(() => document.querySelector('a[rel="next"]'));
    const next = await page.evaluate(() => document.querySelector('a[rel="next"]').href);
    console.log('--------------------------------------nextのhrefは、' + next);

    if (next === null) {
      break;
    }
    console.log('----------------------------------------was not break');

    // process.on('unhandledRejection', console.dir); // Promise内の捕捉されなかった例外について表示する


    // 次のページを読み込む.
    console.log('----------------------------------------next');

    await Promise.all([
      console.log('----------------------------------------inside promise.all'),
      page.waitForNavigation({ waitUntil: 'load' }),
    ///---修正---///   page.click('a[rel="next"]'),
      page.goto(next),
    ]);


    await delay(1000); // スクレイピングする際にはアクセス間隔を1秒あける.
  } while (true);

  // ブラウザの終了.
  console.log('----------------------------------------close');
  await browser.close();
})();

[수정 개소 1]

const next에, 셀렉터 오브젝트 '(a[rel="next"])'를 대입하는 것이 아니라, 그 href 속성(링크처 URL)을 대입.

const next = await page.evaluate(() => document.querySelector('a[rel="next"]')));
const next = await page.evaluate(() => document.querySelector('a[rel="next"]').href);

[수정 개소 2]

그리고 Promise.all에서 page.click() 대신 page.goto()를 사용합니다.
입니다.

그 밖에도 여러가지 시행착오했습니다만, 이것이 가장 정말로 잘 잘 갔습니다.
이유는 잘 모르겠습니다.

와타시의 환경은 ubuntu18.04(x86_64), node version 11.8.0, puppeteer:1.12.2, Chromium Version:73.0.3679.0 (Developer Build) (64-bit), 메모리 8GB입니다.

안내외 이런 곳에 원인이 있거나 할지도 모릅니다만 검증하지 않습니다. Puppeteer just hangs with default Chrome installation

이쪽도 같은 문제입니다↓
「Puppeteer 입문 스크래핑+Web 조작 자동 처리 프로그래밍」의 움직이지 않는 샘플 코드③

좋은 웹페이지 즐겨찾기