PHP中Curl抓取网页乱码的解决方法

2021年09月8日

原创内容,转载请注明出处:https://www.myzhenai.com.cn/post/3903.html

我另外一个博客中有一个我自己写的抓取其他网页页面的源码,之前在调试的时候没有问题,发布后的一段时间内容也没有什么问题,但突然之间我发现抓取功能不起作用了,右键查看源文件里看到获取的数据是空的。

我重新查看了我的源代码,并在服务器上进行了好几次的调试,甚至我重新抓包查看了对方网站数据。

刚开始的时候我以为是我服务器IP被对方服务器封了,所以我将源代码发给我另外一个朋友进行了调试,发现不是这个原因。

接着我怀疑会不会是对方更新了算法,对程序进行了加密,但我在源码里对获取数据的模块变量做了一个echo输出,才知道,获取到的数据是乱码的。

刚开始看到乱码的时候,我以为是对方开发人员对数据进行加密了,所以我放弃了几天。

今天,我尝试着在源代码里对获取的数据进行字符集转换,但无论怎么转换,得到的都是乱码。

搜索了一天,终于在一个C#程序员写的一个思路才赫然开朗。

原来问题出在我Post的header数据头里,我在源码里添加了一行 ‘Accept-Encoding:gzip, deflate, br’, 把它删除后,问题解决了,因为这是gzip压缩导致的乱码。

$cars = $GLOBALS['ua'];
$header = array(
    "POST {$ii} HTTP/2.0",
    "Host: {$web} ",
    "filename: {$id} ",
    "Referer: {$ii} ",
    "Content-Type: text/html",
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5,application/signed-exchange;v=b3',
    'Accept-Encoding:gzip, deflate, br',
    'Accept-Language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
    'Connection:keep-alive',
    "Cookie: {$cars[1]}",
    "User-Agent: {$cars[0]}",
    "X-FORWARDED-FOR:180.149.134.142",
    "CLIENT-IP:180.149.134.142",
);
echo "header:  {$header[0]}<br>{$header[1]}<br>{$header[2]}<br>{$header[3]}<br>{$header[4]}<br>{$header[5]}<br>{$header[6]}<br>{$header[7]}<br>{$header[8]}<br>{$header[9]}<br>{$header[10]}<br>{$header[11]}<br>{$header[12]}<br>{$header[13]}<br>";
return $header;

删除以下这一行问题就解决了。

'Accept-Encoding:gzip, deflate, br',

 


sicnature ---------------------------------------------------------------------
I P 地 址: 18.97.14.90
区 域 位 置: 美国马萨诸塞
系 统 信 息: 美国
Original content, please indicate the source:
同福客栈论坛 | 蟒蛇科普海南乡情论坛 | JiaYu Blog
sicnature ---------------------------------------------------------------------
Welcome to reprint. Please indicate the source http://www.myzhenai.com/post/3903.html

没有评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注