こんにちは。
株式会社エス・スリーのスタッフです。
前回、楽天市場の商品レビューを取得する方法に目途が立ったところまで書きました。
今回は、実際に進めてみた感想を書いていきます。
いつも使用しているfirebase cloud functionで動かしたかったので、スクレイピングツールはnode.jsで書ける、puppeteerを使用しました。
サンプルがあるので簡単なスクレイピングはすぐ書くことができます。
最初にアクセスするURLは前回書いた通り、
https://search.rakuten.co.jp/search/mall/?review=3.5&sid=【ショップID】
です。
ここから、各商品のレビューページに飛んで商品ごとのレビューをまるっと取得します。
大体ですが以下のようなコードになりました。
xpathでの指定とセレクタでの指定が入り混じっているのはスルーしてください…
async function crawlItemReviewPage() {
const isDebug = false;
const browser = await puppeteer.launch({
headless: isDebug ? false : true,
args: [
"--disable-gpu",
"--disable-dev-shm-usage",
"--disable-setuid-sandbox",
"--no-first-run",
"--no-sandbox",
"--no-zygote",
"--single-process",
],
});
const page = await browser.newPage();
await page.setDefaultNavigationTimeout(0);
await page.goto("https://search.rakuten.co.jp/search/mall/?review=4&sid=【ショップID】", { waitUntil: 'networkidle0' });
let result = [];
//レビューのある商品数を取得
const reviewSelector = "#root > div.dui-container.main > div.dui-container.content > div.dui-container.searchresults > div > div > div.content.review > a";
let obj = {};
for (let i = 0; i < elems.length; i++) {
obj = {};
let elemsn = await page.$$(reviewSelector);
await elemsn[i].click();
await page.waitForNavigation();
let xpath = '//*[@id="revItemSec"]/div[2]/h2/span/a';
let text = await getTextByXPath(page, xpath);
obj.itemName = text;
const href = await page.$eval("#thumbWindow > a", (elm) => elm.href);
obj.itemUrl = href;
const src = await page.$eval("#thumbWindow > a > img", (elm) => elm.src);
obj.itemImg = src;
obj.reviews = [];
let reviews = await page.$x('//*[@id="revRvwSec"]/div[1]/div/div[2]');
console.log('商品別レビュー数' + reviews.length);
let objC = {};
for (let j=0;j
return -1;
}
if (a.reviewDate==b.reviewDate) {
return 0;
}
})
return result;
}
動かしてみると、実行に結構時間がかかります。
cloud functionsの場合タイムアウトの時間は伸ばしておいた方が良いです。
メモリは今回1Gで実行しました。
exports.updateRItemReview = functions.runWith({
timeoutSeconds: 300,
memory: "1GB",
}).pubsub
...
上記updateRItemReview で、
・スクレイピング(crawlItemReviewPage)
・その結果からhtmlファイル生成
・ftpアップロード
という処理を行う形です。
ただ、楽天RMSのftpパスワードは時々変更する必要があります。
この点どのように対応するのか悩み中です。
最後までお読みいただき、ありがとうございました。