You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.6 KiB
JavaScript
64 lines
1.6 KiB
JavaScript
"use strict";
|
|
|
|
const assert = require("assert");
|
|
const cheerio = require("cheerio");
|
|
const syncpipe = require("syncpipe");
|
|
const url = require("url");
|
|
const defaultValue = require("default-value");
|
|
|
|
const assureResponse = require("../../shared/assure-response");
|
|
|
|
module.exports = function tmeScrapeProduct({ session }) {
|
|
return async function ({ data, createAlias, updateData, expireDependents }) {
|
|
let response = await session.get(data.url);
|
|
assureResponse(response);
|
|
|
|
let $ = cheerio.load(response.body);
|
|
|
|
let allMetaHeaders = syncpipe($("h2.o-semantic-only-header").toArray(), [
|
|
(_) => _.map((header) => {
|
|
let $header = $(header);
|
|
|
|
return [
|
|
$header.find(".name").text().trim(),
|
|
$header.find(".value").text().trim()
|
|
];
|
|
}),
|
|
(_) => Object.fromEntries(_)
|
|
]);
|
|
|
|
let itemData = {
|
|
productID: $(".pip-product-symbol").eq(0).text().trim(),
|
|
manufacturer: $("[data-gtm-event-action='producer_link']").eq(0).text().trim(),
|
|
model: defaultValue(
|
|
allMetaHeaders["Manufacturer part number:"],
|
|
allMetaHeaders["TME Symbol:"]
|
|
),
|
|
description: $(".c-pip__sub-name").eq(0).text().trim(),
|
|
documents: $("a.c-pip__downloads-file-link").toArray().map((link) => {
|
|
return {
|
|
description: $(link).text().trim(),
|
|
url: url.resolve(
|
|
data.url,
|
|
$(link).attr("href")
|
|
)
|
|
};
|
|
}),
|
|
// TODO: Scrape prices
|
|
};
|
|
|
|
assert(itemData.productID != null);
|
|
assert(itemData.manufacturer != null);
|
|
assert(itemData.model != null);
|
|
|
|
createAlias({ from: `tme:product:${itemData.productID}` });
|
|
|
|
updateData((oldData) => ({
|
|
... oldData,
|
|
itemData: itemData
|
|
}));
|
|
|
|
expireDependents();
|
|
};
|
|
};
|