
本文旨在解决在使用 PHP Simple HTML DOM 库抓取启用了 WordPress 内部缓存的网站时,遇到的返回乱码问题。通过使用 cURL 并设置 CURLOPT_ACCEPT_ENCODING 选项,或使用 gzdecode() 函数,可以有效解决首次抓取正常,后续抓取出现乱码的情况,确保数据抓取的准确性。
在使用 PHP Simple HTML DOM 库进行网页抓取时,可能会遇到一种特殊情况:当目标网站启用了缓存机制(例如 WordPress 内部缓存)后,首次抓取能够正常获取页面内容,但后续的抓取却返回乱码。这通常是由于服务器返回了经过压缩的内容,而 Simple HTML DOM 库没有自动处理压缩数据导致的。
以下提供两种解决方案:
方案一:使用 cURL 并设置 CURLOPT_ACCEPT_ENCODING
立即学习“PHP免费学习笔记(深入)”;
cURL 是一个强大的网络请求库,通过设置 CURLOPT_ACCEPT_ENCODING 选项,可以告诉服务器客户端支持的压缩格式,并自动解压缩服务器返回的内容。
<?php
include('/simple_html_dom.php');
$url = "https://www.2311666.com.tw/";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_USERAGENT, 'Chrome/94.0.4606.81');
curl_setopt($curl, CURLOPT_ACCEPT_ENCODING, ""); // 关键:允许接受所有编码
$html_content = curl_exec($curl);
curl_close($curl);
$html = new simple_html_dom();
$html->load($html_content);
echo $html;
?>代码解释:
方案二:使用 gzdecode() 函数
如果服务器返回的内容是 gzip 压缩的,可以使用 gzdecode() 函数手动解压缩。
<?php
include('/simple_html_dom.php');
$url = "https://www.2311666.com.tw/";
$opts = array(
'http' => array('header' => "User-Agent:Chrome/94.0.4606.81\r\n")
);
$context = stream_context_create($opts);
$html = new simple_html_dom();
$get = file_get_contents($url, false, $context);
// 检查是否是 gzip 压缩的数据
if (substr($get, 0, 2) == "\x1f\x8b") {
$get = gzdecode($get);
}
$html->load($get);
echo $html;
?>代码解释:
注意事项:
总结:
当使用 PHP Simple HTML DOM 抓取启用缓存的网站出现乱码时,通常是由于服务器返回了压缩数据。 通过使用 cURL 并设置 CURLOPT_ACCEPT_ENCODING 选项,或使用 gzdecode() 函数,可以有效地解决这个问题,确保能够正确抓取和解析网页内容。 在实际应用中,应根据具体情况选择合适的解决方案。
以上就是PHP Simple HTML DOM 抓取启用缓存的网站返回乱码的解决方案的详细内容,更多请关注php中文网其它相关文章!
HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号