#web-scraping #css-selectors #web-crawler
#Очистка веб-страниц #css-селекторы #веб-сканер
Вопрос:
Я использую metascraper в проекте, над которым я работаю. Я передаю пользовательские правила в конструктор. На самом деле он удаляет фактический контент со страницы, которую он очищает. Проблема в том, что, похоже, он находит каждый тег, соответствующий селектору CSS, и объединяет все содержимое text () из каждого тега на странице. Я проверил веб-сайт metascraper и github и не смог найти никакой информации о опции, которая изменяет этот режим / поведение. Я убедился, что каждый запрос на очистку создает новый экземпляр metascraper на случай, если он просто использовал одни и те же переменные-члены при многократном использовании объекта, но, похоже, это ничего не дало. Есть мысли?
Редактировать: кроме того, в идеале metascraper должен возвращать массив массивов наборов селекторов, которые он находит. У меня есть 4 селектора в группе, которые отображаются в группах по всей странице. Мне нужно, чтобы он перебирал селекторы по порядку, пока он не сможет найти больше экземпляров 1-го селектора (иначе группы перестали появляться на странице).
type4: async (page: Page): Promise<Extract[]> => {
const html = await page.content()
const url = await page.url()
const type4MetascraperInstance = createType4MetaScraperInstance()
const metadata = await type4MetascraperInstance({ html: html, url: url })
console.log('metadata: ', metadata)
const extract: Extract[] = [{
fingerprint: 'type4',
author: metadata.author,
body: metadata.description,
images: null,
logo: null,
product: null,
rating: null,
title: metadata.title,
videos: null
}]
return extract
}
Функция для создания экземпляра metascraper Type4:
function createType4MetaScraperInstance() {
const toDescription = toRule(description)
const toAuthor = toRule(author)
const toTitle = toRule(title, { removeSeparator: false })
const type4MetaScraperInstance = metaScraper([ {
author: [
toAuthor($ => $('.a-profile-name').text()),
],
title: [
toTitle($ => $('a[data-hook="review-title"] > span').text()),
],
description: [
toDescription($ => $('.review-text-content').text()),
]
} ])
return type4MetaScraperInstance
}
Ответ №1:
Я решил создать здесь другое решение, которое использует скрипт python для правильного анализа обзоров, и ему потребуется чтение / запись в облачное хранилище данных Google. Некоторые предложения, предоставленные людьми, заключались в том, чтобы написать мои собственные вызовы cheeriojs (https://cheerio.js.org /), вместо того, чтобы вообще использовать metascraper.