使用nodejs抓取时,出现问题(详看正文)

newsList和newsDetail单独拿出来调试没有问题。但如下放在一起时,提示

 body is not defined

经多次调试,错误节点应该是出现在readNewsDetail()中

 // 转换 gbk 编码的网页内容
        body2 = iconv.decode(body, 'gbk');

        // 根据网页内容创建DOM操作对象
        var $ = cheerio.load(body2);

这两句。因为直接 var $ = cheerio.load(res.body.toString()); 的话,不会报错。但这样一来,输出的就是乱码了,所以必须转码。但一按照我的写法转码,就会报错……
请教各位,这个问题应该怎么解决?谢谢!!!

源码:

 var request = require('request');
var cheerio = require('cheerio');
var iconv = require('iconv-lite');
var async = require('async');
var debug = require('debug')('sina1:update');

/**
 * 获取新闻列表
 */
function readNewsList(url, callback) {
    debug('读取新闻列表:%s', url);

    request(url, function(err, res) {
        if (err) return callback(err);

        // 根据网页内容创建DOM操作对象
        var $ = cheerio.load(res.body.toString());

        // 读取新闻列表
        var newsList = [];
        $('.news-item').each(function() {
            var $me = $(this);
            var $title = $me.find('h2 a');
            var $time = $me.find('.time');
            var $url = $me.find('h2 a');

            var item = {
                title: $title.text().trim(),
                url: $url.attr('href'),
                time: $time.text().trim()
            };

            newsList.push(item);
        });

        // 返回结果
        callback(null, newsList);
    });
}


/**
 * 获取新闻页面内容
 */
function readNewsDetail(url, callback) {
    debug('读取新闻内容:%s', url);

    request(url, function(err, res) {
        if (err) return callback(err);

        // 转换 gbk 编码的网页内容
        body2 = iconv.decode(body, 'gbk');

        // 根据网页内容创建DOM操作对象
        var $ = cheerio.load(body2);

        // 获取正文内容

        var newsDetail = [];
        $('.article').each(function() {
            var $me = $(this);
            var $img = $me.find('.img_wrapper img');

            var item = {
                content: $me.html().trim(),
                img: $img.attr('src')
            };

            newsDetail.push(item);

        });
        // 返回结果
        callback(null, newsDetail);
    });
}

// 读取列表下的所有新闻
readNewsList('http://news.sina.com.cn/china/', function(err, newsList) {
    if (err) return console.error(err.stack);

    // 依次取出 newsList 数组的每个元素,调用第二个参数中传入的函数
    // 函数的第一个参数即是 newsList 数组的其中一个元素
    // 函数的第二个参数是回调函数
    async.eachSeries(newsList, function(news, next) {

        // 读取新闻正文
        readNewsDetail(news.url, function(err, detail) {
            console.log(detail);
//          if (err) console.error(err.stack);
//
//          // 直接显示
//          console.log(detail);
//
//
//          // 需要调用 next() 来返回
//          next();
        });

    }, function(err) {
        // 当遍历完 newsList 后,执行此回调函数

        if (err) return console.error(err.stack);

        console.log('完成');
    });

});

2个回答

你这个body没有定义啊。图片说明

