jae-jae / QueryList

:spider: The progressive PHP crawler framework! 优雅的渐进式PHP采集框架。
https://querylist.cc
2.65k stars 440 forks source link

谁研究过乱码的问题? #113

Closed aboutboy closed 3 years ago

aboutboy commented 4 years ago

好像是guzzlehttp的问题。 http://xiaohua.zol.com.cn/ 不管怎样都是乱码,后来只能临时用file_get_contents再加上手动转码。 但是我现在希望写一个通用的采集器,如果总是会遇到特殊情况的话,就很难用这个框架实现了。。

太痛苦。有没有曾经研究过这个问题的老鸟们?怎样直接修改guzzlehttp来永久性解决乱码问题呢?

aboutboy commented 4 years ago

参考:https://www.jianshu.com/p/67801d24d974 我临时找到了一个解决方案: 修改vendor/jaeger/g-http/src/GHttp.php这个文件,添加如下代码:

use GuzzleHttp\Psr7;

$client = self::getClient(); $response = $client->request('GET', $url,$args); // 转换成页面使用的编码,默认为UTF-8,否则乱码! $type = $response->getHeader('content-type'); $parsed = Psr7\parse_header($type); $original_body = (string)$response->getBody(); $utf8_body = mb_convert_encoding($original_body, 'UTF-8', $parsed[0]['charset'] ?: 'UTF-8');

    //return (string)$response->getBody();
return $utf8_body;

希望作者看看能否改进一下?

aboutboy commented 4 years ago

上面的方法也不是很好。因为有时候无法获取到charset,就仍然会出现乱码。 我现在这样做似乎比较完美了,就是当网页编码不是utf-8时,用laravel自带的http方法获取网页数据,再进行编码转换。 不过我不明白的是,laravel自带的http方法本质上也是用的guzzlehttp,为什么我之前直接用querylist::get方法获取网页数据再编码转换就总还是乱码?

if($charset != 'utf-8'){ $detailhtml = Http::get($detailurl,[],$options)->body(); $detailhtml = mb_convert_encoding($detailhtml,'UTF-8','GBK'); $detailhtml = preg_replace('/<meta[^<>]charset[^<>]?>/i', '', $detailhtml); $detailql->setHtml($detailhtml); } $detaildata = $detailql->rules($detailrule)->range($detailrange)->query()->getData();

jae-jae commented 3 years ago

已升级 guzzlehttp 为最新版本