Emily L5 執行腳本,程式碼片段

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
  });
})