上一篇
小物钓:选竿篇
喜欢某个网络小说,想下载txt,发现可供下载txt寥寥可数。txt下载成功后,文字排版乱,缺少章节等情况时有出现。最最最不可忍,下载txt过程特别慢,全民普及100M的网速,搁在这里只能龟速。
外部环境无法提供良好服务,唯有利用自身过硬的技术,服务于自己。网络小说早已存在互联网上,唯独缺少下载txt功能。利用Iframe引入网络小说页面,Jquery选择器获取数据,整合数据后,自动转换成txt。
Iframe页面加载成功后,Jquery选择器却出现意外情况。由于Iframe加载的页面属于第三方,触发保护机制:跨域。对此不能直接加载页面,需要用PHP的file_get_contents抓取HTML数据,拉回本地后再用Iframe渲染。
拉回来的数据,除了英文与数字,中文出乱码,原来被抓取的网页字符集使用GBK或GB2312。
PHPheader("Content-type: text/html; charset=utf-8");
$url = 'https://xxx.xxx.com'
$html = file_get_contents('compress.zlib://'.$url);
$html = iconv("GB2312", "UTF-8//IGNORE",$html);
print_r($html);
有些网站本身使用UTF-8字符集,如果再转义,正确也变错的。人工判断肯定不行,所以我们需要自动判断该网站是否UTF-8字符集。
PHP/**
* 是否UTF-8字符集
* @method isUtf8
* @param $str 字符串
* @return bool
*/
function isUtf8($str){
$len = strlen($str);
for($i = 0; $i < $len; $i++){
$c = ord($str[$i]);
if ($c > 128) {
if (($c > 247)) {
return false;
} else if ($c > 239) {
$bytes = 4;
} else if ($c > 223) {
$bytes = 3;
} else if ($c > 191) {
$bytes = 2;
} else {
return false;
}
if (($i + $bytes) > $len) {
return false;
}
while ($bytes > 1) {
$i++;
$b = ord($str[$i]);
if ($b < 128 || $b > 191) {
return false;
}
$bytes--;
}
}
}
return true;
}
优化后:
PHPheader("Content-type: text/html; charset=utf-8");
$url = 'https://xxx.xxx.com'
$html = file_get_contents('compress.zlib://'.$url);
if(!isUtf8($html)) {
$html = iconv("GB2312", "UTF-8//IGNORE",$html);
}
print_r($html);
最新评论Latest comments