使用Node.js实现Yahoo奇摩拍卖的拍卖提醒功能
为了什么
我想要自動化Yahoo奇摩拍賣的搜尋,所以我利用這個腳本和GoogleAppsScript來完成每天的研究自動化。
请在中文中进行重述:
“フロー”
将下面的JSON内容发送到服务器上
{
"data": {
"keyword": "ヤフオクで検索するキーワード",
"limit_purchase_price": "価格上限を指定(任意)",
"already_checked_auction_ids": "すでにチェック済のオークションIDをカンマ区切りで指定(任意)"
}
}
在服务器上访问和爬取Yahoo拍卖网站,并以逗号分隔的字符串形式返回新拍卖的ID。
执行环境 (shí
・Node.js 8.9.4
・npm 5.6.0
・在Heroku上进行部署
结构
因为只有两个文件,所以它们在同一个目录下。
– 服务器.js
– 新拍卖通知.js
事前准备
– Chinese paraphrase option 1: 预先准备
・模块安装
npm install --save express
npm install -save body-parser
npm install --save cheerio-httpcli
符合
服务器.js
"use strict";
const express = require('express');
const body_parser = require('body-parser');
const newAuctionAlert = require('./newAuctionAlert');
const app = express();
//***サーバー作成***
const server = app.listen(process.env.PORT || 3000, function() {
console.log("server listening..");
});
//***express設定***
app.use(body_parser.urlencoded({
extended: true,
limit: '5KB'
}));
app.use(body_parser.json({
limit: '5KB'
}));
//***expressルーティング***
app.post('/newAuctionAlert', async(req, res, next) => {
const data = req.body.data;
if (data.keyword) {
const itemData = JSON.parse(req.body.data);
const new_auction_ids = await newAuctionAlert.main(data);
res.status(200).send(new_auction_ids); //カンマ区切り
} else {
res.status(404).send('キーワードの指定は必須です');
}
});
新的拍卖警报.js
"use strict";
const cheerio = require('cheerio-httpcli');
async function main(data) {
return new Promise(async(resolve, reject) => {
//***1. オークションページのHTMLを取得***
cheerio.fetch(
'https://auctions.yahoo.co.jp/search/search', {
p: data.keyword.replace(/\+/g, ' '), //検索キーワード
s1: 'end', //残り時間が長い順
o1: 'd',
ngram: 1, //あいまい検索
istatus: 2, //中古のみで検索
fixed: 0,
ei: 'UTF-8',
auccat: 0,
slider: 0,
tab_ex: 'commerce',
}).then((res) => {
//*** 2. 検索結果が存在すれば、価格が条件にマッチしているものをnew_auction_idsに追加する***
const enddate_elms = res.$('.ti'); //オークション終了まで○日の部分
const new_auction_ids = [];
const already_checked_auction_ids_array = data.already_checked_auction_ids.split(/\,/g);
if (enddate_elms.first().text() !== "") { //検索結果最上位の終了日を取得 検索結果が無ければ""
enddate_elms.each(function() {
const $parent_dom = res.$(this).parent();
const auction_id = $parent_dom.find('.a1wrp').first().find('a').first().attr('href').match(/\/\w+?$/)[0].replace(/^\//, '');
//上限価格が設定されている場合は価格チェック
var price_flag = true;
if (data.limit_purchase_price) {
const auction_now_price = Number($parent_dom.find('.pr1').first().text().replace(/\D/g, ''));
if (data.limit_purchase_price < auction_now_price) price_flag = false;
}
//価格がOKですでにチェック済のオークションで無ければ新しいオークション情報として登録
if (price_flag && already_checked_auction_ids_array.indexOf(auction_id) === -1) new_auction_ids.push(auction_id);
});
}
resolve(new_auction_ids.join());
}).catch((e) => {
reject(e);
});
});
}
exports.main = main;