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下打包模块archiver详解
Dec 03 NodeJs
Nodejs实现多人同时在线移动鼠标的小游戏分享
Dec 06 NodeJs
Windows系统下使用Sublime搭建nodejs环境
Apr 13 NodeJs
nodejs创建web服务器之hello world程序
Aug 20 NodeJs
NodeJs的优势和适合开发的程序
Aug 14 NodeJs
Nodejs 搭建简单的Web服务器详解及实例
Nov 30 NodeJs
nodejs实例解析(输出hello world)
Jan 03 NodeJs
让nodeJS支持ES6的词法----babel的安装和使用方法
Jul 31 NodeJs
nodejs中方法和模块用法示例
Dec 24 NodeJs
nodejs实现的http、https 请求封装操作示例
Feb 06 NodeJs
NodeJS模块Buffer原理及使用方法解析
Nov 11 NodeJs
NodeJs内存占用过高的排查实战记录
May 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
zf框架的Filter过滤器使用示例
2014/03/13 PHP
分享PHP-pcntl 实现多进程代码
2016/09/30 PHP
Laravel中的Auth模块详解
2017/08/17 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
laravel解决迁移文件一次删除创建字段报错的问题
2019/10/24 PHP
JAVASCRIPT IE 与 FF中兼容问题小结
2009/02/18 Javascript
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
window.opener用法和用途实例介绍
2013/08/19 Javascript
表单提交前触发函数返回true表单才会提交
2014/03/11 Javascript
jQuery实现的多选框多级联动插件
2014/05/02 Javascript
浅谈Javascript数据属性与访问器属性
2016/07/26 Javascript
layui分页效果实现代码
2017/05/19 Javascript
react系列从零开始_简单谈谈react
2017/07/06 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
JS代码实现电脑配置检测功能
2018/03/21 Javascript
Vue使用json-server进行后端数据模拟功能
2018/04/17 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
解决layui动态加载复选框无法选中的问题
2019/09/20 Javascript
LayUI switch 开关监听 获取属性值、更改状态的方法
2019/09/21 Javascript
VueCli生产环境打包部署跨域失败的解决
2020/11/13 Javascript
Python中非常实用的一些功能和函数分享
2015/02/14 Python
Python实现周期性抓取网页内容的方法
2015/11/04 Python
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
Python代码实现KNN算法
2017/12/20 Python
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
python学生管理系统开发
2019/01/30 Python
在pycharm中实现删除bookmark
2020/02/14 Python
Python修改列表值问题解决方案
2020/03/06 Python
基于Python共轭梯度法与最速下降法之间的对比
2020/04/02 Python
五一手机促销方案
2014/03/08 职场文书
店面出租协议书范本
2014/11/28 职场文书
2015年志愿者服务工作总结
2015/04/20 职场文书
运动员代表致辞
2015/07/29 职场文书
Nginx反向代理多个服务器的实现方法
2021/03/31 Servers
使用Django框架创建项目
2022/06/10 Python