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

DDD

DDD

2025-08-15

688人浏览

原创

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

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;

?>

代码解释:

ApiPost接口调试与文档生成工具
ApiPost接口调试与文档生成工具

ApiPost是一个支持团队协作,支持模拟POST、GET、PUT等常见请求,并可直接生成文档的API调试、管理工具,ApiPost是后台接口开发者或前端、接口测试人员的工作必备工具。快速生成、一键导出API文档。感兴趣的朋友快来下载吧。软件说明ApiPost官方版是一款十分出色的接口调试与文档生成工具,ApiPost官方版界面美观大方,功能强劲实用,支持团队协作,支持模拟POST、GET、PUT等常见请求,是后台接口开发者或前端、接口测试人员的工作必备工具。软件特色更方便支持接口调试的同时快速生成、一键

下载
  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免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

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

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

下载

相关标签:

浏览器 wordpress

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1974

5

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.06

2410

7

Chrome开启无痕模式
Chrome开启无痕模式

本专题整合了Chrome无痕模式开启相关内容,阅读专题下面的文章了解更多详细教程。

2026.03.24

2057

22

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

2023.06.14

2468

6

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

2023.10.30

411

4

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1154

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

1234

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

3266

49

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

2023.11.24

2189

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何在 Windows 11 上安装 XAMPP
如何在 Windows 11 上安装 XAMPP

共1课时 | 129人学习

第二十三期_前端开发
第二十三期_前端开发

共98课时 | 10.4万人学习