Самый быстрый способ рассчитать последнюю рабочую страницу для соскабливания - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь очистить веб-сайт, и я не хочу, чтобы его заставляли рекурсивно очищать каждую страницу до "конца".

Я хочу иметь возможность просто получить последнюю страницу, или любая страница между ними.

В большинстве случаев это не проблема, но эта веб-страница отличается. Например:

Я выполняю поисковый запрос по: "Logitech"

Веб-сайт возвращает следующую информацию, которую я хочу использовать:

  • Общее количество найденных продуктов : 15.000
  • Товаров на странице: 30
  • Нумерация страниц: 1, 2, 3, 4, ... 500 (15.000 / 30 = 500)

Однако кажется, что Общее количество найденных продуктов - ложная информация, как и нумерация страниц, потому что когда я пытаюсь получить доступ к https://website.com/products?q=Logitech&page=500 нет товаров. Это также относится к более низким значениям, таким как: 499, 498, 450, 400, 350 и т. Д. c.

Поэтому я попытался «подсчитать» возможные номера страниц в своей голове, и я опустился до фактический номер последней страницы: 166

Я "рассчитал" это, проверив, были ли результаты:

  • Если были результаты: приращение значения на сумму x
  • Если результатов не было: уменьшить значение на сумму x

Поэтому я создал тестовый скрипт , чтобы отчасти повторить мой метод поиска номера страницы (repl.it ссылка): https://repl.it/@SaltyPotato1 / LastPageCalculator

Но у меня есть две проблемы с его сценарием (и я надеюсь, что вы, ребята, можете мне помочь):

  1. Этот скрипт «знает» правильное значение ( 166 ), поэтому он может использовать операторы > и <, когда я выполняю очистку; Он может только проверить, есть ли результат в этом случае: продукты. Это означает, что есть только 2 варианта:

    • Если есть результат, это будет означать, что: номер страницы либо слишком низкий , либо он находится в Фактически номер последней страницы.
    • Если есть нет результата , это будет означать, что: номер страницы слишком высокий.
  2. У меня такое чувство, что сценарий / расчет можно улучшить, поскольку некоторые значения передаются дважды.

Что я могу сделать, чтобы определить, действительно ли это номер последней страницы вместо номера страницы «под» фактической последней страницы. И как я могу минимизировать количество запросов, которые будут сделаны для расчета этого.

Я с нетерпением жду ваших ответов / помощи!

1 Ответ

1 голос
/ 18 февраля 2020

В общем, вы не должны знать все номера страниц для всех видов продуктов. Что вам нужно, это использовать алгоритм двоичного поиска, чтобы найти правильное максимальное количество страниц. Для чего я предлагаю использовать HTTP-запрос Head, просто чтобы проверить, существует ли этот маршрут, если сервер не поддерживает этот метод, вы можете попытаться выполнить запрос get и просто проверить код состояния http ответа, таким образом, вам не нужно выполните сложные вычисления / dom-запрос только для определения правильного максимального числа страниц.

В вашем коде будут небольшие изменения.

function findMaxPageCount(totalProductCount = 1000, productPerPage = 1){
  const lo = 1;
  const hi = totalProductCount/productPage;
  let mid;
  let actualMaxPage = -1;
  while(lo <= hi){
    mid = Math.floor((lo + hi)/2.0);

    if(pageExists(mid)){
      actualMaxPage = mid;
      lo = mid + 1;
    }else{
      hi = mid - 1;
    }
  }

  return actualMaxPage;
}

Приведенный выше метод не будет искать ту же страницу снова, так что число считываний минимально и не более Math.ceil(log2(totalProductCount/productPage)).

...