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