nodejs豆瓣爬虫

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!!

关于作者

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/nodejs-crawler-douban/

node-crawler

目录:

  1. 类库介绍
  2. win7安装jquery – 失败
  3. ubuntu安装jQuery – 成功
  4. 豆瓣爬虫

1. 类库介绍

1. web项目,基于express3, ejs模板
2. 通过request抓取网页
3. 通过jQuery, jsdom, htmlparser提取网页内容

crawler

2. win7安装node-jquery – 失败

由于win7安装node-jquery的包报错,直接改成ubuntu下开发。
Ubuntu的Nodejs安装请参考:准备Nodejs开发环境Ubuntu


~ npm install jquery
D:\workspace\project\moiveme\node_modules\jquery\node_modules\contextify>node "D:\toolkit\nodejs\node_modules\npm\bin\no
de-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild
npm http 304 https://registry.npmjs.org/cssom
npm http GET https://registry.npmjs.org/cssom/-/cssom-0.2.5.tgz
npm http 304 https://registry.npmjs.org/request
npm http 304 https://registry.npmjs.org/cssstyle
npm http GET https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.3.tgz
npm http GET https://registry.npmjs.org/request/-/request-2.21.0.tgz
npm http 200 https://registry.npmjs.org/cssom/-/cssom-0.2.5.tgz
npm http 200 https://registry.npmjs.org/request/-/request-2.21.0.tgz
npm http 200 https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.3.tgz
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.Cpp.InvalidPlatform.Targets(23,7): error MSB8007: 项目“cont
ex
tify.vcxproj”的平台无效。平台为“x64”。您会看到此消息的可能原因是,您尝试在没有解决方案文件的情况下生成项目,并且为此
项目指定了并不存在的非默认平台。 [D:\workspace\project\moiveme\node_
modules\jquery\node_modules\contextify\build\contextify.vcxproj]
gyp ERR! build error
gyp ERR! stack Error: `C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe` failed with exit code: 1
gyp ERR! stack at ChildProcess.onExit (D:\toolkit\nodejs\node_modules\npm\node_modules\node-gyp\lib\build.js:267:23)
gyp ERR! stack at ChildProcess.EventEmitter.emit (events.js:98:17)
gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:784:12)
gyp ERR! System Windows_NT 6.1.7601
gyp ERR! command "node" "D:\\toolkit\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild"
gyp ERR! cwd D:\workspace\project\moiveme\node_modules\jquery\node_modules\contextify
gyp ERR! node -v v0.10.5
gyp ERR! node-gyp -v v0.9.5
gyp ERR! not ok
npm ERR! weird error 1
npm ERR! not ok code 0

3. ubuntu安装node-jquery

ubuntu安装node-jquery还是有一些安装过程中的问题

  1. jsdom的依赖版本问题
  2. jQuery非jquery,两个包一字之差,其实是不一样的。

~ sudo npm install jsdom

安装可能会有错误,jsdom依赖的问题。修改packages.json文件,指定jsdom版本。


~ vi packages.json
"dependencies": {
"jsdom" : "https://github.com/tmpvar/jsdom/tarball/4cf155a1624b3fb54b2eec536a0c060ec1bab4ab"
}

继续安装依赖包,这里请使用jQuery包,不要用jquery会有错误。


~ sudo npm install jQuery
~ sudo npm install xmlhttprequest
~ sudo npm install request
~ sudo npm install htmlparser

安装完成。

4. 豆瓣爬虫

设计场景:对豆瓣电影进行爬取。
http://movie.douban.com/subject/11529526/
1

项目目录:


~ pwd
/home/conan/workspace/nodejs/nodejs-demo
~ ll
drwxr-xr-x 6 conan conan 4096 Jun 6 18:02 ./
drwxrwxr-x 4 conan conan 4096 Jun 6 14:19 ../
-rw-rw-r-- 1 conan conan 842 Jun 6 14:19 app.js
drwxr-xr-x 10 conan conan 4096 Jun 6 18:01 node_modules/
-rw-rw-r-- 1 conan conan 283 Jun 6 16:44 package.json
drwxr-xr-x 5 conan conan 4096 Jun 6 14:19 public/
drwxr-xr-x 2 conan conan 4096 Jun 6 15:59 routes/
drwxr-xr-x 2 conan conan 4096 Jun 6 14:19 views/

增加myUtil.js文件


~ vi myUtil.js
var MyUtil = function () {
};
var http = require('http');
var request = require('request');
MyUtil.prototype.get=function(url,callback){
request(url, function (error, response, body) {
if (!error && response.statusCode == 200) {
callback(body,response.statusCode);
}
})
}
module.exports = new MyUtil();

修改控制器 routes/index.js


~ vi routes/index.js
var myUtil = require('../myUtil.js');
var $ = require('jQuery');
exports.index = function(req, res){
var url="http://movie.douban.com/subject/11529526";
console.log(url);
myUtil.get(url,function(content,status){
console.log("status:="+status);
res.send(content);
});
};

这里我们已经把content内容,输出到了本地程序里。
打开浏览器:http://192.168.1.104:3000

2

用jQuery提出红色的文字:


