Получение вывода мусора при очистке веб-страницы в PHP

Я пытаюсь получить содержимое страницы с Amazon, используя file_get_html(), но на выходе echo появляются странные символы. Может ли кто-нибудь объяснить, как я могу решить эту проблему?

Я также нашел следующие два связанных вопроса о переполнении стека, но они не решили мою проблему. :)

  1. file_get_html() возвращает мусор
  2. https://stackoverflow.com/questions/8895852/uncompress-gzip-compressed-http-response/10105319#10105319

Вот мой код:

$options = array(
'http'=>array(
    'header'=>
            "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n".
            "Accept-language: en-US,en;q=0.5\r\n" .
            "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6\r\n"
   )
); 
$context = stream_context_create($options);

$amazon_url = 'https://www.amazon.com/my-url';
$amazon_html = file_get_contents($amazon_url, false, $context);

Вот что я получаю:

��T]o�6}��`���0��݊-��"[�bh�tN�b0��.%%�$P��@�(Ų�� ������F#����A�

около 115 тыс. таких символов отображаются в окне браузера.

Это мои новые заголовки:

$options = array(
'http'=>array(
    'header'=>
            "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n".
            "Accept-language: en-US,en;q=0.5\r\n"
   )
); 

Решит ли использование cURL эту проблему?

Обновлять:

Я пробовал кУРЛ. Все еще получаю вывод мусора. Вот заголовки моих ответов:

HTTP/1.1 200 OK
Date: Sun, 18 Nov 2018 20:29:28 GMT
Server: Apache/2.4.33 (Win32) OpenSSL/1.1.0h PHP/7.2.5
X-Powered-By: PHP/7.2.5
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

Кто-нибудь может объяснить отрицательные голоса?

  1. Я сам провел исследование.
  2. Нашел несколько связанных вопросов о переполнении стека, которые не решили мою проблему.
  3. Предоставил всю информацию, которая, как мне казалось, будет полезна.

Что еще я должен включить в вопрос?

Вот весь мой код для curl на данный момент. Это URL, который я собираю.

$handle = curl_init();
curl_setopt($handle, CURLOPT_URL, $amazon_url);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($handle);
curl_close($handle);

echo $data;

Вывод — это просто набор символов, о которых я упоминал выше. Вот заголовки моих запросов:

Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: AMCV_17EB401053DAF4840A490D4C%40AdobeOrg=-227196251%7CMCIDTS%7C17650%7CMCMID%7C67056225185486460220940124683302119708%7CMCAID%7CNONE%7CMCOPTOUT-1524907071s%7CNONE; mjx.menu=renderer%3ACommonHTML; _ga=GA1.1.2019605490.1529649408; csm-hit=adb:adblk_no&tb:s-3521C4J8F2EP1V0MMQEP|1542578145652&t:1542578146256
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache

Это из вкладки «Сеть». Заголовки ответа такие же, как я упоминал выше.

Вот результат после добавления curl_setopt($handle, CURLOPT_HEADER, 1); в мой код:

HTTP/1.1 200 OK Сервер: Server Content-Type: text/html; charset = UTF-8 Strict-Transport-Security: max-age = 47474747; включать поддомены; preload x-amz-id-1: 7A162B8JKV6MGZQ3PCH2 Варьируется: Accept-Encoding, User-Agent, X-Amzn-CDN-Cache Content-Encoding: gzip x-amz-rid: 7A162B8JKV6MGZQ3PCH2 Cache-Control: без преобразования X-Frame- Параметры: SAMEORIGIN Дата: Воскресенье, 18 ноября 2018 г. 22:42:51 GMT Передача-кодирование: chunked Соединение: keep-alive Соединение: Transfer-Encoding Set-Cookie: x-wl-uid=1a4u8+XgF+IhFF/iavy9mKZCAA0g4HiIYZXR8hKjxGtmOtBW+j67wGABv7ZOTxDRcab +7Qmpjqds=;


person Real Noob    schedule 18.11.2018    source источник
comment
Известно, что мы немного поспешили с отрицательными отзывами, в вашем случае я не думаю, что это было заслуженно. На первый взгляд ваш код выглядит нормально, если вы загружаете тот же URL-адрес Amazon в свой браузер, это обычный текстовый / HTML-файл с правильным выводом?   -  person Sheng Slogar    schedule 19.11.2018
comment
@ShengSlogar Да, URL-адрес правильно загружается в браузере. :)   -  person Real Noob    schedule 19.11.2018
comment
Это похоже на проблему с кодировкой, хотя это довольно странно, поскольку Amazon должен возвращать по умолчанию UTF-8, и ваш скрипт (это то, что возвращает ваш скрипт?) также, кажется, возвращает строку UTF-8, вы используете последнюю версию PHP, так что это тоже не проблема. Можете ли вы показать нам весь фактический код cURL и точный URL-адрес, который вы пытаетесь отобразить для теста?   -  person p0358    schedule 19.11.2018
comment
Это не ограничивается какими-либо конкретными URL-адресами. Кроме того, кажется, что это происходит случайно. Иногда это случается раз в то время. В других случаях это повторяется снова и снова.   -  person Real Noob    schedule 19.11.2018
comment
@ p0358 Я добавлю подробности в вопрос. :)   -  person Real Noob    schedule 19.11.2018
comment
Что ж, код выглядит нормально для меня, я также проверил его в аналогичной среде (Windows) и могу успешно просматривать страницу Amazon в своем браузере, используя его. Вы упомянули, что это происходит случайно, что означает, что это, вероятно, более сложная проблема. У вас случайно нет ошибок PHP в логах?   -  person p0358    schedule 19.11.2018
comment
@ p0358 Когда вы сказали, что с его помощью я могу успешно просматривать страницу Amazon в своем браузере. Вы имели в виду, что приведенный выше код правильно отобразил страницу для вас?   -  person Real Noob    schedule 19.11.2018
comment
Да, я использовал эту формулировку в том смысле, что он даже загрузил все активы, поэтому страница также правильно отображалась в браузере, как если бы это была настоящая исходная страница.   -  person p0358    schedule 19.11.2018
comment
@ p0358 Может ли это быть как-то связано с ограничением скорости?   -  person Real Noob    schedule 19.11.2018
comment
@ p0358 Я запускаю код на локальном хосте, и браузер не отображает ошибок PHP, только вывод мусора. :)   -  person Real Noob    schedule 19.11.2018
comment
Браузер да, но в зависимости от вашей конфигурации ошибки могут быть сохранены в отдельный файл журнала. У меня также есть предположение, что данные, которые вы извлекаете, могут быть не текстовыми/html, что потребует небольшого исправления в коде для правильного отображения в браузере. (Я опубликую пример через секунду)   -  person p0358    schedule 19.11.2018
comment
А пока добавьте curl_setopt($handle, CURLOPT_HEADER, 1); где-нибудь перед curl_exec, чтобы ответ содержал заголовки ответа от Amazon, и тогда мы сможем увидеть, возможно ли мое предположение.   -  person p0358    schedule 19.11.2018
comment
@ p0358, я добавляю полученный результат к деталям вопроса. :)   -  person Real Noob    schedule 19.11.2018
comment
@ p0358 Приношу извинения за задержку с ответом. Я перезагрузил свой ноутбук и снова запустил свой исходный код, потому что это однажды дало правильный результат. Однако на этот раз это не сработало. :D   -  person Real Noob    schedule 19.11.2018
comment
Я думаю, что у меня закончились идеи, как тип MIME, так и кодировка, похоже, совпадают. При дальнейшем поиске имейте в виду, что код в порядке (у меня работал), поэтому проблема должна лежать где-то еще. (может конфиг, может что-то с сетью, может Амазон на самом деле отвечает мусором как мерой ограничения скорости? понятия не имею)   -  person p0358    schedule 19.11.2018
comment
Спасибо за помощь до сих пор @ p0358. :)   -  person Real Noob    schedule 19.11.2018
comment
У меня была такая же проблема, и единственный ответ на этот вопрос ниже решил ее для меня. Это проблема сжатия, а не кодирования. Zip-файл будет выглядеть как куча мусора, если вы просматриваете его в необработанном виде, не распаковывая.   -  person Brian Tristam Williams    schedule 19.05.2021


Ответы (1)


Вот решение:

Я столкнулся с той же проблемой при очистке Amazon. Просто добавьте следующую опцию перед отправкой запроса cURL:

curl_setopt($handle, CURLOPT_ENCODING, 'gzip,deflate,sdch');
person jeff    schedule 19.12.2018
comment
Спасатель, спасибо! Я знал, что это как-то связано с компрессией. После успешной работы в течение многих лет, после 2021-05-18T18:00:00Z, это происходит случайным образом на скрейках IMDb - иногда страница будет работать; иногда он будет возвращать сжатый мусор. Кажется, этого не произошло с тех пор, как я добавил вашу строку. - person Brian Tristam Williams; 19.05.2021