Предложения по избежанию дублирования продуктов от соскабливания - PullRequest
1 голос
/ 20 сентября 2011

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

Все это работает хорошо, за исключением того, что некоторые сайты имеют отдельный URL для нескольких частей страницы.Например, URL продукта может быть:

http://www.example.com/product?id=52

, тогда он может иметь другой URL для других частей, таких как комментарии и т. Д .:

http://www.example.com/product?id=52&revpage=1

Мой сканер видит это как отдельноеURL.Я нашел несколько сайтов, где один продукт имеет сотни различных URL.Я уже добавил логику, чтобы игнорировать что-либо после хэша в URL, чтобы избежать привязки, но мне было интересно, есть ли у кого-нибудь предложения, чтобы избежать этой проблемы?Там может быть простое решение, которое я не вижу.

В настоящее время он замедляет процесс сканирования / сканирования, когда у сайта может быть только 100 продуктов, добавляя тысячи URL.

Я думал оигнорирование строки запроса или даже определенных частей строки запроса, но идентификатор продукта обычно находится в строке запроса, поэтому я не мог найти выход без написания исключения для структуры URL каждого сайта

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Чтобы уточнить мой комментарий ...

Вы могли бы включить следующий код

$producturl //is the url where you first found a product to scrape
$nexturl //is the next url you plan to crawl
if (strpos($nexturl, $producturl) === false) {
    crawl
}
loop back to the next url...

Я предполагаю, что вы сканируете по порядку ... то есть вы находите страницу и сканируетена все ссылки с этой страницы ... затем вы возвращаетесь на один уровень и повторяете ... Если вы не сканируете по порядку, вы можете сохранить все страницы, на которых вы нашли продукт, и использовать это, чтобы проверить, что новая страница вамПланирование сканирования начинается с URL, который вы уже сканировали.Если да, вы не сканируете новую страницу.

Надеюсь, это поможет.Удачи!

0 голосов
/ 20 сентября 2011

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

Изменить для решения URL-параметров:

Если у вас возникли проблемы с выбором нужных параметров из вашего URL, может помочь отрывок из Facebook API .

protected function getCurrentUrl($noQuerys = false) {
  $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'
    ? 'https://'
    : 'http://';
  $currentUrl = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
  $parts = parse_url($currentUrl); // http://de.php.net/manual/en/function.parse-url.php

  // drop known fb params
  $query = '';
  if (!empty($parts['query'])) {
    $params = array();
    parse_str($parts['query'], $params);
    foreach(self::$DROP_QUERY_PARAMS as $key) { // self::$DROP_QUERY_PARAMS is a list of params you dont want to have in your url
      unset($params[$key]);
    }
    if (!empty($params)) {
      $query = '?' . http_build_query($params, null, '&');
    }
  }

  // use port if non default
  $port =
    isset($parts['port']) &&
    (($protocol === 'http://' && $parts['port'] !== 80) ||
     ($protocol === 'https://' && $parts['port'] !== 443))
    ? ':' . $parts['port'] : '';


  // rebuild
  if ($noQuerys) {
      // return URL without parameters aka querys
      return $protocol . $parts['host'] . $port . $parts['path'];
  } else {
      // return full URL
      return $protocol . $parts['host'] . $port . $parts['path'] . $query;
  }
...