Попытка использовать HTML DOM-парсер для получения основного изображения на странице Amazon

Я пытаюсь использовать HTML DOM Parser, чтобы получить источник изображения "основного" изображения продукта независимо от того, на какую страницу продукта указывает указатель.

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

$finalarray[$i][2] = $html->find('img[id="landingImage"]', 0)->src;

Но нет такой удачи.

Я также пробовал

    foreach($html->find('img') as $e)
    if (strpos($e,'landingImage') !== false) { 
        $finalarray[$i][2] = $e->src;
    }

Я заметил, что обычно источник изображения имеет SY300 или SX300, поэтому я сделал это:

    foreach($html->find('img') as $e)
    if (strpos($e,'SX300') !== false) { 
        $finalarray[$i][2] = $e->src;
    }
    else if (strpos($e,'SY300') !== false) { 
        $finalarray[$i][2] = $e->src;
    }

К сожалению, некоторые ссылки источника изображения не содержат этого, например:

http://www.amazon.com/gp/product/B001O21H00/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=B001O21H00&linkCode=as2&tag=bmref-20

Ответ 1

Использование API Amazon может быть лучшим решением, но это не вопрос.

Когда я загрузил html с веб-страницы примера (содержимое без запуска JavaScript), я не смог найти ни одного тега с id="landingImage" [1]. Но я могу найти тег изображения с id="main-image". Попытка извлечь этот тег с помощью DOMDocument не удалась. Как-то методы loadHTML() и loadHTMLFile() не могли разобрать html.

Но интересную часть можно извлечь с помощью регулярного выражения. Следующий код даст вам источник изображения:

$url = 'http://www.amazon.com/gp/product/B001O21H00/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=B001O21H00&linkCode=as2&tag=bmref-20';
$html = file_get_contents($url);

$matches = array();
if (preg_match('#<img[^>]*id="main-image"[^>]*src="(.*?)"[^>]*>#', $html, $matches)) {
    $src = $matches[1];
}

// The source of the image is
// $src: 'http://ecx.images-amazon.com/images/I/21JzKZ9%2BYGL.jpg'

[1] Источник html был загружен в php с помощью функции file_get_contents. Загрузка html-источника с Firefox приводит к другому HTML-коду. В последнем случае вы найдете тег изображения с атрибутом id "landingImage" (JavaScript НЕ включен!). Кажется, что загруженный источник html зависит от клиента (заголовки в HTTP-запросе).

Ответ 2

На странице с вашим тегом img с тегом id="landingImage" не указан атрибут src. Этот атрибут добавлен JavaScript.

Но этот тег содержит атрибут data-a-dynamic-image со значением {"http://ecx.images-amazon.com/images/I/21JzKZ9%2BYGL.jpg":[200,200]}

Вы можете попробовать получить значение для этого атрибута, а затем просто проанализировать значение. С помощью regexp или с помощью функций strpos и substr.

Ответ 3

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

$url = 'http://www.amazon.com/gp/product/B001O21H00/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=B001O21H00&linkCode=as2&tag=bmref-20';

$html = file_get_html($url);

$image = $html->find('img[id="landingImage"]', 0);

if(!is_object($image)) {
  $image = $html->find('img[id="main-image"]', 0);
}

if(!is_object($image)) {
  // Log the error to apache error log
  error_log('Could not find amazon image: ' + $url);
} else {
  print $image->src;
}