在PHP中抓取网页时获取垃圾输出

时间:2018-11-18 20:09:44

标签: php html encoding file-get-contents

我正在尝试使用file_get_html()从Amazon获取页面的内容,但是输出带有echo上的奇怪字符。谁能解释我该如何解决这个问题?

我还在堆栈溢出中发现了以下两个相关问题,但它们并不能解决我的问题。 :)

  1. file_get_html() returns garbage
  2. Uncompress gzip compressed http response

这是我的代码:

$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�

在浏览器窗口中会显示大约115k个字符。

这些是我的新标题:

$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是否可以解决此问题?

更新:

我尝试了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. 在Stack Overflow上发现了一些无法解决我问题的相关问题。
  3. 提供了我认为会有所帮助的所有信息。

我还要在问题中包括什么?

这是我目前关于curl的全部代码。这是我正在抓取的the 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服务器:服务器内容类型:text / html;字符集= UTF-8   严格的运输安全性:max-age = 47474747; includeSubDomains;   预载x-amz-id-1:7A162B8JKV6MGZQ3PCH2变化:   接受编码,用户代理,X-Amzn-CDN缓存内容编码:gzip   x-amz-rid:7A162B8JKV6MGZQ3PCH2缓存控制:无变换   X-Frame-Options:SAMEORIGIN Date:Sun,18 Nov 2018 22:42:51 GMT   传输编码:分块连接:保持活动连接:   传输编码Set-Cookie:   x-wl-uid = 1a4u8 + XgF + IhFF / iavy9mKZCAA0g4HiIYZXR8hKjxGtmOtBW + j67wGABv7ZOTxDRcab + 7Qmpjqds =;   路径= /; domain = .amazon.in; expires =星期二,2036年1月1日00:00:01 GMT   Set-Cookie:session-id-time = 2082758401l;路径= /; domain = .amazon.in;   expires =星期二,2036年1月1日00:00:01 GMT Set-Cookie:   session-id = 260-6671998-9793112;路径= /; domain = .amazon.in;   expires =星期二,2036年1月1日00:00:01 GMT

1 个答案:

答案 0 :(得分:1)

这是解决方案:

刮刮亚马逊时遇到了同样的问题。 在发送您的cURL请求之前,只需添加以下选项:

curl_setopt($handle, CURLOPT_ENCODING, 'gzip,deflate,sdch');