|
(()=>{ |
|
const result = [...document.querySelectorAll(".js-rvw-item-clickable-area")].map(d => |
|
[ |
|
["user_name", ".rvw-item__rvwr-name > a > .lev > span:nth-child(1)"], |
|
["user_reviews", ".rvw-item__rvwr-name > a > .lev > span:nth-child(2)", x => Number(x.match(/\((.*?)\)/)[1])], |
|
["user_profile", ".rvw-item__rvwr-profile", x => {const [age,sex,address] = x.split("・"); return{age,sex,address}}], |
|
["user_exp", ".rvw-item__rvwr-balloon > p:nth-child(1) > span:nth-child(2)", x => x.match(/行ったお店(.*?)件/)[1]], |
|
["user_follows", ".rvw-item__rvwr-balloon > p:nth-child(2) > span", x => Number((x.match(/フォロー(.*?)人/)[1]).replace(/,/g,""))], |
|
["user_followers", ".rvw-item__rvwr-balloon > p:nth-child(2) > strong", x => Number((x.match(/フォロワー(.*?)人/)[1]).replace(/,/g,""))], |
|
["rating_visits", ".rvw-item__visit-count-num.u-text-num", Number], |
|
["rating_data", ".rvw-item__ratings", x => { |
|
const n = x.replace(/\n/g,""); |
|
const l = n.match(/昼の点数:(.*?)[ 料理・味(.*?) \|サービス(.*?) \|雰囲気(.*?) \|CP(.*?) \|酒・ドリンク(.*?)]/); |
|
const d = n.match(/夜の点数:(.*?)[ 料理・味(.*?) \|サービス(.*?) \|雰囲気(.*?) \|CP(.*?) \|酒・ドリンク(.*?)]/); |
|
const c = x => x === "-" ? null : x; |
|
const [_l, lPoint, lTaste, lServ, lMood, lCp, lDrink] = !!l ? [...l].map(c) : []; |
|
const [_d, dPoint, dTaste, dServ, dMood, dCp, dDrink] = !!d ? [...d].map(c) : []; |
|
const f = (point,taste,serv,mood,cp,drink) => ({point,taste,serv,mood,cp,drink}); |
|
return { |
|
...(!!l ? {lunch: f(lPoint, lTaste, lServ, lMood, lCp, lDrink)} : {}), |
|
...(!!d ? {dinner: f(dPoint, dTaste, dServ, dMood, dCp, dDrink)} : {}), |
|
average: ((!!l || lPoint === NaN ? lPoint : 0) + (!!d || dPoint === NaN ? dPoint : 0)) / ((!!l ? 1 : 0) + (!!d ? 1 : 0)) |
|
} |
|
}], |
|
["rating_date", ".rvw-item__date > p", x => x.match(/^(.*?)訪問/)[1]] |
|
].reduce( |
|
(p, [k, v, f = _ => _]) => ({ |
|
...p, |
|
[k]: f(d.querySelector(v).innerText) |
|
}), |
|
{} |
|
) |
|
); |
|
document.body.innerText = JSON.stringify(result); |
|
console.log({result}); |
|
})() |