nodejs爬虫遇到的乱码问题汇总


Posted in NodeJs onApril 07, 2017

上一篇文章中使用nodejs程序解析了网页编码为gbk,gb2312,以及utf-8的情况,这里面有三种特殊的乱码情况需要单独的说明一下.

1,网页编码为utf-8,但是解析为乱码,代表网站为www.guoguo-app.com。

这个问题真是个逗逼问题,查看网页源码中给出的编码方式为utf8,如下:

<meta charset="UTF-8">
<title>查快递</title>

由于解析出来的始终是乱码,我就抓包看了下,报文中的编码方式为gbk,果然我使用gbk的方式之后,得到的不再是乱码了。淘宝为了反爬虫也是操碎了新,但是我也很好奇这种方式是怎么实现的,知道的告诉我。

GET / HTTP/1.1
Host: www.guoguo-app.com
Connection: close

HTTP/1.1 200 OK
Date: Thu, 06 Apr 2017 01:56:23 GMT
Content-Type: text/html;charset=GBK
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding
Vary: Accept-Encoding
Content-Language: zh-CN
Server: Tengine/Aserver

1,网页编码为utf-8,解析为乱码情况二,代表网站http//andersonjiang.blog.sohu.com/

单纯的查看网页源码看不出任何毛病,于是我又抓了一次包,得到如下情形:

GET / HTTP/1.1
Host: andersonjiang.blog.sohu.com
Connection: close

HTTP/1.1 200 OK
Content-Type: text/html; charset=GBK
Transfer-Encoding: chunked
Connection: close
Server: nginx
Date: Thu, 06 Apr 2017 02:10:33 GMT
Vary: Accept-Encoding
Expires: Thu, 01 Jan 1970 00:00:00 GMT
RHOST: 192.168.110.68@11177
Pragma: No-cache
Cache-Control: no-cache
Content-Language: en-US
Content-Encoding: gzip
FSS-Cache: MISS from 13539701.18454911.21477824
FSS-Proxy: Powered by 9935166.11245896.17873234

andersonjiang.blog.sohu.com这个网站同时采用了Transfer-Encoding: chunked传输编码和Content-Encoding: gzip内容编码功能,由于nodejs爬虫没有gzip解包功能,因此该网站提取不到任何字段,即title和charset等。要想提取此类网站则要添加gzip解包功能。

下面两个网站www.cr173.com以及www.csdn.net是正常的抓包情况。

GET / HTTP/1.1
Host: www.cr173.com
Connection: close

HTTP/1.1 200 OK
Expires: Thu, 06 Apr 2017 02:42:20 GMT
Date: Thu, 06 Apr 2017 02:12:20 GMT
Content-Type: text/html
Last-Modified: Thu, 06 Apr 2017 00:52:42 GMT
ETag: "96a4141970aed21:0"
Cache-Control: max-age=1800
Accept-Ranges: bytes
Content-Length: 158902
Accept-Ranges: bytes
X-Varnish: 1075189606
Via: 1.1 varnish
X-Via: 1.1 dxxz46:4 (Cdn Cache Server V2.0), 1.1 oudxin15:1 (Cdn Cache Server V2.0)
Connection: close
GET / HTTP/1.1
Host: www.csdn.net
Connection: close

HTTP/1.1 200 OK
Server: openresty
Date: Thu, 06 Apr 2017 02:18:59 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 99363
Connection: close
Vary: Accept-Encoding
Last-Modified: Thu, 06 Apr 2017 02:10:02 GMT
Vary: Accept-Encoding
ETag: "58e5a37a-18423"
Accept-Ranges: bytes

3,网页编码为其他形式的编码,解析为乱码,例如:

(1)编码为Big5,代表网站为 www.ruten.com.tw, www.ctgoodjobs.hk

(2)编码为Shift_JIS,代表网站为www.vector.co.jp,www.smbc.co.jp

(3)编码为windows-12,代表网站为www.tff.org,www.pravda.com.ua

(4)编码为EUC-JP,代表网站为www.showtime.jp

(5)编码为EUC-KR ,代表网站为www.incruit.com,www.samsunghospital.com,

由于iconv-lite的说明中支持如下的编码方式:

Currently only a small part of encodings supported:

All node.js native encodings: 'utf8', 'ucs2', 'ascii', 'binary', 'base64'.
 Base encodings: 'latin1'
 Cyrillic encodings: 'windows-1251', 'koi8-r', 'iso 8859-5'.
 Simplified chinese: 'gbk', 'gb2313'.

Other encodings are easy to add, see the source. Please, participate
因此对于上述出现的网页编码,只有自己添加解码方式加以解决了。

总之要写一个通用的爬虫程序还有很长的路要走。

NodeJs 相关文章推荐
nodejs中实现sleep功能实例
Mar 24 NodeJs
Nodejs学习笔记之测试驱动
Apr 16 NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 NodeJs
详解Nodejs之静态资源处理
Jun 05 NodeJs
nodejs 子进程正确的打开方式
Jul 03 NodeJs
基于nodejs+express4.X实现文件下载的实例代码
Jul 13 NodeJs
Nodejs 复制文件/文件夹的方法
Aug 24 NodeJs
详解nodejs通过响应回写的方式渲染页面资源
Apr 07 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
PHPStorm中如何对nodejs项目进行单元测试详解
Feb 28 NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 10 NodeJs
详解nodejs爬虫程序解决gbk等中文编码问题
Apr 06 #NodeJs
NodeJS基础API搭建服务器详细过程记录
Apr 01 #NodeJs
Ajax异步文件上传与NodeJS express服务端处理
Apr 01 #NodeJs
3分钟快速搭建nodejs本地服务器方法运行测试html/js
Apr 01 #NodeJs
nodejs使用express创建一个简单web应用
Mar 31 #NodeJs
nodejs实现邮件发送服务实例分享
Mar 29 #NodeJs
NodeJs测试框架Mocha的安装与使用
Mar 28 #NodeJs
You might like
php Http_Template_IT类库进行模板替换
2009/03/19 PHP
生成随机字符串和验证码的类的PHP实例
2013/12/24 PHP
php邮箱地址正则表达式验证
2015/11/13 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
JavaScript Prototype对象
2009/01/07 Javascript
页面中js执行顺序
2009/11/09 Javascript
js实现兼容IE6与IE7的DIV高度
2010/05/13 Javascript
利用JQuery的load函数动态加载其它页面的内容的实现代码
2010/12/14 Javascript
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
jQuery实现动画效果的简单实例
2014/01/27 Javascript
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
2016/01/12 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
JavaScript中闭包的写法和作用详解
2016/06/29 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
2017/02/04 Javascript
JavaScript禁止微信浏览器下拉回弹效果
2017/05/16 Javascript
详解webpack和webpack-simple中如何引入css文件
2017/06/28 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
vue--vuex详解
2019/04/15 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
python 安装virtualenv和virtualenvwrapper的方法
2017/01/13 Python
Python中的探索性数据分析(功能式)
2017/12/22 Python
python判断设备是否联网的方法
2018/06/29 Python
Python中new方法的详解
2019/01/15 Python
python颜色随机生成器的实例代码
2020/01/10 Python
基于python实现模拟数据结构模型
2020/06/12 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
adidas菲律宾官网:adidas PH
2020/02/07 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
社会公德演讲稿
2014/05/20 职场文书
体育专业求职信
2014/07/16 职场文书
圆明园观后感
2015/06/03 职场文书