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极简入门教程(二):定时器
Oct 25 NodeJs
Nodejs学习笔记之Stream模块
Jan 13 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
Aug 21 NodeJs
利用nodejs监控文件变化并使用sftp上传到服务器
Feb 18 NodeJs
NodeJs下的测试框架Mocha的简单介绍
Feb 22 NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 NodeJs
nodejs判断文件、文件夹是否存在及删除的方法
Nov 10 NodeJs
原生nodejs使用websocket代码分享
Apr 07 NodeJs
NodeJS搭建HTTP服务器的实现步骤
Oct 12 NodeJs
nodejs检测因特网是否断开的解决方案
Apr 17 NodeJs
nodejs搭建本地服务器并访问文件操作示例
May 11 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 base64+gzinflate压缩编码和解码代码
2008/10/03 PHP
YII路径的用法总结
2014/07/09 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
php单例模式的简单实现方法
2016/06/10 PHP
PHP数组操作简单案例分析
2016/10/15 PHP
php批量修改表结构实例
2017/05/24 PHP
php常用的工具开发整理
2019/09/26 PHP
Javascript 判断 object 的特定类转载
2007/02/01 Javascript
jQuery代码优化之基本事件
2011/11/01 Javascript
javascript克隆对象深度介绍
2012/11/20 Javascript
JS解决url传值出现中文乱码的另类办法
2013/04/08 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
Javascript 按位与运算符 (&amp;)使用介绍
2014/02/04 Javascript
js实现省市联动效果的简单实例
2014/02/10 Javascript
jquery ajaxSubmit 异步提交的简单实现
2014/02/28 Javascript
ionic组件ion-tabs选项卡切换效果实例
2016/08/27 Javascript
AngularJs directive详解及示例代码
2016/09/01 Javascript
原生js实现水平方向无缝滚动
2017/01/10 Javascript
js实现悬浮窗效果(支持拖动)
2017/03/09 Javascript
node.js-v6新版安装具体步骤(分享)
2017/09/06 Javascript
vue 使用eventBus实现同级组件的通讯
2018/03/02 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
nginx部署多个vue项目的方法示例
2020/09/06 Javascript
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
如何将你的应用迁移到Python3的三个步骤
2019/12/22 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
2020/09/04 Python
乌克兰鞋类购物网站:Eobuv.com.ua
2020/11/28 全球购物
非功能性需求都包括哪些方面
2013/10/29 面试题
我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
2014/03/30 面试题
万户网络JAVA程序员岗位招聘笔试试卷
2013/01/08 面试题
《我为你骄傲》教学反思
2014/02/20 职场文书
小学数学课后反思
2014/04/23 职场文书
法律讲堂观后感
2015/06/11 职场文书
PHP判断是否是json字符串
2021/04/01 PHP
为什么mysql字段要使用NOT NULL
2021/05/13 MySQL