~ vi routes/index.js
var myUtil = require('../myUtil.js');
var $ = require('jQuery');
exports.index = function(req, res){
var url="http://movie.douban.com/subject/11529526";
console.log(url);
myUtil.get(url,function(content,status){
console.log("status:="+status);
var movie={}
movie.name = $(content).find('span[property="v:itemreviewed"]').text();
movie.director = $(content).find('#info span:nth-child(1) a').text();
console.log(movie);
res.send(content);
});
};

查看server的日志输出

http://movie.douban.com/subject/11529526
status:=200
{ name: '中国合伙人', director: '陈可辛' }
GET / 200 4480ms - 72.55kb

通过jQuery的xpath,我们很容易分析出“电影名”和“导演”的字段。
用Nodejs写爬虫代码几有短短几行,比起JAVA动一下就千行的代码量来说,让我们轻松了很多。

效率上,终于可以达到以1人顶100人的目的了。

希望我的介绍对你用处。

转载请注明出处:
http://blog.fens.me/nodejs-crawler-douban/

打赏作者

This entry was posted in Javascript语言实践

0 0 votes
Article Rating
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

38 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
星星

cool

Lee

So Cool!

mayloveless

这只是一部具体的电影,如何体现爬?有没有demo可以看?

Conan Zhang

后面工作,我没有写出来,并不难!
1. 建个URL列表 ,写个循环就行,读网页。
2. 提取电影数据,存储数据库。
3. 提取网页的URL,补充URL列表
4. 反复操作第二步

没有demo,等有时间再写吧。

酷酷虫

这个真是不错,这个爬虫做的我感觉好爽啊,比情人节干别的爽啊

Conan Zhang

程序员就要有热情。呵呵。

guest

你知道你在说什么吗?

khowarizmi

如果使用request & cheerio这两个模块也挺方便的

Conan Zhang

是的,cheerio更方便一些,request则有点底层。

Jade Chen

cheerio确实更方便,win下jquery安装太操蛋了

Conan Zhang

是的,我也是这么折腾过来的。

zhou

Hi,为啥我抓取到的影片名称跟导演是乱码呢?

Conan Zhang

我是在linux,你如果在win中有可能乱码,自己配置一下字符集。

hible

Error: jQuery requires a window with a document

QuenTine

同遇到这个问题,不管是jQery还是jquery都需要一个叫jsdom的包里的createWindow函数,但这个包没有。

Conan Zhang

jsdom比较重,而且需要依赖于window底层的库,已经不建议使用了,换成cheerio。

pinkchampagne

cheerio好用啊,不需要python的环境了。

Conan Zhang

🙂

waterbean

没有调度器,没有容错机制。根本不叫爬虫。就是一个几行代码实现的下载器而已。

http://git.oschina.net/dreamidea/neocrawler

真正的nodejs爬虫

Conan Zhang

本文只是爬虫的一部分,我有时间看看你说的爬虫。

连培培

你这个爬虫我高不来啊。
想想,我的爬虫需求,不需要很频繁的爬数据,准备用此文的思路自己做一个了。
你提供的这个项目,我研究了半天,不会用。哎。

AbnerZheng

windows 系统可以安装成功。
版本信息:Win8.1 系统,node 0.10.29, npm 1.4.14

Conan Zhang

jsdom比较重,现在都倾向于用cheerio

AbnerZheng

cheerio依赖jQuery吗?

AbnerZheng

已转到cheerio,谢了

xiaoluyouyue

cheerio感觉很方便,跟jquery用法差不了多少

shaosh

大牛我有一个地方不解啊。用js做爬虫不会涉及跨域问题吗?

Conan Zhang

node.js是后台应用,运行在服务器上而不是浏览器里,没有跨域问题。

shaosh

原来如此。

我用你的代码爬别的网页都没有问题,唯独这两个url不行:http://blog.designashirt.com

http://photos.designashirt.com
没有收到任何响应,而这两个页面确实是存在的,您知道这可能是什么地方的问题吗?

shaosh

哦,看到了,输出了response.statusCode, 看到了403。知道问题再哪了。

多谢大牛上面的解释!

shaosh

问题解决了,在request中加上headers:{’User-Agent’: ‘request’},即request({url:url, headers: {‘User-Agent’: ‘request’}}, function (error, response, body) {}),就可以了。

Conan Zhang

🙂

xiaxind1

问一下,用cheerio 抓取 JS动态生成的页面时如何处理。正常的页面抓取都没问题了,遇到那种ajax或者JS生成的页面就抓取不到?大神问问如何解决

Conan Zhang

找一个webkit引擎,先把页面渲染了再抓

xiaxind1

感谢大神,问问有实例参考吗?

Conan Zhang

google搜索 node webkit spider有很多的结果。比如:http://phantomjs.org/

对于node来说,可以用node-phantom库
https://www.npmjs.com/package/node-phantom

Lincoln

为什么我什么东西都没有 是空的 没有抓下来

Tong Wu

楼主写的好赞!
分享一个免费好用的云端爬虫开发平台
http://www.shenjianshou.cn/

38
0
Would love your thoughts, please comment.x
()
x