0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[質問]jsで取得したデータをデータベースに保存する方法

Last updated at Posted at 2020-06-07

###前提・実現したいこと
・自身プログラミング経験が浅いため、お伝えする内容に不備や、漏れがあれば
ご指摘いただいても大丈夫です

###[実現したいこと]
・amazonの商品をスクレイピングで、家電の商品の価格を抽出した情報を
データベースを使用して保存したい

####発生している問題
####[現状]
・ターミナルにて、npm i puppeteer
puppeteerをインストール
・プロジェクトのディレクトリ内に、test.js

amazonのサイトまでは、いきデータは抽出できているかと
思うのですが、その先が、
どう対応すればいいのかわからず、進めることができません。

データベースは、MySQLを予定しております。

該当のソースコード

・test.js

const puppeteer = require("puppeteer");

(async () => {
    const browser = await puppeteer.launch({
        headless: false, // 動作確認するためheadlessモードにしない
        slowMo: 500, // 動作確認しやすいようにpuppeteerの操作を遅延させる
    });
    const page = await browser.newPage();

    //生活家電のページへ行く。
    await page.goto("https://www.amazon.co.jp/%E7%94%9F%E6%B4%BB%E5%AE%B6%E9%9B%BB/b?node=124048011", {
        waitUntil: "networkidle2",
    });

    //セレクターで指定したノードが表示されるまで待機

    await page.waitFor(".a-section.octopus-best-seller-card");

    //カテゴリーのリンクを取得(空調・季節家電、キッチン家電など)
    let category_urls = await page.evaluate((selector) => {
        let urls = [];
        document.querySelectorAll(selector).forEach((node, i) => {
            urls.push(node.href);
        });
        return urls;
    }, "a.octopus-pc-category-card-v2-category-link");
    console.log(category_urls);

    //上で取得したカテゴリーのURLの中から一つを選ぶ。
    let category_url = Math.floor(Math.random() * category_urls.length);
    category_url = category_urls[category_url];
    console.log(category_url);

    //カテゴリーのIDを取得
    let category_id = category_url.replace(/^.*node=/i, "").replace(/&.*/, "");
    console.log(category_id);

    //アマゾンおすすめ商品順
    let page_url = "https://www.amazon.co.jp/s?rh=n:" + category_id + "&s=featured-rank";

    //アマゾンおすすめ商品のページへいく。
    await page.goto(page_url, {
        waitUntil: "networkidle2",
    });

    //セレクターで指定したノードが表示されるまで待機。
    await page.waitFor("#search + *");

    //ページから商品の情報を取得。
    let items = await page.evaluate((selector) => {
       let data = [];
        document.querySelectorAll(selector).forEach((node, i) => {
            let obj = {};
            //商品のタイトルを取得
            let title = node.querySelector("a.a-text-normal span.a-text-normal");
            title = title.textContent.trim();
            obj.title = title;

            //商品の価格を取得
            let price = node.querySelector("span.a-price-whole") || node.querySelector("span.a-color-price");
            price = (price && price.textContent.trim()) || "";
            obj.price = price;

            //配列にタイトル、価格のデータを入れたオブジェクトを追加
            data.push(obj);
        });
    return data;
}, "div.s-result-list div[data-asin][data-uuid]");

//itemsは配列でitems[0].titleでタイトル、items[0].priceで値段を取得。
console.log(items);

//ブラウザを閉じる
await browser.close();
})()

####補足情報(ツールのバージョンなど)
・macOS Catalina バージョン10.15.3使用
・ターミナル使用
・VScode使用
・node.js v13.11.0
・npm 6.13.7

ご協力の程、お願い致します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?