居然没有现成的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的开发来说。
原文地址:
相关推荐
总之,使用Node.js和Cheerio,你可以轻松地构建一个功能强大的网络爬虫,实现对特定网站的数据抓取。这只是一个基础的示例,实际的网络爬虫可能需要处理更多复杂情况,包括错误处理、数据清洗、性能优化等。在探索这...
该教程介绍了如何使用Cheerio这个Node.js的爬虫框架进行Web Scraping(网页抓取),并且提供了详细的代码示例和解释。 在教程中,作者首先介绍了Web Scraping的概念和用途,以及Node.js在这方面的优势。接着,作者...
总结,`nspider` 是一个适用于初学者和专业人士的Node.js爬虫框架,它提供了便捷的DOM处理、高效请求控制以及良好的兼容性,帮助开发者快速构建网络爬虫项目,高效地抓取和处理互联网上的数据。
网络爬虫,或称网页抓取器,是一种自动化程序,它遍历互联网并抓取页面内容,通常用于数据挖掘、搜索引擎索引或者监控网站更新。Node.js由于其良好的性能和对异步编程的支持,是开发爬虫的理想选择。 在Node.js中,...
一个REST API用于使用Node.js headless Chrome和Cheerio来爬取动态网站”指的是一项技术实现,它利用Node.js作为后端服务器,通过Headless Chrome(无头Chrome浏览器)和Cheerio库来抓取那些需要JavaScript渲染才能...
网络爬虫是一种自动化抓取网页数据的工具,Node.js由于其异步和非阻塞的特性,非常适合用于编写高效的爬虫程序。书中可能会探讨一些相关的库和工具,如request、cheerio或者puppeteer等,这些工具可以帮助开发者在...
Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程。这个"看知乎"后台爬虫的源码是利用Node.js的强大功能来抓取和处理知乎网站上的数据。在本项目中,我们将深入...
在IT行业中,Node.js是一个基于Chrome V8引擎的...项目"node_spider_download-img"的具体实现可能包含以上部分或全部知识点,通过阅读和理解项目代码,可以深入学习Node.js爬虫开发,提升网络数据抓取和处理的能力。
在信息技术领域,网络爬虫是一种自动抓取互联网信息的程序,而使用Node.js实现图片爬虫则是一种高效且灵活的方法。Node.js以其非阻塞I/O模型和JavaScript语言特性,使得它在处理大量并发请求时表现出色,尤其适合...
【标题】"基于Node.js的网络爬虫"项目是一个实用的编程实践,它展示了如何使用JavaScript后端框架Node.js来构建网络数据抓取工具。Node.js因其非阻塞I/O模型和高性能特性,在处理大量并发请求时表现出色,非常适合...
在这个场景下,"js-crawler" 是一个使用Node.js实现的网络爬虫库,它具备处理HTTP和HTTPS协议的能力,这意味着它可以抓取并解析互联网上的各种网页内容。 网络爬虫是自动获取大量网页信息的程序,用于数据挖掘、...
这个"Node.js-一个Node.js福利图网站爬虫程序"是一个利用 Node.js 实现的网络爬虫示例,旨在从特定的福利图网站抓取数据。下面将详细介绍 Node.js 开发中的关键知识点以及与 HTTP 工具相关的概念。 1. **Node.js ...
标题“node.js爬虫dome”表明我们正在讨论一个使用Node.js实现的网络爬虫示例项目。Node.js是一个开放源代码、跨平台的JavaScript运行环境,它允许开发者在服务器端执行JavaScript代码,尤其适合构建高性能的网络...
总结来说,本文主要介绍了如何使用Node.js的request和cheerio模块构建一个简单的网络爬虫,包括抓取单个页面、多个页面以及处理需要登录的页面。通过这些基础知识,你可以开始构建自己的网络爬虫,进一步探索和处理...
本教程将专注于使用Node.js来编写一个简单的爬虫,其主要任务是抓取网页中的`<a>`标签链接。`<a>`标签在HTML中用于定义超链接,通常表示网页间的跳转链接。 首先,我们需要安装必要的库。Node.js的`axios`库用于...
在这个"node.js爬虫例子"中,我们看到作者使用了Node.js这一流行的JavaScript运行环境来编写爬虫程序。Node.js因其非阻塞I/O模型和事件驱动的特点,非常适合处理大量并发的网络请求,因此在爬虫开发中被广泛应用。 ...
这个项目"Node.js爬取新闻数据"是利用Node.js 8.60版本实现的一个爬虫程序,专门用于抓取新浪网站上的NBA新闻信息。通过这个程序,我们可以自动化获取体育新闻,方便数据分析或构建相关应用。 首先,我们要了解Node...
标题 "Node.js-node.js爬取招聘信息" 涉及到的主要知识点是使用Node.js进行网络爬虫开发,尤其是针对招聘网站的数据抓取。Node.js是一个基于Chrome V8引擎的JavaScript运行环境,因其非阻塞I/O和事件驱动的特性,...
可以作为node.js写爬虫的入门例子,代码也很单纯,http请求用superagent包实现,服务器端传回的json数据用cheerio包实现,无数据库代码。
4. **爬虫** - 简单的网络爬虫可能使用Node.js的request或axios库,配合cheerio或puppeteer等库解析HTML,从简书网站抓取所需信息,如文章标题、作者、内容等。 **标签:“Node.js开发-HTTP工具”** 这个标签强调...