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 url验证(url-valid)的使用方法
Nov 18 NodeJs
nodejs npm包管理的配置方法及常用命令介绍
Jun 05 NodeJs
Google官方支持的NodeJS访问API,提供后台登录授权
Jul 29 NodeJs
Nodejs为什么选择javascript为载体语言
Jan 13 NodeJs
nodejs个人博客开发第三步 载入页面
Apr 12 NodeJs
nodejs 图片预览和上传的示例代码
Sep 30 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 NodeJs
解决nodejs的npm命令无反应的问题
May 17 NodeJs
Nodejs中获取当前函数被调用的行数及文件名详解
Dec 12 NodeJs
NodeJS http模块用法示例【创建web服务器/客户端】
Nov 05 NodeJs
nodejs实现百度舆情接口应用示例
Feb 07 NodeJs
一文秒懂nodejs中的异步编程
Jan 28 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
动态网站web开发 PHP、ASP还是ASP.NET
2006/10/09 PHP
php实现用于删除整个目录的递归函数
2015/03/16 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
php实现的SSO单点登录系统接入功能示例分析
2016/10/12 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
javascript实现的在当前窗口中漂浮框的代码
2010/03/15 Javascript
Jquery实现控件的隐藏和显示实例
2014/02/08 Javascript
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
JavaScript 动态三角函数实例详解
2017/01/08 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
详解nodejs微信公众号开发——4.自动回复各种消息
2017/04/11 NodeJs
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
react 实现页面代码分割、按需加载的方法
2018/04/03 Javascript
微信小程序实现自定义picker选择器弹窗内容
2020/05/26 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
Python Socket编程入门教程
2014/07/11 Python
python实现的重启关机程序实例
2014/08/21 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
快速了解Python开发中的cookie及简单代码示例
2018/01/17 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
python3 property装饰器实现原理与用法示例
2019/05/15 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
Python的matplotlib绘图如何修改背景颜色的实现
2019/07/16 Python
python实现处理mysql结果输出方式
2020/04/09 Python
浅谈django 重载str 方法
2020/05/19 Python
Python爬虫实现HTTP网络请求多种实现方式
2020/06/19 Python
详解html5 canvas常用api总结(二)--绘图API
2016/12/14 HTML / CSS
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
Jdbc数据访问技术面试题
2012/03/30 面试题
水电工岗位职责
2015/02/14 职场文书
golang正则之命名分组方式
2021/04/25 Golang
利用nginx搭建RTMP视频点播、直播、HLS服务器
2022/05/25 Servers
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript