質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

565閲覧

puppeteerでヤフーニュースのリンク一覧を取得し、 連想配列に格納したい

RMBQsKe5AP10gjx

総合スコア24

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/05/12 14:15

編集2019/05/13 22:41

以下の条件でpuppeteerでヤフーニュースのリンク一覧を取得し、
連想配列に格納したいです。

・3ページ目まで
・外部サイトにはいかない
・既出のリンクは無視する

以下のコードを書いてみましたが、基準ページ以外も取得してしまいます。
大変恐縮ですが、改善方法をご教示願います。

const puppeteer = require("puppeteer"); var TARGET_URL = "ヤフーニュース" var datas = []; var items = {}; var r = 0; puppeteer.launch({ args:['--no-sandbox','--disable-gpu','--ignore-certificate-errors'], ignoreDefaultArgs: ['--disable-extentions'], ignoreHTTPSErrors: false, headless:false, slowMo :300 }).then(async browser => { try{ async function downloadRec(url,level,i){ const page = await browser.newPage(); await page.goto(url,{waitUntil:"domcontentloaded"}); console.log(url); //-----------------------リンク一覧を配列に入れる---------------------- let lists2 = await page.$$("a[href]"); for (let i = 0; i < lists2.length; i++) { //既出のサイトであれば無視 var removeDuplicates = function(object) { var result = [], comparisons = [], key, comparison; for (key in object) { comparison = JSON.stringify(object[key]); if (comparisons.indexOf(comparison) === -1) { result.push(object[key]); } comparisons.push(comparison); } return result; }; datas.push(await (await lists2[i].getProperty('href')).jsonValue()); result2 = await result[i].indexOf(TARGET_URL); //await console.log(result2); //外部サイトであれば無視 if (result2 != -1){ var result = removeDuplicates(datas); items[r] = result[i] ; r = r + 1; }; await console.log(items); }; await page.goto(url,{waitUntil:"domcontentloaded"}); await console.log(items[r]); await downloadRec(items[r+1],level+1,i+1); await console.log(downloadRec); }; //---------------------------------------------------------------------------- await downloadRec(TARGET_URL,0,0); }catch(e){ console.log("Error"); console.log(e); } });

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

コードがインデントされておらず読みづらかったり、
constとvarが混在しているなど問題が多いコードです。
こういうコードは読みづらく、バグを発生させやすいです。

問題が多く説明に時間がかかるので
ヒントだけ記載致します。

質問者様のスキルであれば
このヒントで解決に導けるはずです。

javascript

1const puppeteer = require('puppeteer'); 2const url = 'https://news.yahoo.co.jp/list/'; 3const LINK_LEVEL = 3; 4 5(async () => { 6 const browser = await puppeteer.launch(); 7 const page = await browser.newPage(); 8 9 for (var i = 1; i <= LINK_LEVEL; i++) { 10 await page.goto(`${url}?p=${i}`); 11 const links = await page.$$eval('.listArea > ul a[href]', links => { 12 return links.map(link => link.href); 13 }); 14 console.log(`${i}ページ目のリンク一覧`); 15 console.log(links.join('\n')); 16 } 17 await browser.close(); 18})();

投稿2019/05/12 15:14

yasutomi

総合スコア2937

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RMBQsKe5AP10gjx

2019/05/13 10:02

ありがとうございます。記事だけでなく、リンクも取得したいのですが、外部サイトに飛ばない方法を教えていただけないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問