Использование Google Sheets в качестве веб-скребка для сайта с Java

#web-scraping #google-sheets #google-sheets-formula

#очистка веб-страниц #google-sheets #google-sheets-формула

Вопрос:

Я пытался использовать IMPORTXML() для очистки информации со следующего веб-сайта.

https://libbyapp.com/library/lapl/search/audiobooks/query-john scalzi/language-en/page-1

После безуспешного выполнения команды и некоторого поиска в Интернете кажется, что эта команда не будет работать, потому что веб-сайт использует Java для отображения информации.

Есть ли в Google Sheets какая-либо другая команда или метод для очистки некоторой информации с этой веб-страницы? В частности, я пытаюсь получить имена и авторов первых 3 перечисленных книг.

Ответ №1:

Нет, не Java. JavaScript. Очень разные вещи.

К счастью для вас, на сайте есть JSON API! Вы можете сами убедиться в этом на сетевом мониторе вашего браузера. Это означает, что для этого нет чистой формулы, но мы можем написать простой пользовательский скрипт (Инструменты> Редактор сценариев).

Мы создаем эту пользовательскую функцию (вставляем в редактор):

 function getAuthors(url, showHeaders) 
{
  let jsondata = UrlFetchApp.fetch(url);
  let object   = JSON.parse(jsondata.getContentText());
  
  let bookData = showHeaders ? 
    [ ['Title', 'Author(s)'] ] : 
    [];

  bookData = bookData.concat(
      object.items.map(item => (
      // Title is always first, followed by any authors:
      [item.title].concat(
        item.creators
          // Add more creator roles here:
          .filter(creator => creator.role === 'Author')
          // Take creator's name
          .map(author => author.name)
          // Comma-separated
          .join(',')
      ))
    )
  );
  
  return bookData;
}
  

Используя сетевой монитор, я определил, что интересующий URL-адрес

 https://thunder.api.overdrive.com/v2/libraries/lapl/media?overdriveFormats=trueamp;mediaType=audiobookamp;query=john scalziamp;language=enamp;page=1amp;perPage=24amp;x-client-id=dewey
  

Затем в вашем листе вы можете использовать эту формулу:

 =getAuthors(A1)
  

или

 =getAuthors(A1, 1)
  

если вам нужны заголовки.

Если вам нужны первые три, просто используйте ARRAY_CONSTRAIN для усечения таблицы.

Комментарии:

1. Спасибо Calculuswhiz, это работает для меня! Один вопрос: я немного новичок в этом, поэтому не могли бы вы объяснить более подробно, как вы получили точный URL-адрес из сетевого монитора?

2. @TomDekkard Да. Если вы нажмете клавишу F12 в своем браузере, должны открыться ваши инструменты разработчика. Вероятно, на одной из ваших вкладок написано «Сеть». Если вы перейдете на страницу или обновите страницу с открытым монитором, он должен фиксировать все запросы данных. В этом случае я отфильтровал по XHR (обычно первое, что я проверяю после сайта) и нашел URL, который вернул ответ с правильными данными.