Nodejs(JavaScript)上でSeleniumを動かす
Amazon サイトで書名検索し表紙画像URLを取り出してみた

November 23, 2020 – 5:23 pm

Seleniumを用いて、アマゾンサイトの商品検索サイトで書名検索する際に出力される書籍の表紙画面のURLを取り出してみた。

書名を入力とし、表紙画面を出力する node module getImage()を作成したので、テストのサンプル(test.jsと実行結果)、moduleを定義しているamazon_search.jsのソースをアップしておいた。

なお、アップしたソース、並びにその使用については本サイトは責任を負わないので念のため。

テストサンプル

test.js:

const search = require("./amazon_search.js")

let item ="日本の観光"
search.getImage(item).then(result => {
   console.log(result)
})

test.js 実行:

$ node test.js
https://m.media-amazon.com/images/I/8177ba3DJAL._AC_UL320_.jpg

  

抽出された画像URLを描画(120x180に縮小)

  
モジュールgetImage()の作成

amazon_search.js (module getImage) :

const fs = require('fs')
const chrome = require('selenium-webdriver/chrome');
const {Builder, By, Key, until } = require('selenium-webdriver');

async function getImage(item) {
    const driver = await new Builder()
        .forBrowser('chrome')
        .setChromeOptions(new chrome.Options().headless())
        .build();
    try {
        if(item == '') return 'Error: No Book Title!'
        // Navigate to Url
        await driver.get('https://www.amazon.co.jp')
        search_box = await driver.findElement(By.id('twotabsearchtextbox')).sendKeys(item)
        search_button = await driver.findElement(By.id("nav-search-submit-text")).click()

        let data = await driver.takeScreenshot()
        await outshot(data, "out.png") 

        let elem = await driver.findElements(By.tagName("img"))
        
        for(let i=0; i 0) return src
        }
        return await elem[2].getAttribute('src')

    }
    finally {
        driver.quit()
    }
}

outshot = ((data, out) => {
    let base64Data = data.replace(/^data:image\/png;base64,/,"")
    fs.writeFile(out, base64Data, 'base64', 
                   ((err) => { if(err) console.log(err) })
       )
})

function toHanKaku(str) {
  return str.replace(/[A-Za-z0-9]/g, function(s){
  return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
  });
}

function strcheck(str1,str2) {
  if( str1 == "" || str2 == "") return -1
  str1 = str1.replace(/\s/g, '')
  str2 = str2.replace(/\s/g, '')
  str1 = toHanKaku(str1)
  str2 = toHanKaku(str2) 
 if( str1.length >= str2.length) return str1.includes(str2)
  else return str2.includes(str1)
}

module.exports.getImage = getImage

   


Post a Comment