Amazon 商品搜尋.csv
name,low_price,high_price
藍牙耳機,100,150
筆記型電腦,1500,2000
例 5,Amazon 商品搜尋
初步嘗試
可以使用
document.getElementsByClassName("s-result-list");
或是使用
document.querySelectorAll(".s-result-list");
修正後,只找到 1 筆才對。
document.querySelectorAll("div.s-main-slot.s-result-list");
使用後代選擇器 div.s-result-item 撈出商品項目
document.querySelectorAll(
"div.s-main-slot.s-result-list div.s-result-item");
加入 .s-asin 限縮撈出的結果
document.querySelectorAll(
"div.s-main-slot.s-result-list div.s-result-item.s-asin");
使用 :not() 選取器,濾掉不需要的 AdHolder
document.querySelectorAll(
"div.s-main-slot.s-result-list div.s-result-item.s-asin:not(.AdHolder)");
進一步撈出商品標題跟價格
//這個選取器撈出來的是 16 個商品項目的『右邊』部分
let product_blocks = document.querySelectorAll(
"div.s-main-slot.s-result-list div.s-result-item.s-asin:not(.AdHolder) div.sg-col-inner .s-list-col-right");
//根據撈出來的右邊區塊,再往下撈出商品標題跟商品價格
product_blocks.forEach(product_block=>{
//獲取商品標題跟商品價格時有可能錯誤,例如:價格資訊有可能從缺
try{
let product_title = product_block.querySelectorAll("div.sg-col-inner span.a-text-normal")[0].innerText;
let product_price = product_block.querySelectorAll(".a-price span.a-offscreen")[0].innerText;
// 將商品標題,商品價格作成一個物件,然後印出
console.log({
"product_title": product_title,
"product_price": product_price
});
}
catch(e){
console.warn(e);
}
});
將撈出的商品標題,商品價格作成一個物件,並蒐集到一個陣列中
let product_results = []; //初始化一個陣列,用來儲存撈出來的的產品結果
//這個選取器撈出來的是 16 個商品項目的『右邊』部分
let product_blocks = document.querySelectorAll(
"div.s-main-slot.s-result-list div.s-result-item.s-asin:not(.AdHolder) div.sg-col-inner .s-list-col-right");
//根據撈出來的右邊區塊,再往下撈出商品標題跟商品價格
product_blocks.forEach(product_block=>{
//獲取商品標題跟商品價格時有可能錯誤,例如:價格資訊有可能從缺
try{
let product_title = product_block.querySelectorAll("div.sg-col-inner span.a-text-normal")[0].innerText;
let product_price = product_block.querySelectorAll(".a-price span.a-offscreen")[0].innerText;
// 將商品標題,商品價格作成一個物件,然後放入結果陣列
product_results.push({
"product_title": product_title,
"product_price": product_price
});
}
catch(e){
console.warn(e);
}
});
console.log(product_results); //印出 product_results 最後結果
然後存成檔案
//...接續之前的程式碼,最後將結果寫入檔案
write("product_result.txt", JSON.stringify(product_results));
使用 click() 方法切換搜尋結果到下一頁
document.querySelectorAll("a.s-pagination-item.s-pagination-next")[0].click();
最終完成的執行腳本程式碼
let loop_count; // 迴圈變數
try {
loop_count = JSON.parse(read("loop_count.txt"));
} catch(e){
loop_count = 0;
}
let product_results; // 儲存搜尋結果的陣列
try{
product_results = JSON.parse(read("product_result.txt"));
}catch(e){
product_results = [];
}
//這個選取器撈出來的是 16 個商品項目的『右邊』部分
let product_blocks = document.querySelectorAll(
"div.s-main-slot.s-result-list div.s-result-item.s-asin:not(.AdHolder) div.sg-col-inner .s-list-col-right");
//根據撈出來的右邊區塊,再往下撈出商品標題跟商品價格
product_blocks.forEach(product_block=>{
//獲取商品標題跟商品價格時有可能錯誤,例如:價格資訊有可能從缺
try{
let product_title = product_block.querySelectorAll("div.sg-col-inner span.a-text-normal")[0].innerText;
let product_price = product_block.querySelectorAll(".a-price span.a-offscreen")[0].innerText;
// 將商品標題,商品價格作成一個物件,然後放入結果陣列
product_results.push({
"product_title": product_title,
"product_price": product_price
});
}
catch(e){
console.warn(e);
}
});
console.log(product_results); //印出 product_results 最後結果
//...接續之前的程式碼,最後將結果寫入檔案
write("product_result.txt", JSON.stringify(product_results));
if(loop_count < 2){ //若迴圈變數的值小於 2
// 將迴圈變數加1的值存入檔案
write("loop_count.txt", JSON.stringify(loop_count+1));
// 點擊下一頁按鍵,載入下個分頁的結果
document.querySelectorAll("a.s-pagination-item.s-pagination-next")[0].click();
// 3秒後,重新執行本腳本
repeat(true, 3000);
} else {
// 迴圈結束後,移除記錄迴圈變數的檔案。
// 讓下一回合的循環工作有一個新的開始環境
remove("loop_count.txt");
}
CSV 表格建立用的程式碼
console.log(input);
let products = JSON.parse(input['product_result']);
products.forEach(element =>{
output.push({
"product_name": element.product_title,
"product_price": element.product_price
});
})