Curl 采集乱码 gzip 原因及解决方案 utf-8
来源:互联网 发布:vb.net 打开文件 编辑:程序博客网 时间:2024/05/01 14:06
用curl获取一个经过gzip压缩后的网页时返回乱码
原因大体就是服务器返回的Content-Encoding的值和网页的编码不同,造成curl解码出问题,直接将gzip或deflate编码的文件下载了,所以看起来是乱码了。
Content-Encoding: gzip
读取前几个字节为:1F 8B 08 ,其中1F 8B表明为gzip压缩,而08表示为deflate压缩。
这样实际编码和通过Content-Encoding获取的编码不一样,所以curl解码出错,导致下载的是未解码的页面,也就是一堆乱码。
知道了原因,就有了解决方案了
可以通过读取下载的二进制文件的前3个字节,来判断是否是压缩文件
$curl=curl_init('http://www.163.com');
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl,CURLOPT_USERAGENT,'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)');
$html=curl_exec($curl);
var_dump($html);
$curl=curl_init('http://www.sohu.com');
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl,CURLOPT_USERAGENT,'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)');
$html=curl_exec($curl);
//$html=strstr($html,'<');
$html=gzdecode($html);
var_dump($html);
function gzdecode($data) {
}
还有文提到:
curl_setopt($this->curl,CURLOPT_ENCODING ,'gzip')
或
zlib库中的gzuncompress函数
shell用curl抓取页面乱码,参考一下2方面:
1.是用curl抓取的数据是用类似gzip压缩后的数据导致的乱码。
乱码:curl www.1ting.com | more
乱码:curl -H "Accept-Encoding: gzip" www.1ting.com | more
不乱码:curl -H "Accept-Encoding: gzip" www.1ting.com | gunzip | more
不乱码:curl www.1616.net | more
乱码:curl -H "Accept-Encoding: gzip" www.1616.net | more
不乱码:curl -H "Accept-Encoding: gzip" www.1616.net | gunzip | more
下面的a,b解释的是www.1ting.com,c,d解释是的www.1616.net
a.某个url,如果用不加任何选项的curl命令抓取后乱码,在curl后面加上Accept-Encoding: gzip,后面不加gunzip,则抓取的数据会乱码。
b.某个url,如果用不加任何选项的curl命令抓取后乱码,在curl后面加上Accept-Encoding: gzip,后面加上gunzip,则抓取的数据不会乱码。
c.某个url,如果用不加任何选项的curl命令抓取后不乱码,在curl后面加上Accept-Encoding: gzip,后面不加gunzip,则抓取的数据会乱码。
d.某个url,如果用不加任何选项的curl命令抓取后不乱码,在curl后面加上Accept-Encoding: gzip,后面加上gunzip,则抓取的数据不会乱码。
小总:
也就是说在curl后面加上Accept-Encoding: gzip,再用gunzip解压缩,则基本上可以保存数据不乱码。
2.GBK或者UTF8汉字之类的乱码
iconv命令是运行于linux平台的文件编码装换工具。当我们在linux系统shell下通过curl命令或者wget命令获取一个网页的源代码,当网页的编码与当前操作系统坏境的设置的编码不同时,就会发现网页中有很多乱码。如在网页"meta"标签"charset"属性值设置为"gb2312"的http://www.baidu.com百度首页,在系统坏境变量"$LANG"值为"en_US.UTF-8"的linux系统即会产生中文乱码现象。这时我们可以尝试使用iconv命令进行编码装换,让中文不在是乱码。如下命令是处理百度在系统坏境变量"$LANG"值为"en_US.UTF-8"的linux系统乱码的问题的解决方案之一:
curl http://www.baidu.com|iconv -f gb2312 -t utf-8
当然,你也通过改变系统坏境变量与百度首页的"charset"值一致,也可以解决此乱码问题,如下命令:
set LANG="gb2312"
export LANG
curl http://www.baidu.com
iconv命令的详细语法:
iconv [选项..] [文件..]
选项:
-f 输入编码
-t 输出编码
-l 列出所有已知的编码
-o 输出文件
对比采用PHP CURL库的POST GET HEADER三种方法之间的差异
比较POST GET HEADER这三种方法的区别:
参数
POST
GET
HEADER
CURLOPT_URL
有
有
有
CURLOPT_POST
开启
关闭
关闭
CURLOPT_HTTPHEADER
如果有$header,则开启
如果有$header,则开启
如果有$header,则开启
CURLOPT_HEADER
False
False
True
CURLOPT_NOBODY
false
False
true
CURLOPT_POSTFILEDS
True
false
false
从上表中可以看出:
POST方法:开启POST连接,然后发送POST报文体。关闭HEADER和NOBODY
GET方法:关闭POST相关的选项,关闭NOBODY HEADER,仅仅只是开启curlopt_httpheader
HEADER方法:开启HEADER和NOBODY,关闭POST相关的选项。
应该说上述三种方法,一个明显的区别是,箱采用什么方法的时候,就开启对应的CURL选项。
CURL_HTTPHEADER与CUROPT_HEADER的区别:
前者是设置HTTP头部信息的一个数组
后者是将头文件的信息以数据流的方式输出。
- Curl 采集乱码 gzip 原因及解决方案 utf-8
- utf-8乱码解决方案
- UTF-8乱码解决方案
- 采集之页面乱码及Curl模拟post请求
- Java读取txt或其他文件以UTF-8格式输出的时候,第一行代码出现“?”乱码的原因及解决方案!
- ajax中文乱码原因分析及解决方案
- ajax中文乱码原因分析及解决方案
- PDF复制乱码 -- 原因及解决方案
- Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取带有BOM的UTF-8文件乱码原因及解决办法
- Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读带有BOM的UTF-8文件乱码原因及解决方法
- 读取文本出现 锘 * 系列乱码错误(UTF-8 BOM问题)的原因及解决方法
- response乱码 response.setCharacterEncoding("UTF-8")不生效的原因及解决方法
- 采集网页时gzip乱码的解决办法
- UTF-8 GB2312 中文乱码解决方案汇总
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- JS 将函数作为参数传递调用
- 上帝是公平的,他在给你关上一道门的同时会给你打开一扇窗。这就是你为什么你的平安夜圣诞节元旦全都是一个人过的,但在那之后的考试周都会只有你一个人全不过。
- ubuntu14.04下opencv+eclipse(ADT)的配置注意事项
- MyEclipse自动提示Extjs和Jquery
- oracle数据库查询:查询父节点数据下的所有终结子节点
- Curl 采集乱码 gzip 原因及解决方案 utf-8
- android2.3 U盘自动挂载设置
- Hibernate 所有缓存机制详解
- iMatrix开发平台中默认管理员的功能
- js横向二级导航菜单
- CCProgressTimer进度条
- 【Leetcode】Scramble String
- 寻找和为定值的两个数
- DisplayMetrics 使用