カテゴリー
[Node.js] PuppeteerでAmazonアソシエイトのURL生成
※ 当ページには【広告/PR】を含む場合があります。
2020/12/02
https://www.amazon.co.jp/dp/B01AJ7DH9O/ref=as_li_ss_tl?ie=UTF8&linkCode=ll1&tag=hogepiyo000-11&linkId=0123456789abcdef0123456789abcdef&language=ja_JP
短縮URL
https://amzn.to/3fVmrD5
https://amazon.co.jp/dp/ASIN/ref=nosim?tag=あなたのアソシエイトID
Pupperteerの動作準備
shelljsとargparseのインストール
$ yarn add shelljs argparse -S
$ yarn add @types/shelljs @types/argparse -D
Amazonの商品ページ操作例① ~ 物販系
ASINコードの探し方
dp/
B08HQXVL9Y
https://amazon.co.jp/dp/B08HQXVL9Y
PuppeteerでAmazon商品タイトルを取得
https://amazon.co.jp/dp/B08HQXVL9Y
[検証]
id="productTitle"
#productTitle
$ tree -I node_modules
.
├── Dockerfile
├── docker-compose.yml
├── package.json
├── src
│ └── index.ts
├── tsconfig.json
└── yarn.lock
src/index.ts
import puppeteer from 'puppeteer';
import * as argparse from 'argparse';
import * as shell from 'shelljs';
(async () => {
//👇コマンドとして実行時に引数として設定される
const parser = new argparse.ArgumentParser({
description: 'Amazon Affiliate Link Generator'
});
parser.add_argument('-a', '--asin', {
type: 'str',
help: 'Targeted ASIN code what you want.'
});
const args_ = parser.parse_args();
//👇テキストや画像の一時保管先
// '/usr/src/app/tmp'というフォルダ内にリリースを保存
const _cwd = '/usr/src/app/tmp';
shell.rm('-rf', _cwd);
shell.mkdir(_cwd);
//👇シェルスクリプトでの echo '...文字列' > ${_cwd}/output.txt 相当
//shelljsを使うとテキストの保存もワンライナーで作成できる
//ちなみにAmazonアフィリエイトのユーザーIDは一例のためhoge000-00としています
shell.echo(`https://amazon.co.jp/dp/${args_.asin}/ref=nosim?tag=hoge000-00`).to(`${_cwd}/output.txt`);
const browser = await puppeteer.launch({
executablePath: '/usr/bin/chromium-browser',
args: ['--disable-dev-shm-usage', '--no-sandbox']
});
try {
const page = await browser.newPage();
await page.goto(`https://www.amazon.co.jp/dp/${args_.asin}`);
//👇①商品のタイトル要素を抽出
const title_ = await page.$eval('#productTitle', el => el.innerHTML);
//👇テキストファイルにタイトルを書き込み
//$ echo "${title_}" >> ${_cwd}/output.txt 相当のコマンド
shell.echo(`${title_}`.replace(/^\n/gm, '')).toEnd(`${_cwd}/output.txt`);
//👇②商品説明の要素を抽出
//コードは後述
//👇③価格情報の要素を抽出
//コードは後述
//👇④商品画像の習得
//コードは後述
} catch (e) {
throw e;
} finally {
await browser.close();
}
})();
#👇src/index.tsがビルドされる
$ yarn build
#👇-aもしくは--asinオプションに商品のASINコードを指定
$ yarn tap -a B08HQXVL9Y
tmp
output.txt
https://amazon.co.jp/dp/B08HQXVL9Y/ref=nosim?tag=hoge000-00
GOPPA ウェブカメラ オートフォーカス機能搭載 フルHD 200万画素 1920×1080対応 マイク内蔵 GP-UCAM2FA/E
PuppeteerでAmazon商品紹介を取得
$$
$$eval
evaluate + querySelectorALL
index.ts
//...中略
//👇②商品説明の要素を抽出
const feature_ = await page.$$eval('#feature-bullets > ul > li > span',
elms => elms.map(el => el.innerHTML)
);
for (const elm of feature_) {
shell.echo(`${elm}`.replace(/^\n/gm, '')).toEnd(`${_cwd}/output.txt`);
}
//...以下略
output.txt
https://amazon.co.jp/dp/B08HQXVL9Y/ref=nosim?tag=hoge000-00
GOPPA ウェブカメラ オートフォーカス機能搭載 フルHD 200万画素 1920×1080対応 マイク内蔵 GP-UCAM2FA/E
<span id="replacementPartsFitmentBulletInner"> <a class="a-link-normal hsx-rpp-fitment-focus" href="#">モデル番号を入力してください</a>
<span>これが適合するか確認:</span>
</span>
GOPPA製「GP-UCAM2FA」は、テレワークやビデオ配信に最適な200万画素WEBカメラです。オートフォーカスによる鮮明な映像、30FPSのなめらか動き、デジタルマイク内蔵など必要な機能をコンパクトに搭載していますので、ZoomやGoogle Meet、TeamsなどのWeb会議やオンライン飲み会でご利用いただけます。
有効画素数:有効画素数、色数:有効画素数、最大解像度:1920×1080、最大フレームレート:30 FPS
フォーカス:オートフォーカス、オートフォーカス:5cm〜∞、F値:F2.2、視野角度:75度
対応OS:Windows 10、Windows 8、Windows 7、macOS 10.12 Sierra 以降
保証期間:6か月
Puppeteerで商品の値段情報を取得
id="priceblock_ourprice"
id="price-shipping-message"
index.ts
//...中略
//👇③価格情報の要素を抽出
const price_ = await page.$eval('#priceblock_ourprice', el => el.innerHTML);
const shipment_ = await page.$eval('#price-shipping-message > b', el => el.innerHTML);
shell.echo(`${price_}`.replace(/^\n/gm, '') + ` ${shipment_}`).toEnd(`${_cwd}/output.txt`);
//...以下略
¥5,506 通常配送無料
Puppeteerで画像の取得
id="imgTagWrapperId"
//...中略
//👇④商品画像の習得
const imgUrl_ = await page.$eval('#imgTagWrapperId > img', el => el.getAttribute('src'));
shell.exec(`wget ${imgUrl_} -O ${_cwd}/amazon.jpg`);
//...以下略
Amazonの商品ページ操作例② ~ 電子書籍(Kindle)系
//...中略
//👇①商品のタイトル要素を抽出
const title_ = await page.$eval('#productTitle', el => el.innerHTML);
shell.echo(`${title_}`.replace(/^\n/gm, '')).toEnd(`${_cwd}/output.txt`);
//👇②商品説明の要素を抽出
const elementHandle: any = await page.$('#bookDesc_iframe_wrapper > iframe');
const frame = await elementHandle.contentFrame();
subtitleSelector = '#iframeContent';
await frame.waitForSelector(subtitleSelector);
const feature_ = await frame.$eval(subtitleSelector, (el: any) => el.innerHTML);
shell.echo(`${feature_}`.replace(/^\n/gm, '')).toEnd(`${_cwd}/output.txt`);
//👇③価格情報の要素を抽出
const price_ = await page.$eval('#tmmSwatches > ul > li:nth-child(1) > span > span:nth-child(1) > span > a', el => el.innerHTML);
shell.echo(`${price_}`.replace(/^\n/gm, '')).toEnd(`${_cwd}/output.txt`);
//👇④商品画像の習得
const imgUrl_ = await page.$eval('#ebooksImgBlkFront', el => el.getAttribute('src'));
shell.exec(`wget ${imgUrl_} -O ${_cwd}/amazon.jpg`);
//...以下略
②
contentFrame
waitForSelector
まとめ
関連書籍
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー