基于 Node.js 的网站信息爬虫

通过 Node.js 实现一个简单爬虫,爬取豆瓣热门电影。主要会用到的模块(包)有:http,fs,path,cheerio。

这里用一个跑在本地的 http server 来模拟在线爬豆瓣网。
douban-server.tar.gz 是由实验楼提供的在本地模拟豆瓣网的程序。

具体的代码实现参考 git:ipoplar ,其中 growth.md 是遇到的问题。

Operation

解压 douban-server.tar.gz

1
tar zxvf douban-server.tar.gz

进入解压后的目录,启动服务:

1
npm start

创建文件夹 spider, 进入文件夹,输入 npm init , 初始化项目,会得到类似与小编的文件。(在初始化项目要添加第三方包 npm install cheerio --save

运行 node spider.js 会抓取到想要的信息(将抓取到的图片放到 img 文件夹下,将电影信息放置在 data/data.json 中)

Problems and growth

spider-cheerio

cheerio

cheerio 为服务器特别定制的,快速,灵活, 实施的jQuery核心实现。
可用通过如下命令进行安装:
npm install cheerio

Features
相似的语法: 包括了jQuery核心的子集。
闪电般的快: 工作在一个非常简单,一致的DOM模型之上。高效的完成解析, 操作, 呈送。(基础的端到端的基准测试显示 Cheerio 大约比 JSDOM 快八倍)。
巨灵活: cheerio 封装了兼容 htmlparser。cheerio 几乎能够解析任何的 HTML 和 XML document。

简单的使用

  1. Loading

    1
    2
    var cheerio = require('cheerio');
    $ = cheerio.load('<ul id="fruites">...</ul>');

    或者通过传递字符串作为内容来加载 HTML:

    1
    2
    $ = require('cheerio');
    $('ul', '<ul id="fruits">...</ul>');

    Or as the root:

    1
    2
    $ = require('cheerio');
    $('li', 'ul', '<ul id="fruits">...</ul>');

    你也可以传递一个额外的对象给.load()如果你需要更改任何的默认解析选项的话:

    1
    2
    3
    4
    $ = cheerio.load('<ul id="fruits">...</ul>', {
    ignoreWhitespace: true,
    xmlMode: true
    });

    这些解析选项都是直接来自htmlparser ,因此任何在htmlparser里有效的选项在Chreeio里也是行得通的。默认的选项如下:

    1
    2
    3
    4
    5
       {
    ignoreWhitespace: false,
    xmlMode: false,
    lowerCaseTags: false
    }

参考链接: https://www.npmjs.com/package/cheerio

jQuery-Ajax

在此是对实验楼的练习笔记的整理,有兴趣的小伙伴可以到实验楼这个非常棒的平台去练练~

原始Ajax

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<!doctype html>
<html lang="zh">
<head>
<meta charset="utf-8"/>
<title>jQuery Ajax</title>
<script src="jquery-1.11.2.min.js"></script>
<script>
$(function() {
var xhr = new AjaxXmlHttpRequest();
$("#btnAjaxOld").click(function(event) {
var xhr = new AjaxXmlHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
document.getElementById("divResult").innerHTML = xhr.responseText;
}
}
//由于涉及到同源策略,需要服务器端的支持
xhr.open("GET", "data/AjaxGetCityInfo.aspx?resultType=html", true);
xhr.send(null);
});
});

//跨浏览器获取 XmlHttpRequest 对象
function AjaxXmlHttpRequest() {
var xmlHttp;
try {
// Firefox, Opera 8.0+, Safari
xmlHttp = new XMLHttpRequest();
} catch (e) {
// Internet Explorer
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert("Your browser nonsupport AJAX!");
return false;
}
}
}
return xmlHttp;
}
</script>

</head>
<body>
<button id="btnAjaxOld">original ajax call</button>
<div id="divResult"></div>
</body>
</html>

回顾jQuery

在此是对实验楼的练习笔记的整理,有兴趣的小伙伴可以到实验楼这个非常棒的平台去练练~

看一段简单的代码段,回顾jQuery的使用方式
(内部的代码片段是截取了js部分,显示不同的功能)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!doctype html>
<html>
<head>
<script type="text/javascript" src="js/jquery-2.1.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$("#demo").css({'width':"100px", "height":"100px", "background-color":"red"})
});

</script>

</head>

<body>
<div id="demo"></div>
</body>
</html>

jQuery的常用属性

表单选择器

:input
:text
:password
:radio
:checkbox
:submit
:image
:reset
:button
:file
:hidden