Untitled

By Scanty Cassowary, 1 Month ago, written in Plain Text.
URL https://paste.tinyw.in/index.php/view/28161382
Download Paste or View RawExpand paste to full width of browser | Change Viewing Options
  1. const webdriverio = require('webdriverio');
  2. const fs = require('fs');
  3. const async = require('async');
  4.  
  5. function Scraper() {
  6.   let context = this;
  7.  
  8.   return new Promise(function(resolve, reject) {
  9.     context.options = {
  10.       desiredCapabilities: {
  11.         browserName: 'chrome'
  12.       },
  13.       timeout: 30,
  14.       host: sails.config.selenium.server,
  15.       port: sails.config.selenium.port
  16.     };
  17.  
  18.     context.client = webdriverio.remote(context.options);
  19.     context.client.timeouts(10000);
  20.  
  21.     context.client.init().then(function(){
  22.       return resolve(context);
  23.     }).catch(function(e){
  24.       return reject(e);
  25.     });
  26.   });
  27. }
  28.  
  29. Scraper.prototype.end = async function() {
  30.   let context = this;
  31.  
  32.   try{
  33.     await context.client.end();
  34.     return;
  35.   }catch(e){
  36.     return;
  37.   }
  38. }
  39.  
  40. Scraper.prototype.murderSessions = function() {
  41.   let context = this;
  42.  
  43.   return new Promise(async function(resolve, reject) {
  44.     try {
  45.       let sessions = await context.client.sessions();
  46.  
  47.       async.eachSeries(sessions.value, function(session, callback) {
  48.         (async() => {
  49.           try {
  50.             sails.log.debug('Destroying session ', session.id);
  51.  
  52.             let result = await context.client.session('delete', session.id);
  53.  
  54.             sails.log.debug(result);
  55.  
  56.             return callback();
  57.           } catch (e) {
  58.             sails.log.error(JSON.stringify(e));
  59.             return callback();
  60.           }
  61.         })();
  62.       }, function() {
  63.         return resolve();
  64.       });
  65.     } catch (e) {
  66.       return reject(e);
  67.     }
  68.   });
  69. }
  70.  
  71. Scraper.prototype.test = function() {
  72.   let context = this;
  73.  
  74.   return new Promise(async function(resolve, reject) {
  75.     try {
  76.       let info = await context.getPrimeSellers('B072K72CF1');
  77.  
  78.       return resolve(info);
  79.     } catch (e) {
  80.       sails.log.error(e);
  81.       return reject(e);
  82.     }
  83.   });
  84. }
  85.  
  86. Scraper.prototype.getRankAndCategory = async function(asin) {
  87.   let context = this;
  88.  
  89.   try {
  90.     await context.client.url("https://www.amazon.com/dp/" + asin);
  91.     await context.injectJQuery(context.client);
  92.  
  93.     //Pull the bsr/etc
  94.     let rankInfo = await context.client.execute(function(bestSellerRankText) {
  95.       var $ = window.jQuery;
  96.  
  97.       var rankAndCategory = $("body").find("#SalesRank").clone().find("ul,style,li").remove().end().text() ||
  98.         $("body").find("#prodDetails th:contains('" + bestSellerRankText + "')").next().text();
  99.  
  100.       //Get the category
  101.       var category = rankAndCategory ? (rankAndCategory = rankAndCategory.replace(bestSellerRankText, ''), rankAndCategory.match(/(in\s|en\s)[\s\u00BF-\u1FFF\u2C00-\uD7FF\w\&\,\-]+[\(\>]?/g)) : null;
  102.       category = category ? category[0] : null;
  103.       if (category && category.indexOf(">") == -1) {
  104.         category = category.replace(/^(in|en)|(\()/g, "");
  105.       } else {
  106.         category = "N.A.";
  107.       }
  108.  
  109.       //Get the rank
  110.       var rank = rankAndCategory ? rankAndCategory.match(/((\#)|(Nr.\s)|(nº)|(n.\s?))?[0-9,.]+|(\>)/gi) : null;
  111.       if (rank && ($.inArray(">", rank) == -1 || $.inArray(">", rank) > 1)) {
  112.         rank = rank[0].replace(/(\#)|(Nr.)|(\,)|(\.)|(nº)|(n.)/gi, "");
  113.       } else {
  114.         rank = "N.A.";
  115.       }
  116.  
  117.       //Get the price
  118.  
  119.       var priceRegex = /(\$|\€|\£|\₹\s?|CDN\$\s|EUR\s)?[0-9,.]+/i;
  120.       var currencyRegex = /(\$|\€|\£|\₹\s?|CDN\$\s|EUR\s)/i;
  121.       var thousandSeparatorRegex = /(\d+)[\,\.](?=\d{3}(\D|$))/g;
  122.       //var passingData = null;
  123.  
  124.       var price = $("body").find("#actualPriceValue").text() || $("body").find("#priceblock_ourprice").text() ||
  125.         $("body").find("#priceblock_saleprice").text() || $("body").find("#priceblock_dealprice").text() || $("body").find("#priceBlock .priceLarge").text() ||
  126.         $("body").find("#buyNewSection .a-color-price.offer-price").text() || $("body").find("#prerderDelaySection .a-color-price").text() ||
  127.         $("body").find("#mocaSubtotal .a-color-price").text() || $("body").find("#tmmSwatches .a-color-price").text() ||
  128.         $("body").find("#mediaTab_content_landing .a-color-price.header-price").text() || $("body").find("#unqualifiedBuyBox .a-color-price").text() ||
  129.         $("body").find("#mediaTab_content_landing .a-color-price").text() || $("body").find("#wineTotalPrice").text() || $("body").find("#buybox_feature_div .a-color-price").text();
  130.  
  131.       price = price.match(priceRegex) ? price.match(priceRegex)[0] : null;
  132.       if (price) {
  133.         price = price.replace(currencyRegex, ""); //Take it just a number
  134.         price = price.replace(thousandSeparatorRegex, "$1"); //remove any thousand separator
  135.         price = price.replace(",", "."); //Because of Germany and French stores
  136.       } else {
  137.         price = "N.A.";
  138.       }
  139.  
  140.       if (price == "N.A." && typeof passingData != "undefined" && typeof passingData.price != "undefined") {
  141.         price = passingData.price;
  142.       }
  143.  
  144.       return {
  145.         category: category.trim(),
  146.         rank: rank.trim(),
  147.         price: price
  148.       };
  149.     }, 'Best Sellers Rank');
  150.  
  151.     return rankInfo.value;
  152.   } catch (e) {
  153.     throw e;
  154.   }
  155. }
  156.  
  157. Scraper.prototype.getPrimeSellers = function(asin){
  158.   let context = this;
  159.  
  160.   return new Promise(async function(resolve, reject) {
  161.     try {
  162.       let lowestPrice = 0;
  163.       let numSellers = 0;
  164.  
  165.       countSellers();
  166.  
  167.       async function countSellers(next) {
  168.         if (next == null) {
  169.           await context.client.url('https://www.amazon.com/gp/offer-listing/' + asin + '/ref=olp_f_primeEligible?ie=UTF8&f_primeEligible=true');
  170.           await context.injectJQuery(context.client);
  171.         }
  172.  
  173.         try{
  174.           let elements = await context.client.elements(".olpOffer");
  175.  
  176.           if (elements.value.length > 0) {
  177.             let priceExists = await context.client.isVisible(".olpPriceColumn > .a-color-price");
  178.  
  179.             if(!priceExists){
  180.               sails.log.debug("SCRAPER: Unable to locate pricing on buy options page for asin " + asin);
  181.  
  182.               return resolve({
  183.                 lowestPrice: lowestPrice,
  184.                 numSellers: numSellers
  185.               });
  186.             }
  187.  
  188.             let values = await context.client.elements(".olpPriceColumn > .a-color-price").getText();
  189.  
  190.             if (typeof values == 'string') {
  191.               lowestPrice = parseFloat(values.replace('$', ''));
  192.             } else if (typeof values == 'object') {
  193.               values.forEach(function(value) {
  194.                 if (lowestPrice == 0) {
  195.                   lowestPrice = parseFloat(value.replace('$', ''));
  196.                 } else {
  197.                   if (parseFloat(value.replace('$', '')) < lowestPrice) {
  198.                     lowestPrice = parseFloat(value.replace('$', ''));
  199.                   }
  200.                 }
  201.               });
  202.             }
  203.  
  204.             numSellers += elements.value.length;
  205.  
  206.             let nextPageExists = await context.client.isVisible('.a-last > a');
  207.  
  208.             if(nextPageExists){
  209.               await context.client.click('.a-last > a');
  210.  
  211.               countSellers(true);
  212.             }else{
  213.               return resolve({
  214.                 lowestPrice: lowestPrice,
  215.                 numSellers: numSellers
  216.               });
  217.             }
  218.           } else {
  219.             return resolve({
  220.               lowestPrice: lowestPrice,
  221.               numSellers: numSellers
  222.             });
  223.           }
  224.         }catch(e){
  225.           return reject(e);
  226.         }
  227.       }
  228.     } catch (e) {
  229.       return reject(e);
  230.     }
  231.   });
  232. }
  233.  
  234. Scraper.prototype.getPrimeSellers_old = function(asin) {
  235.   let context = this;
  236.  
  237.   return new Promise(async function(resolve, reject) {
  238.     let lowestPrice = 0;
  239.  
  240.     try {
  241.       await context.client.url('https://www.amazon.com/gp/offer-listing/' + asin + '/ref=olp_f_primeEligible?ie=UTF8&f_primeEligible=true');
  242.       await context.injectJQuery(context.client);
  243.  
  244.       let elements = await context.client.elements(".olpOffer");
  245.  
  246.       if (elements.value.length > 0) {
  247.         let values = await context.client.elements(".olpPriceColumn > .a-color-price").getText();
  248.  
  249.         if (typeof values == 'string') {
  250.           lowestPrice = parseFloat(values.replace('$', ''));
  251.         } else if (typeof values == 'object') {
  252.           values.forEach(function(value) {
  253.             if (lowestPrice == 0) {
  254.               lowestPrice = parseFloat(value.replace('$', ''));
  255.             } else {
  256.               if (parseFloat(value.replace('$', '')) < lowestPrice) {
  257.                 lowestPrice = parseFloat(value.replace('$', ''));
  258.               }
  259.             }
  260.           });
  261.         }
  262.  
  263.         return resolve({
  264.           lowestPrice: lowestPrice,
  265.           numSellers: elements.value.length
  266.         });
  267.       } else {
  268.         await context.client.end();
  269.  
  270.         return resolve({
  271.           lowestPrice: lowestPrice,
  272.           numSellers: 0
  273.         });
  274.       }
  275.     } catch (e) {
  276.       return reject(e);
  277.     }
  278.   });
  279. }
  280.  
  281. Scraper.prototype.injectJQuery = async function(browser) {
  282.   try{
  283.     let jquery = fs.readFileSync('client_js/jquery.js').toString();
  284.     await browser.execute(jquery);
  285.     return;
  286.   }catch(e){
  287.     throw e;
  288.   }
  289. }
  290.  
  291. module.exports = Scraper;
  292.  

Reply to "Untitled"

Here you can reply to the paste above

Use TinyW.in

Make Private

Feeling clever? Set some advanced options.