node爬虫解决网页编码为gb2312结果为乱码的方法

最近需要对某消防网站进行宣传力度区域进行统计,使用一般采用的http模块进行数据抓取的时候发现结果是乱码,翻看原网站才发现,该消防网站是gb2312的编码,而http模块爬出的数据不能进行gbk解析,因此本片文章主要为解决用node对网站编码为gb2312爬虫时得到乱码这一问题。

1. 使用工具:webstorm,node开发神器,强烈推荐

2. 再说思路:先对新闻列表页面进行爬虫,再对抓到的链接一一进行目标网页的标题显示和新闻来源的统计,本页面新闻统计完毕后再跳转下一页,重新进行该过程。

备注:至于为什么不采用的“先对一篇文章进行目标内容获取,再对‘下一篇’进行地址获取”这个方式,是因为,该消防网站的下一篇与新闻列表顺序不符 /手动微笑脸

3. 代码如下:

 1 var http = require("http");
 2 var fs = require("fs");
 3 var cheerio = require("cheerio");
 4 var charset = require("superagent-charset");
 5 var agent = require("superagent");
 6 charset(agent); //
 7
 8 var obj = {};
 9
10 var page = 1;   // 开始页码
11 var MAXPAGE = 38;   // 结束页码
12
13 var num = 0;    // 记录条数
14
15 var url = "http://www.cqfire.com/xxzx/news.asp?class1=%D0%C2%CE%C5%D6%D0%D0%C4&class2=%CA%D0%C4%DA%D0%C2%CE%C5";
16
17 startRequest(url + "&PageNo=" + page, 0);
18 function startRequest(site, flag){
19     var html = ‘‘;
20     var resStr = ‘‘;
21     agent.get(site).charset(‘gbk‘).end((err, res) => {
22         html = res.text;
23         var $ = cheerio.load(html);  // 采用cheerio模块解析html
24
25         if(flag == 0){
26             // 如果flag为0,表示列表页面,需要对页面进行解析
27             var eles = $("a").not(".nav_menu").not(".left_menu_class").not(".copy_menu");
28             for(var i = 0 ; i < eles.length; i ++){
29                 // 将提取出a中的url传入flag为1的本方法中
30                 var target = "http://www.cqfire.com/" + eles.eq(i).attr("href");
31                 startRequest(target, 1);
32             }
33
34             if(page < MAXPAGE){
35                 // 如果未达到最大页数,则进行下一页,传入flag为0
36                 page ++;
37                 console.log(url + "&PageNo=" + page);
38                 startRequest(url + "&PageNo=" + page, 0);
39             }
40         }else{
41             // 如果flag为1,则表示为具体新闻页面,需要对标题和来源进行提取
42             // 获取新闻标题
43             var title = $("span.STYLE2").text().trim();
44             // 获取新闻来源
45             var origin = $("span.STYLE2").parent().parent().parent().parent().parent().next().find("td[align=‘middle‘]").text().trim();
46             var from = origin.split(" ")[0].split(":")[1];
47
48             num++;  // num表示当前新闻的条数
49             console.log(num +"-->"+title);
50
51             // 将来源为key,统计个数为value存入结果对象中
52             if(!obj[from]){
53                 obj[from] = 0;
54             }
55             obj[from] += 1;
56
57             for(var key in obj){
58                 resStr += key + ‘\t‘ + obj[key] + ‘\n‘;
59             }
60             // 将结果以字符串的形式存入txt中,这里要使用同步方法,否则输出会出现很多null,但是txt文档中统计结果与同步方法一致,这里不解
61             fs.writeFileSync(‘./data/result.txt‘, resStr, ‘utf-8‘, function (err) {
62                 console.log(err);
63             })
64         }
65
66     })
67
68 }

4. 使用的是superagent,superagent-charset两个插件,在第21行使用charset()方法,也可以不传入参数表示自动检测网页的编码方式;

5. 利用cheerio包对目标网页DOM结构进行解析,获取目标内容的方法与jQuery方法一致

总结:

利用node进行爬虫的关键点有三点:

1. 如何获取“下一页”的地址,本方法中使用的网页中国PageNo参数,这一点需要在确定爬虫方式之后,找到规律

2. 在目标页如何获取目标内容,这需要对文档结构进行观察,本方法中使用的cherrio包,其获取目标内容的方法与jQuery一致,也是node爬虫的主流选择

3. 如何结束递归,本方法是确定最大页数,也可以设置最大条数,也可以进行手动结束递归,但要注意做好已经爬好的数据的记录

时间: 2024-12-28 02:47:55

node爬虫解决网页编码为gb2312结果为乱码的方法的相关文章

爬虫 解决网页ip限制的问题的八种方法

