Консолидированные данные Metascraper

#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.