import { extractModelId, extractNumber } from "../system/ultils.js"; import { ScrapModel } from "./scrap-model.js"; export class GraysScrapModel extends ScrapModel { action = async () => { const urlsData = this.extractUrls(); for (let item of urlsData) { await this.page.goto(item.url); const data = await this.getItemsInHtml(item); const results = this.filterItemByKeyword(item.keyword, data); this.results[item.keyword] = results; } console.log({ results: this.results }); }; getPriceByEl = async (elementHandle) => { const selectors = [ "a > div:nth-child(2) > div:nth-child(2)", // Single product price "a > div:nth-of-type(2) > div:nth-of-type(2) > div > div:nth-of-type(1) > div", // Multiple product price ]; for (const selector of selectors) { const priceText = await elementHandle .$eval(selector, (el) => el.textContent.trim()) .catch(() => null); if (priceText) { const price = extractNumber(priceText); if (price) return price; } } return null; }; getItemsInHtml = async (data) => { const elements = await this.page.$$('[style="display:block"] > div > div'); const results = []; for (const el of elements) { const url = await el .$eval("a", (el) => el.getAttribute("href")) .catch(() => null); const image_url = await el .$eval("img", (img) => img.getAttribute("src")) .catch(() => null); const name = await el .$eval("h2", (el) => el.textContent.trim()) .catch(() => null); const current_price = await this.getPriceByEl(el); // Gọi hàm async được định nghĩa trong class results.push({ url, image_url, name, keyword: data.keyword, model: extractModelId(url), current_price, scrap_config_id: this.scrap_config_id, }); } return results; }; }