方法1. 之前由于公司项目需要,采集过google地图数据,还有一些大型网站数据. 经验如下: 1.IP必须需要,像@alswl 说的非常正确,ADSL.如果有条件,其实可以跟机房多申请外网IP. 2.在有外网IP的机器上,部署代理服务器. 3.你的程序,使用轮训替换代理服务器来访问想要采集的网站. 好处: 1.程序逻辑变化小,只需要代理功能. 2.根据对方网站屏蔽规则不同,你只需要添加更多的代理就行了. 3.就算具体IP被屏蔽了,你可以直接把代理服务器下线就OK,程序逻辑不需要变化. 方法2.

Android:解决客户端从服务器上获取数据乱码的方法

向服务器发送HTTP请求,接收到的JSON包为response,用String content = EntityUtils.toString(response.getEntity(),"utf-8");解码还是出现了中文乱码,在后面加了 String name = new String(response.getBytes("iso-8859-1"), "UTF-8"); 也无济于事.想到服务器好像是用URLENCODER编了码的,怀着试一试的态度

解决Ubuntu 12.10中ZIP文件名乱码的方法

转摘源地址:http://blog.csdn.net/jiangxinyu/article/details/8206395 安装(12.04及以上): 代码: sudo apt-get install unar 假设需要解压的ZIP包是foo.zip 代码: lsar foo.zip #列出所有文件 如果列出的文件名已经正确 代码: unar foo.zip #解压所有文件 如果列出的文件名还不正确 代码: lsar -e GB18030 foo.zip #指定使用GB18030编码列出所有文件

Android:解决client从server上获取数据乱码的方法

向server发送HTTP请求.接收到的JSON包为response,用String content = EntityUtils.toString(response.getEntity(),"utf-8");解码还是出现了中文乱码,在后面加了 String name = new String(response.getBytes("iso-8859-1"), "UTF-8"); 也无济于事. 想到server好像是用URLENCODER编了码的.怀

c# 获取网页源码,自动判断编码格式新方法!(转)

因采集需求,想解决网页编码识别问题.网上提出了很多方法.比如根据文件头字节判断,或根据网页的charset标识符判断. 我在实际应用中,这些方法都有各自的不足,比如有的网页charset写的是gbk,但实际是utf8. 于是想了一个个人认为比较新鲜的方法.将html下载回来后,做一份utf8副本和一份gbk副本,然后将utf8转换为bytes,判断bytes内是否有乱码标识(连续三个byte表示为239 191 189),如果有,则表示为乱码,直接使用gbk,如果没有,则表示没有乱码,直接使用u

爬虫之网页乱码解决方法(gb2312 -&gt; utf-8)

前言 今天在测试爬虫项目时,发现了一个很严肃的问题,当爬取的网页编码格式为gb2312时,按照一般的办法转化为utf-8编码时总是乱码,PS:爬取的所有网页无论何种编码格式,都转化为utf-8格式进行存储. 一.问题出现 使用这篇文章里面的方法可以直接爬取页面信息并保存至本地使用Httpclient实现网页的爬取并保存至本地,当爬取这个网页时http://stock.10jqka.com.cn/zhuanti/hlw_list/,发现使用之前(未知编码 -> utf-8编码)的转化方式总是乱码.

解决新版chrome无法设置网页编码的问题

chrome55以后 就移除了设置网页编码的功能,这时我们可以去chrome应用商店 搜索Set Character Encoding 这个扩展插件,安装后右键单击网页即可选择网页编码,如下图所示 另外再推荐一个前端用的chrome扩展插件 叫FE助手,里面有一些实用的功能.

网页编码就是那点事

编码一直是让新手头疼的问题,特别是 GBK.GB2312.UTF-8 这三个比较常见的网页编码的区别,更是让许多新手晕头转向,怎么解释也解释不清楚.但是编码又是那么重要,特别在网页这一块.如果你打出来的不是乱码,而网页中出现了乱码,绝大部分原因就出在了编码上了.此外除了乱码之外,还会出现一些其他问题(例如:IE6 的 CSS 加载问题)等等.我写本文的目的,就是要彻底解释清楚这个编码问题!如果你遇到了类似的问题,那就要仔细的看看这篇文章. ANSI.GBK.GB2312.UTF-8.GB1803

做网站用UTF-8编码还是GB2312编码?

经常我们打开外国网站的时候出现乱码,又或者打开很多非英语的外国网站的时候,显示的都是口口口口口的字符, WordPress程序是用的UTF-8,很多cms用的是GB2312. ● 为什么有这么多编码? ● UTF-8和GB2312有什么区别? ● 我们在国内做网站是用UTF-8编码格式还是GB2312编码格式好? 一. 各种编码的来历 可能很多同学一直对字符的各种编码方式懵懵懂懂,根本搞不清为什么他们有这么多编码. ANSI编码 其实在很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合