「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 조작 자동 처리 프로그래밍」의 움직이지 않는 샘플 코드③
Reference
이 문제에 관하여(「Puppeteer 입문 스크래핑+Web 조작 자동 처리 프로그래밍」이 움직이지 않는 샘플 코드②), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/atomyah/items/51b157f493142a7d1f09
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
/// 修正日(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();
})();
Reference
이 문제에 관하여(「Puppeteer 입문 스크래핑+Web 조작 자동 처리 프로그래밍」이 움직이지 않는 샘플 코드②), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/atomyah/items/51b157f493142a7d1f09텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)