把body换成res.body。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
node.js新闻爬虫、新闻正文抓取,项目效果图
项目详细介绍请参考博客 :http://blog.csdn.net/kissliux/article/details/19560603 项目源码开源在github:https://github.com/kissliux/rssSpider   项目旨在提供免费的新闻列表和新闻正文服务,目前没有找到合适的服务器。 哪位大神有服务器可以放一个node.js应用程序的 请联系我,跪谢
使用NodeJs,实现数据抓取
学习笔记 前言 近期做一个数据抓爬工具,最开始使用的是C#控制台应用,同时正则表达式去过滤数据,看着还行,可每次运行都依附于.net framework很是不爽,于是想整点其他的方法。本人还是比较喜欢javascript的,思来想去决定用服务器端的javascript来试试! 环境、工具准备 1、[必装] 安装nodejs,下载最新nodejs,点击此处 2、[选装] 安装iisnode
oracle运行出现问题记录+解决方法
昨天安装好的orale,当时监听都是设置好的,使用sqlplus打开也是正常的,但是今天使用的时候,出现了两个问题。 一、sqlplus不能使用,报错:error 6 initializing SQL*PLUS,照我的理解是未能初始化       解决方法:百度了一圈终于明白是因为没有设置环境变量,按理说,安装Oracle的时候环境变量是自动设置好的,为什么出现此情况,后来看了环境变量的路径才
小巧的抓点抓色工具,内附放大镜。抓取时要保持窗体在前
小巧的抓点抓色工具,内附放大镜。抓取时要保持窗体在前
如何设置fiddler对nodejs进行抓包
1.设置fiddler的远程客户端代理开启 tool—>fiddlerOptions—>connections—>AllowRemote computers to connect (勾选) 2.使用nodejs的request模块进行请求 const request = require('request'); const http = request.defaults({ proxy:
NodeJs抓取新闻正文和正文中的图片
最新做一个新闻项目,项目流程很简单,使用nodejs去网络上面抓取新闻,存到mongodb数据库,然后对客户端提供http服务。客户端的实现网上有很多源码,上一篇文字介绍了,怎么从rss地址抓取新闻的url地址和链接等等,未抓取新闻正文和新闻的概要图片。对于一个新闻客户端来说,没有图片是致命的打击,图文并茂才能吸引用户 。 本文来解决抓取正文和图片的问题。 上一篇文章
python beautifulsoup 抓取网页正文内容
使用python 的 beautifulsoup 来抓取网页
【Jsoup】抓取文章并定制
关于Jsoupjsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。同类产品横向对比,从上图咋一看感觉 Jsoup 比名声大噪的 bs 还厉害的样子。 行吧先来试用一下看起来灰常全面的 Jsoup 。String html = "<html><head><titl
【实例】python 使用beautifulSoup 抓取网页正文 以淘宝商品价格为例
参考文章:利用BeautifulSoup抓取新浪网页新闻的内容使用Requests库和BeautifulSoup库来爬取网页上需要的文字与图片-------------------------------------------------------------------&amp;gt;&amp;gt;&amp;gt; import requests&amp;gt;&amp;gt;&amp;gt; import re&amp;gt;&amp;gt;&amp;gt;...
MT2503 win764 USB驱动
MT2503 win764 USB驱动,SP_Drivers_EXE_v1.6.rar,Win7 64位可以用,用于固件下载,LOG抓取时的驱动安装。
使用Vivado抓取信号波形的使用说明
由于项目工作需要,芯片换成V7,最近也开始使用Vivado进行编译、仿真等。这里有很多好的文章,但是大部分是理论型的,而且很深奥,刚接触Vivado 的工程师肯定看不懂。所以,今天在这里跟大家分享下怎么用Vivado来抓信号波形,实实在在的在日常的工程中会用到,不用自己摸索,一学就会。下面开始: 1、先综合一遍,然后在综合的“flatten_hierarchy”选项设置"none".
reptile-liam-201466161358.rar
抓取时光网电影信息,缓存时间为一天,有问题可以留言给我
armlog获取工具
在我们对开机过程中异常现象进行log抓取时,此工具就派上用场了
正文提取
目前互联网上公布出来的正文提取算法,大家可以综合比较下,一起来测试下哪个更好用。 词网--北京词网科技有限公司 http://demo.cikuu.com/cgi-bin/cgi-contex 猎兔网页正文提取 http://www.lie 目前互联网上公布出来的正文提取算法,大家可以综合比较下,一起来测试下哪个更好用。 词网--北京词网科技有限公司http://demo.cikuu.com
网页正文提取算法介绍
查找发现了两个比较好的网页正文提取算法: 国内:哈工大的《基于行块分布函数的通用网页正文抽取》该算法开源网址为http://code.google.com/p/cx-extractor/,效果为亲测,文章中呈准确率95%以上,对1000个网页抽取耗时21.29秒。看了文章感觉不错,无需html解析,效率应该会高些。国外:大名鼎鼎的arc90实验室的Readability,该算法已经商业化实现
解决Requests抓取时中文乱码
requests抓取中文乱码的解决方法
python抓取时gzip解压
''' 根据URL返回内容,有些页面可能需要gzip解压缩 ''' def getUrlContent(url): #返回页面内容 doc = urllib.request.urlopen(url).read() #解码 try: html=gzip.decompress(doc).decode("utf-8") except:
php定时器,js定时器以及linux脚本定时器技术总结
最后发现php也可以做抓取,并且原理很易:直接获取页面源文件,然后通过正则或字符串的参照截取来获取需要的信息。但是性能上不能和搜索引擎的多线程抓取相比。 如何使用setInterval来制作网页停留时间。效果如下图 我用了一个div加一个span标签来显示   首先你要加入一个样式   样式来控制div框的样子   然后就是javascript代码 crontab定时器(包括执行shell) 如果要让unix系统重复,定期做一件事,我们就会用到crontab. 实质上真正去执行每一个重复
nodejs 搭建https服务
nodesjs 搭建https步骤生成密钥对 执行命令 openssl genrsa -out privatekey.pem 1024req -new -key privatekey.pem -out certrequest.csropenssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem创建h
wireshark抓包HTTP正文乱码的问题
由于项目需要,所以要捕获HTTP的正文,但是奇怪的是,HTTP头可以正常显示,唯独正文一直是乱码,在网上查了很多资料,有的说是加密,但是不可能所有网站都加密吧。所以只好查询了HTTP协议头的文档,原来是设置了Content-Encoding:gzip属性,gzip就是一种压缩文件格式,终于找到原因了。 接下来就是如何解压该文件了,使用 1.      下载并安装UE,这里最好用notepa
linux详细 教程
linux 详 解 大 家 看 看!!!
nodejs提取网页内容
今天,在公司想用nodejs提取一下http://msdn.microsoft.com/zh-CN/library/windows/desktop/hh802935(v=vs.85).aspx 里面的API函数列表,做一个帮助文档。 谁知道,公司电脑上安装的是vs2005,在安装jsdom进行编译的时候一直报错,node-jquery也是一样。 晚上,回来了在自己电脑上又试了一遍,笔记本上装的
爬虫抓站技巧总结
学用Python也有很长时间了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛中自动登录自动发贴的脚本,写过自动收邮件的脚本,写过简单的验证码识别的脚本,本来想写google music的抓取脚本的,结果有了强大的gmbox,也就不用写了。这些脚本有一个共性,都是和web相关的,总要用到获取链接的一些方法,再加上simplecd这个半爬虫半网站的项目,累积不少爬虫抓站的
Charles: 抓取Https包
做前端开发的小伙伴儿们,一定听过一个牛叉得不行的抓包工具,叫做Charles,利用这个工具,我们可以很方便的将线上的代码代理到本地,进行联调,也可以通过设置proxy链接同一网段下的移动设备进行联调,可以说是前端开发中的一大利器。然鹅。。。在使用这个利器的时候,发现了一个很麻(dan)烦(teng)的问题,就是Charles无法抓取Https的包,这TM就很尴尬了。为了解决这个尴尬的问题,我去网上搜
Phantomjs+Nodejs+Mysql数据抓取(2.抓取图片)
概要 这篇博客是在上一篇博客Phantomjs+Nodejs+Mysql数据抓取(1.抓取数据) http://blog.csdn.net/jokerkon/article/details/50868880 后进行的第二部分,请各位读者在看这篇博客之前先浏览上一篇,因为这里面有部分代码会沿用到上一部分的抓取结果。 好,现在开始正式的抓取图片的讲解
Wireshark学习笔记——如何快速抓取HTTP数据包
0.前言     在火狐浏览器和谷歌浏览器中可以非常方便的调试network(抓取HTTP数据包),但是在360系列浏览器(兼容模式或IE标准模式)中抓取HTTP数据包就不那么那么方便了。虽然也可使用HttpAnalyzer等工,但是毕竟都是收费软件。只需通过合适的过滤和操作,Wireshark也可抓取HTTP请求和响应。下面便说明具体操作。     假设在8080端口运行一个HTTP服务器,
看书看网页抓字东西的最便捷的软件
看书看网页抓字东西的最便捷的软件 看书看网页抓字东西的最便捷的软件 看书看网页抓字东西的最便捷的软件 看书看网页抓字东西的最便捷的软件
Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)
概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容。主要是对电脑笔记本以及他们的属性进行抓取,然后在使用nodejs进行下载图片和插入数据库操作。
Linux下抓取串口log
1.准备 串口线一条、手机一个 2.步骤 1将串口线插入电脑USB口,开启另一个终端查看串口设备名,输入下面命令: dmesg 2找到最下面一行,尾部即是串口设备名称,我这里叫做“ttyUSB0” 3然后安装串口抓取软件,进入Ubuntu软件中心,搜索CuteCom,点击安装即可。 4运行CuteCom,需要root权限,所以通过终端来进行 sudo
提取网页内容-Python
下面是使用时的注意事项: 1.需要自己设置使用代理 2.使用BeautifulSoap解析时, 尽量使用lxml格式, 否则容易造成内容丢失. 3.webEye只能解析p标签中的元素, 特殊网页需做特殊处理: 1&amp;gt;.自己实现提取body 2&amp;gt;.如果没有p标签, 可以采取在最外层加一个p标签 4.针对图片的处理: 1&amp;gt;.过滤小图片 2...
.net开发过程中,错误集锦
2007年7月10日 开发过程中,错误集锦。 写这个东东的目的,主要是上班那不能够上网,回家后总结出来弄到日志本里面的.顺便鄙视下移动,对厂家这么刻薄,不能上网,不能带水进去喝,最气人的是,进出大楼,冰火两重天,20度左右的温度.又要项目赶进度,又天天有领导来视察,天天把厂家扫地出门溜达去.2007年 6月 移动项目:1:vs2005上安装vss2005后,不能够显示
Wireshark抓取本地Tcp包(任何数据包)
没有任何一个程序员在做项目的时候不会遇到网络编程的问题,要解决这些问题除了对各种网络协议深入了解之外,还需要掌握各种网络分析工具的用法,不用多说wireshark绝对是这方面的翘楚,可惜的是,wireshark不能对本地接口(loopback,或者127.0.0.1)进行直接抓包。wireshark的工作原理这里面的原理其实很简单,wireshark可以通过操作系统来访问所有的网络adapter,通
charles抓接口步骤
安装步骤: 1,先配置Java环境;2将Charles拖到Application  3  在Finder中打开Charles,点击Helper --->register  输入账号 密码(注意不要加空格)  4 在lauchpad打开charles 5  手机配置  手动 服务器:(电脑的IP)  抓接口的步骤 首先我们必须要有放弃XML数据  乱码数据 过于简单数据的思想
使用nodejs打造comet系统
使用nodejs打造comet系统 使用nodejs打造comet系统
VLC-基于LIBVLC播放视频
安装VLC后在安装目录 找到所需要的:sdk 开发使用 ;  plugins 运行使用,必须与执行文件在一个目录 还有核心的dll libvlc.dll 和 libvlccore.dll VC 代码如下: #include "vlc/vlc.h" #pragma comment(lib, "libvlccore.lib") #pragma comment(lib, "libvlc
动态网站数据采集 - 时光网电影信息爬虫
分析 由于时光网中电影的票房、排名等大部分信息是通过Ajax异步加载的,所以,使用常规的静态网站抓取技术, 无法获取到这些信息。 要获取这些信息,必须从Ajax请求中查找。 先点开一个正在上映的电影 《前任3》 首先,找到是哪个Ajax请求用于获取这些信息 发现,以下url返回了所需要的数据 Ajax请求URL http://service.library.mtime.com/
node.js加密模块crypto常用方法介绍
使用require(‘crypto’)调用加密模块。 加密模块需要底层系统提供OpenSSL的支持。它提供了一种安全凭证的封装方式,可以用于HTTPS安全网络以及普通HTTP连接。 该模块还提供了一套针对OpenSSL的hash(哈希),hmac(密钥哈希),cipher(编码),decipher(解码),sign(签名)以及verify(验证)等方法的封装。 crypto.createCre
tomcat+nginx+redis 实现sessionId共享
tomcat+nginx+redis 实现sessionId共享!里面有文档自己看就可以了很详细了很详细了很详细了
Node.js学习之网络爬虫(使用cheerio抓取网页数据)
准备工作 1.安装node.js开发环境:http://www.runoob.com/nodejs/nodejs-install-setup.html 2.了解cheerio库 英文:https://github.com/cheeriojs/cheerio 中文:https://cnodejs.org/topic/5203a71844e76d216a727d2e
3389抓鸡套装
3389抓鸡套装,不许多的操作,详细看说明。自己传马
在使用axSpreadSheet时OWC11 组件初始化错误的解决
一、发生错误的环境Vista/XP/Windows 2003安装了Office2007;Visual Studio 2005/2008二、错误现象在Visual Studio 2005开发环境中在设计时,可以顺利的将axSpreadSheet控件拖动到Form窗口内,可以正常进行控件的相关操作;在开发环境中直接运行程序时,多数情况下,axSpreadShee
tcpdump抓取tcp的三次握手
tcpdump抓取tcp的三次握手 先要打开两个终端,打开root权限 输入 telnet www.baidu.com 80 查询一下IP号,然后输入ctrl+] 以及quit退出 administrator@ubuntu:~$ sudo su [sudo] password for administrator: root@ubuntu:/home/administrator# t
ext可视化开发工具
可以直接拖拽控件设计,生成你想要的代码。如何使用请详看文档说明
教你一步一步用 Node.js 制作慕课网视频爬虫
转自:http://www.jianshu.com/p/d7631fc695af 开始 这个教程十分适合初学 Node.js 的初学者看(因为我也是一只初学的菜鸟~) 在这里,我就默认大家都已经在自己的电脑上搭建好 Node.js,我就不再多讲了,如果你是第一次接触 Node.js 那么先请到可以到Node.js 中文网(英文) 上看看,里面有完整的安装教程。 想直接看源码的可以直接移步到
node 之二进制安装方法
wget 下载到相应的目录wget https://nodejs.org/dist/v6.11.2/node-v6.11.2-linux-x64.tar.xz 解压并复制到自己想放的目录:tar xvf node-v6.11.2-linux-x64.tar.xz cp -r node-v6.11.2-linux-x64 /opt/ [root@reg ~]# whereis node node:
使用Wireshark抓TCP、http包
使用Wireshark抓TCP、http包 打开Wireshark,选择工具栏上的“Capture”->“Options”,界面选择如图1所示:                              图1 设置Capture选项 一般读者只需要选择最上边的下拉框,选择合适的Device,而后点击“Capture Filter”,此处选择的是“HTTP TCP port(80)”,选
nodejs破解验证码
nodejs破解验证码 说明 node项目,实现了从pc网站抓取登录接口,获得验证码,并自动破解验证码,最终实现用手机自动登录pc网站。简单点就是 用手机重新定义UI,调用爬来的pc接口。接口验证码都好获取,验证如何自动破解呢? 实现 设计到验证码破解,网上node能搜出来的结果很少,都是java之类的,主流的组件叫 tesseract 但是node
会抓老鼠的猫不一定是好猫
好猫一定会抓老鼠,但是会抓老鼠的猫不一定是好猫。 捉老鼠,本来是猫的天职,是主人赋予猫的责任。如果猫捉住老鼠之后,恃功而娇,在主人还吃不饱饭的时候,天天要主人给买汤姆牌高级猫粮,不给买就罢工不捉老鼠了,这就不是好猫。 小时候我邻居张大...       好猫一定会抓老鼠,但是会抓老鼠的猫不一定是好猫。       捉老鼠,本来是猫的天职,是主人赋予猫的责任。如果猫捉住老鼠之
如何使用Node Profiler
楔子 我们在写代码的时候,往往开始的时候关注功能实现,然后进行性能测试,如果性能满足需求,皆大欢喜,否则,优化之路就开始了。 作为一名合格的屌丝码农,应该把性能优化始终铭记在心,哪怕满足需求了,也要想想是否可以做得更好呢。 然而,JS作为动态语言,与c/c++有很多不同之处。我们知道,JS代码是JS引擎动态编译的。动态语言的一个巨大优势就是引擎可以根据运行时产生的profile对
玩玩小爬虫——抓取时的几个小细节
这一篇我们聊聊在页面抓取时应该注意到的几个问题。 一:网页更新      我们知道,一般网页中的信息是不断翻新的,这也要求我们定期的去抓这些新信息,但是这个“定期”该怎么理解,也就是多长时间需要 抓一次该页面,其实这个定期也就是页面缓存时间,在页面的缓存时间内我们再次抓取该网页是没有必要的,反而给人家服务器造成压力。 就比如说我要抓取博客园首页,首先清空页面缓存, 从Last-Mod
立即提问