使用Nodejs编写程序对Yahoo拍卖网和Buyee进行网页抓取

我分别使用”canon相机-破旧”的关键词进行了调查。

1. 雅虎拍卖

要点:
– 不要对搜索关键字进行编码(在编码之后,Yahoo Auctions无法解码)。
– 如果搜索关键字中包含“+”,必须替换为半角空格。
– 如果想要查询进行中的拍卖活动,则使用“/search/search”。
– 如果想要查询过去120天的拍卖活动,则使用“/closedsearch/closedsearch”(只能指定日期为120天以内)。

  const cheerio = require("cheerio-httpcli");
  const keyword = "canon カメラ -ジャンク";
  const res = cheerio.fetch("https://auctions.yahoo.co.jp/closedsearch/closedsearch",{
    p : keyword,  
    select : "02",//並び順 落札価格の高い順 絶対に 02 のように0をつける
    istatus : 2,//新品だけで絞るなら1 中古だけなら2
    ngram : 1, //あいまい検索するなら1を指定
    ei:'UTF-8',fixed:0,auccat:0,tab_ex:'commerce',slider:0
  });

  const price = Number(res.$(".ePrice").first().text().replace(/\D/g,"")); //検索結果の一番上の落札価格

  //上記の条件でfetchした場合、直近30日の最高落札価格を取得する場合は下記のようにする
  const moment = require('moment');
  const today = moment();
  res.$(".d").each(function(i,el){
    end_day = moment(res.$(this),'MM-DD');
    if(today.diff(end_day, 'days') <= 30){
      pr3 = res.$('.ePrice').eq(i).text().replace(/\D/g,'');
      return false;
    }
  });

购买 Buyee

要点:
· 将搜索关键词中的空格替换为“+”,然后进行编码(可以使用encodeURI函数)。
· 有时即使可以正常获取fetch,但仍可能出现错误。此时错误对象中可能会有cheerio对象。

  const cheerio = require("cheerio-httpcli");
  const keyword = "canon カメラ -ジャンク";
  const res = cheerio.fetch('https://buyee.jp/item/search/query/' + encodeURI(keyword.replace(/\s/g, '+')), {
    item_status: 2, //中古
    translationType: 1,
    order: 'd',
    sort: 'end'
  }).then((result) => {
    return Promise.resolve(result);
  }, (err) => {
    if (err.$) {
      console.log('$があるからこれがcheerioオブジェクト');
      return Promise.resolve(err);
    } else return Promise.reject(err);
  });

  const date_text = res.$('.generalicon-clock').first().text();
  var p = 0;
  var p1 = 0;
  var p2 = 0;

  if (date_text) {
    const date = time.replace(/日/, ""); //検索結果の一番上のオークション残り開催日数
    try {
      data.auction_url = "https://page.auctions.yahoo.co.jp/jp/auction" + (res.$('.product_whole').first().find('a').first().attr('href').match(/\/[a-z]*\d{9,}$/)[0]); //オークションIDを抜き出してヤフオクのオークションページURLを取得する
    } catch (e) {
      data.auction_url = 'Error';
    }

    //現在価格の最高額を求める
    res.$('.product_price').each((i, el) => {
      p = Number(res.$(el).text().replace(/\(.+\)/g, '').replace(/\D/g, ''));
      if (p > pr1) pr1 = p;
    });

    //即決価格の最高額を求める
    res.$('.product_bidorbuy').each((i, el) => {
      p = Number(res.$(el).text().replace(/\(.+\)/g, '').replace(/\D/g, ''));
      if (typeof (p) == Number && p > pr2) pr2 = p;
    });
  }
bannerAds