Как отображать изображения при использовании cURL? - PullRequest
1 голос
/ 28 ноября 2010

При очистке страницы, я хотел бы, чтобы изображения, включенные в текст.

В настоящее время я могу только очистить текст.Например, в качестве тестового сценария я удалил домашнюю страницу Google, и на ней отображался только текст, а не изображения (логотип Google).

Я также создал другой тестовый скрипт, используя Redbox, но безуспешно, тот же результат.Вот моя попытка очистить страницу Redbox 'Find a Movie':

<?php

$url = 'http://www.redbox.com/Titles/AvailableTitles.aspx';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result= curl_exec ($ch);
curl_close ($ch);
echo $result;

?>

страница была сломана, отсутствует изображение коробки, отсутствуют сценарии и т. Д.

Просмотр расширения Firebug FF 'Net'инструмент (позволяет мне проверять заголовки и пути к файлам), я обнаружил, что изображения и CSS-файлы Redbox не были загружены / отсутствуют (404 не найден).Я заметил, почему, это потому, что мой браузер искал изображения Redbox и файлы CSS в неправильном месте.

Очевидно, что изображения Redbox и CSS-файлы расположены относительно домена, также как и логотип Google.Так что, если мой скрипт выше использует свой домен в качестве основы для пути к файлам, как я могу это изменить?

Я попытался изменить заголовки запросов хоста и реферера с помощью приведенного ниже скрипта, и я много гуглил,но не повезло.

Моя попытка исправить:

<?php

$url = 'http://www.redbox.com/Titles/AvailableTitles.aspx';
$referer = 'http://www.redbox.com/Titles/AvailableTitles.aspx';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Host: www.redbox.com") );
curl_setopt ($ch, CURLOPT_REFERER, $referer); 
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result= curl_exec ($ch);
curl_close ($ch);
echo $result;

?>

Надеюсь, я понял, если нет, дайте мне знать, и я постараюсь объяснить это лучше.Любая помощь будет отличной!Спасибо.

ОБНОВЛЕНИЕ
Спасибо всем (особенно Марку и Уайетту), ваши ответы помогли мне выяснить способ реализации.
Мне удалось успешно выполнить тестирование, выполнив следующие шаги:

  1. Загрузите страницу иего реквизиты через Wget.
  2. Добавить <base href="..." /> в заголовок загруженной страницы.
  3. Загрузить исправленную загруженную страницу и ее исходные реквизиты через Wput на временный сервер.
  4. Проверка загруженной страницы на временном сервере через браузер
  5. Если загруженная страница не отображается должным образом, некоторые реквизиты могут все еще отсутствовать (css, jss, ect).Просмотр недостающих с помощью инструмента, который позволяет просматривать ответы заголовков (например, инструмент «net» из дополнения Firebug FF).После обнаружения недостающих реквизитов, посетите исходную страницу, на которой основана загруженная страница, запишите правильные реквизиты, которые отсутствовали, затем пересмотрите загруженную страницу с шага 1, чтобы приспособить новые подходящие местоположения, и начните с шага 3 снова.Иначе, если страница отображается правильно, значит, успех!

Примечание. При редактировании загруженной страницы я вручную редактировал код, я уверен, что вы можете использовать regEX или библиотеку синтаксического анализа по запросу cUrl для автоматизациипроцесс.

Ответы [ 3 ]

3 голосов
/ 28 ноября 2010

Когда вы очищаете URL, вы извлекаете один файл, будь то HTML, изображение, CSS, Javascript и т. Д. ... Документ, который вы видите в браузере, почти всегда является результатом нескольких файлов: оригиналHTML, каждое отдельное изображение, каждый файл CSS, каждый файл JavaScript.Вы вводите только один адрес, но для полного построения / отображения страницы потребуется много HTTP-запросов.

Когда вы чистите главную страницу Google с помощью curl и выводите этот HTML-код пользователю, у пользователя нет возможностиЗнайте, что они на самом деле просматривают HTML-код Google - кажется, что HTML-код пришел с вашего сервера и только с вашего сервера.Браузер пользователя с удовольствием впитает этот HTML, находит изображения и запрашивает изображения с ВАШЕГО сервера, а не с Google.Так как вы не размещаете изображения Google, ваш сервер отвечает ошибкой 404 "not found".

Для правильной работы страницы у вас есть несколько вариантов.Самый простой - это проанализировать HTML-код страницы и вставить тег <base href="..." /> в блок заголовка документа.Это скажет любому браузеру просмотра, что «относительно» ссылки в документе должны быть получены из этого «базового» источника (например, Google).

Более сложный вариант - проанализировать документ и переписать любые ссылки на внешние файлы (images, css, js и т. д.) и вставьте URL-адрес исходного сервера, чтобы браузер пользователя перешел на исходный сайт и получил его оттуда.

Самым сложным вариантом является настройкапрокси-сервер, и если приходит запрос на файл, который не существует на вашем сервере, попытаться получить соответствующий файл из Google с помощью curl и вывести его пользователю.

2 голосов
/ 28 ноября 2010

Если загружаемый вами сайт использует относительные пути для URL своих ресурсов (т.е. /images/whatever.gif вместо http://www.site.com/images/whatever.gif), вам нужно будет переписать эти URL висточник, который вы получаете, поскольку cURL не будет делать это сам , а Wget (официальный сайт, кажется, не работает) (и даже будет загружать и зеркалировать ресурсы для вас), но не предоставляет привязки PHP.

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

if (!preg_match('/src="https?:\/\/"/', $result))
    $result = preg_replace('/src="(.*)"/', "src=\"$MY_BASE_URL\\1\"", $result);

, где $MY_BASE_URL - это базовый URL, который вы хотите переписать, т.е. http://www.mydomain.com.Это не будет работать на все, но это должно помочь вам начать.Это не , что легко сделать, и вам может быть лучше, если вы просто создадите команду wget в фоновом режиме и позволите ей зеркально отражать или переписывать HTML для вас.

0 голосов
/ 28 ноября 2010

Попробуйте получить изображения, вернув необработанный вывод, используя для параметра CURLOPT_BINARYTRANSFER значение true, как показано ниже

curl_setopt($ch,CURLOPT_BINARYTRANSFER, true);

Я успешно использовал это для получения изображений и аудио с веб-страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...