PHP Simple HTML DOM 解析启用缓存的网站返回乱码问题的解决方案

DDD
发布: 2025-08-15 18:48:17
原创
664人浏览过

php simple html dom 解析启用缓存的网站返回乱码问题的解决方案

本文旨在解决在使用 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'); // 设置 User-Agent
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;

?>
登录后复制

代码解释:

存了个图
存了个图

视频图片解析/字幕/剪辑,视频高清保存/图片源图提取

存了个图 17
查看详情 存了个图
  1. curl_init(): 初始化 cURL 会话。
  2. curl_setopt($curl, CURLOPT_URL, $url): 设置要抓取的 URL。
  3. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true): 设置为 true,表示将 cURL 传输的结果作为字符串返回,而不是直接输出。
  4. curl_setopt($curl, CURLOPT_USERAGENT, 'Chrome/94.0.4606.81'): 设置 User-Agent,模拟浏览器访问。这有助于避免被服务器识别为爬虫而拒绝访问。
  5. curl_setopt($curl, CURLOPT_ACCEPT_ENCODING, ""): 关键设置。 "" 表示接受服务器支持的所有编码类型(例如 gzip, deflate)。 cURL 会自动处理服务器返回的压缩数据。
  6. curl_exec($curl): 执行 cURL 会话,获取网页内容。
  7. curl_close($curl): 关闭 cURL 会话,释放资源。
  8. $html = new simple_html_dom(): 创建 Simple HTML DOM 对象。
  9. $html->load($html_content): 将获取到的 HTML 内容加载到 Simple HTML DOM 对象中。
  10. echo $html: 输出解析后的 HTML 内容。

方案二:使用 gzdecode() 函数

如果服务器返回的是 gzip 压缩的数据,但 cURL 无法自动解压缩,可以使用 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_content = file_get_contents($url,false,$context);

// 检查是否是 gzip 压缩的数据
if (substr($html_content, 0, 2) == "\x1f\x8b") {
    $html_content = gzdecode($html_content);
}

$html = new simple_html_dom();
$html->load($html_content);

echo $html;

?>
登录后复制

代码解释:

  1. file_get_contents($url,false,$context): 使用 file_get_contents 函数获取网页内容。
  2. substr($html_content, 0, 2) == "\x1f\x8b": 检查 HTML 内容的前两个字节是否为 gzip 压缩的 magic number \x1f\x8b。
  3. gzdecode($html_content): 如果检测到是 gzip 压缩的数据,则使用 gzdecode() 函数进行解压缩。 如果你的 PHP 版本低于 5.4,可能需要使用 gzinflate() 函数代替,并进行一些额外的处理。
  4. $html = new simple_html_dom(): 创建 Simple HTML DOM 对象。
  5. $html->load($html_content): 将获取到的 HTML 内容加载到 Simple HTML DOM 对象中。
  6. echo $html: 输出解析后的 HTML 内容。

注意事项:

  • 在使用 gzdecode() 函数之前,务必确认服务器返回的数据确实是 gzip 压缩的,否则可能会导致解压缩失败,产生错误。
  • 某些网站可能会使用其他的压缩方式,例如 deflate。 如果遇到这种情况,需要使用相应的解压缩函数进行处理。
  • 在使用 cURL 或 file_get_contents 获取网页内容时,建议设置 User-Agent,模拟浏览器访问,避免被服务器识别为爬虫而拒绝访问。
  • 有些网站可能对爬虫有更严格的限制,例如验证码、IP 限制等。 需要根据实际情况采取相应的应对措施。

总结:

当使用 PHP Simple HTML DOM 解析启用缓存的网站返回乱码时,通常是由于缓存机制返回了压缩后的数据,而 Simple HTML DOM 无法自动处理。 通过使用 cURL 并设置 CURLOPT_ACCEPT_ENCODING 选项,或者使用 gzdecode() 函数手动解压缩,可以有效解决此问题,确保能够正确解析网站内容。 在实际应用中,应根据具体情况选择合适的解决方案,并注意处理可能出现的其他问题,例如 User-Agent 设置、反爬虫机制等。

以上就是PHP Simple HTML DOM 解析启用缓存的网站返回乱码问题的解决方案的详细内容,更多请关注php中文网其它相关文章!

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号