居然没有现成的API可以取数据?!!! !@#$@#$…
没关系 网页抓取可以解决。
什么是网页抓取? 你可能会问。。。
网页抓取是以编程的方式(通常不用浏览器参与)检索网页的内容并从中提取数据的过程。
本文,小编会给大家展示一套强大的抓取工具,可以快速的对网面进行抓取,而且容易上手,它是由javascript 和node.js实现的。
最近我需要爬一些大数量(谦虚的说)的页面,然后分析它们从中找到一些规律。 你知道,实在太长时间没有干过种事了。。。这么说吧, 手头基本上是没有现成的工具可以用了。。
我必须承认我实在太喜欢node.js了。 Node.js是一个用来脱离浏览器写javascript程序的框架。 在Atwood’s 定律的指引下, node.js有了一套很强大的工具来帮助大家开发网络程序。你不光可以用node.js来开发webserver/websocket的代码, 我发现它还可以满足我一些日常的脚本需要。 所以我开始寻找node.js在网页抓取方面的现成库或工具, 果然,我找到了 Cheerio. Cheerio 是一个Node.js的库, 它可以从一坨html的片断中构建DOM结构,然后提供像jquery一样的css选择器查询。
太好了! 因为,在这个世界上CSS和CSS驱动的样式链表几乎是唯一的网页组织方式。(CSS干的好!)最近人们往往使用CSS class风格的方式来制作各种结构的网页。别误解我,这个并不是解决问题的金钥匙,我依然要处理大量的网页,大部分是杂乱无章的。 但是对我来说 CSS选择器提供一个强大快捷而简单工具,从html中进行有效的的数据识别。 我典型的网页抓取流程是这样的, 首先用firebug或chrome开发者工具分析一下目标网页的结构。主要关注的是我感兴趣的数据即目标数据的css选择器。 接下来就是用node.js搞起了。
如果你没有安装node.js或者很久没有升级了, 那么从这里下载。 安装程序不仅会安装node.js本身,还会装一个叫做npm的node 工具包管理器,npm可以用来快速下载并安装node.js的库。 这果我们用npm来安装Cheerio这个库。 运行以下这条命令。
1
|
npm install cheerio |
一旦Cheerio安装完成, 我们就可以开始工作了。 首先让我们来看一段javascript代码 这段代码可以下载任意一个网页的内容。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
var http = require( "http" );
// Utility function that downloads a URL and invokes // callback with the data. function download(url, callback) {
http.get(url, function (res) {
var data = "" ;
res.on( 'data' , function (chunk) {
data += chunk;
});
res.on( "end" , function () {
callback(data);
});
}).on( "error" , function () {
callback( null );
});
} |
这段代码可以异步下载任意的URL (通过 HTTP GET方法), 而且在完成下载的时候,它会调用回调函数并把下载的内容当做参数传进去。接下的一段代码可以下载任意一个网页并将其内容输出到控制台。
注意: 请大家从源码中引用download.js 只要简单的远行如下代码。
1
|
node download.js |
让我们详细看一下代码。
1
2
3
4
5
6
7
8
|
download(url, function (data) {
if (data) {
console.log(data);
}
else console.log( "error" );
}); |
这段代码会从指定的url下载内容并把内容打印到控制台。 现在我们已经有了可以从网页下载的内容的方法, 接下来就看Cheerio如何去提取我们感兴趣的数据了。
在实际操作前,我们还要做一点研究和实验,以帮助我们理解目标网页的布局结构, 这样就可提取出人感兴趣的内容了。 在这个具体的例子里, 我们试图把这些url里的主要的图片取出来。 我们可以先用浏览器打开这些网页,然后找到一个可以定位到这些图片的方法, 你可以用chrome开发者工具 或直接看源码(比较难)可以具体的分离定位这些图片,明白了么? 让我们来看代码吧。
注意: 请引用 squirrel.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
var cheerio = require( "cheerio" );
download(url, function (data) {
if (data) {
//console.log(data);
var $ = cheerio.load(data);
$( "div.artSplitter > img.blkBorder" ). each ( function (i, e) {
console.log($(e).attr( "src" ));
});
console.log( "done" );
}
else console.log( "error" );
}); |
引入cheerio模块后, 我们可以用之前写好的download方法下载目标网页的内容。 一旦我们有了数据, cheerio.load方法就会把HTML内容解析成DOM对象 并且可以像jquery css选择器查询那样对这个DOM进行筛选,(注意:我把这个变量叫做$这样就更像jquery了)。在目标网页,我注意到这些图片所在的div都有一个叫做 “artSplitter”的class, 而且这些图片本身都有一个叫做”blkBorderf”的class。 为了能将它们唯一的找到,我写了一条css选择器查询语句
1
|
$( "div.artSplitter > img.blkBorder" )
|
这个语句会返回一个图片对象列表。 然后我们用each方法遍历这些图片然后把每一个图片的src打印出来。效果还不错。。。 我们再来看另外一个例子, 请引用 echo.js 源码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
var cheerio = require( "cheerio" );
download(url, function (data) {
if (data) {
// console.log(data);
var $ = cheerio.load(data);
$( "article" ). each ( function (i, e) {
var link = $(e).find( "h2>a" );
var poster = $(e).find( "username" ).text();
console.log(poster+ ": [" +link.html()+ "](" +link.attr( "href" )+ ")" );
});
}
}); |
在这个栗子里, 目标是echojs.com。 我想把这个网页上所有文章的链接抓取并以markdown的格式打印出来。 首先我们用以下的语句把所有的artical节点都找到
1
|
$( "article" )
|
然后遍历所有的节点,找到在h2下的a标签 用以下的语句
1
|
var link = $(e).find( "h2>a" );
|
同样,我可以用以下语句找到文章作者的名字
1
|
var poster = $(e).find( "username" ).text();
|
希望你能从这篇关于node.js和chreerio的文章中得到一些快乐吧。 请大家移步 Cheerio documentation 获取列多的信息。
虽然它可能不是适用于所有大型的网页抓取,但它绝对是一个强大的工具, 尤其对于我们前端javascript jquery的开发来说。
原文地址:
相关推荐
该教程介绍了如何使用Cheerio这个Node.js的爬虫框架进行Web Scraping(网页抓取),并且提供了详细的代码示例和解释。 在教程中,作者首先介绍了Web Scraping的概念和用途,以及Node.js在这方面的优势。接着,作者...
可以作为node.js写爬虫的入门例子,代码也很单纯,http请求用superagent包实现,服务器端传回的json数据用cheerio包实现,无数据库代码。
在“node.js简单爬虫”基础上的深化版,一个实用化的爬虫,定时抓取,并存入数据库,用到更多的技术,用到的技术有: Vue.js: 前端页面展示。 Axios: vue官方推荐HTTP库,请求后端数据。 阿里巴巴的矢量图标库...
之前已经介绍了node.js的一些基本知识,下面这篇文章我们的目标是学习完本节课程后,能进行网页简单的分析与抓取,对抓取到的信息进行输出和文本保存。 爬虫的思路很简单: 确定要抓取的URL; 对URL进行抓取,...
加州大学洛杉矶分校网络爬虫课程时间表 概念验证网络抓取工具,它使用 Node.js 和 request 和cheerio 库从加州大学洛杉矶分校的课程表中抓取数据并将数据存储在 mongodb 中。 数据不用于商业用途。安装使用要求:...
获取 上的ssr二维码并下载到本地,仅供练习使用node.js写爬虫。 遗憾的是,此目标网站早已被和谐。 Techs https模块 cheerio模块 fs模块 How to use yarn install yarn start get images from img folder yarn run ...
为什么用这个数据库,因为这个数据库是基于集合,数据的操作基本是json,与dom模块cheerio具有非常大的亲和力,cheerio处理过滤出来的数据,可以直接插入mongodb,不需要经过任何的处理,非常的便捷,当然跟node.js的...
网络爬虫爬虫是一个程序,它以网络上的 url(例如: )开始,获取与该 url 对应的网页,并将该页面上的所有链接解析为链接存储库。 接下来,它从刚刚创建的存储库中获取任何 url 的内容,将来自这个新内容的链接解析...
用 node+cheerio 构建一个网络爬虫是痛苦的。 但是男孩他妈的快 - 更不用说异步了。 安装 npm install basketball-reference --save 快速开始 var scraper = require ( 'basketball-reference' ) ; scraper . ...
爬虫游戏-数据抓取分析系统 主要用到的技术: React:MVVM 框架,用于构建前端界面。 Ant Design:基于 React 的组件库。 Bizchats:基于 React 的图表库。 Post-CSS:CSS 处理器,提供变量、计算、嵌套、Mixin、...
开始之前请先确保自己安装了Node.js环境,如果没有安装,大家可以到软件开发网下载安装。 1.在项目文件夹安装两个必须的依赖包 npm install superagent --save-dev superagent 是一个轻量的,渐进式的ajax api,...
第一种方式,采用node,js中的 superagent+request + cheerio。cheerio是必须的,它相当于node版的jQuery,用过jQuery的同学会非常容易上手。它 主要是用来获取抓取到的页面元素和其中的数据信息。superagent是node里...
主要介绍了NodeJS制作爬虫的全过程,包括项目建立,目标网站分析、使用superagent获取源数据、使用cheerio解析、使用eventproxy来并发抓取每个主题的内容等方面,有需要的小伙伴参考下吧。
Node.js 网络爬虫节点练习。 使用 Request 模块和 Cheerio 模块。 一个命令行程序,可以解析远程页面,读取 html,并以漂亮的打印输出到控制台。 致力于将内容写入磁盘文件的功能。
cheerio DOM化并解析的时候 1.假如使用了 .text()方法,则一般不会有html实体编码的问题出现 2.如果使用了 .html()方法,则很多情况下(多数是非英文的时候)都会出现,这时,可能就需要转义一番了 类似这些 因为需要...
节点网络爬虫使用请求,cheerio 抓取页面。 使用 es6 和 以 imdb 中的一页为例输出到当前 repo 中的 json 文件启动 npm start不错的教程
1.爬虫:爬虫,是一种按照一定的规则,自动地抓取网页信息的程序或者脚本;利用NodeJS实现一个简单的爬虫案例,爬取Boss直聘网站的web前端相关的招聘信息,以广州地区为例; 2.脚本所用到的nodejs模块 express 用来...
适用于Node的功能最强大,最受欢迎和生产中的抓取/抓取软件包,祝您黑客愉快:) 特征: 服务器端DOM和自动Cheerio(默认)或JSDOM的jQuery插入可配置的池大小和重试控制率限制优先请求队列forceUTF8模式让爬虫为您...
书接上回,我们需要修改程序以达到连续抓取40个页面的内容。也就是说我们需要输出每篇文章的标题、链接、第一条评论、评论用户和论坛积分。 如图所示,$('.reply_author').eq(0).text().trim();得到的值即为正确的第...