`
MyEyeOfJava
  • 浏览: 1149794 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7af2d6ca-4fe1-3e9a-be85-3f65f7120bd0
测试开发
浏览量:71076
533896eb-dd7b-3cde-b4d3-cc1ce02c1c14
晨记
浏览量:0
社区版块
存档分类
最新评论

[网络爬虫]使用node.js cheerio抓取网页数据

阅读更多

想要自动从网页抓一些数据或者想把一坨从什么博客上拉来的数据转成一种有结构的数据?

居然没有现成的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");
 
var url = "http://www.echojs.com/";
 
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简单爬虫

    总之,使用Node.js和Cheerio,你可以轻松地构建一个功能强大的网络爬虫,实现对特定网站的数据抓取。这只是一个基础的示例,实际的网络爬虫可能需要处理更多复杂情况,包括错误处理、数据清洗、性能优化等。在探索这...

    ChatGPT的使用之学习node爬虫框架Cheerio.pdf

    该教程介绍了如何使用Cheerio这个Node.js的爬虫框架进行Web Scraping(网页抓取),并且提供了详细的代码示例和解释。 在教程中,作者首先介绍了Web Scraping的概念和用途,以及Node.js在这方面的优势。接着,作者...

    Node.js-nspider一个轻量级的node爬虫框架

    总结,`nspider` 是一个适用于初学者和专业人士的Node.js爬虫框架,它提供了便捷的DOM处理、高效请求控制以及良好的兼容性,帮助开发者快速构建网络爬虫项目,高效地抓取和处理互联网上的数据。

    node.js实现爬虫

    网络爬虫,或称网页抓取器,是一种自动化程序,它遍历互联网并抓取页面内容,通常用于数据挖掘、搜索引擎索引或者监控网站更新。Node.js由于其良好的性能和对异步编程的支持,是开发爬虫的理想选择。 在Node.js中,...

    Node.js-一个RESTAPI用于使用Node.jsheadlessChrome和Cheerio来爬取动态网站

    一个REST API用于使用Node.js headless Chrome和Cheerio来爬取动态网站”指的是一项技术实现,它利用Node.js作为后端服务器,通过Headless Chrome(无头Chrome浏览器)和Cheerio库来抓取那些需要JavaScript渲染才能...

    Node.js in Action 第二版 第一章

    网络爬虫是一种自动化抓取网页数据的工具,Node.js由于其异步和非阻塞的特性,非常适合用于编写高效的爬虫程序。书中可能会探讨一些相关的库和工具,如request、cheerio或者puppeteer等,这些工具可以帮助开发者在...

    Node.js-网站「看知乎」后台爬虫的源码使用node.js编写

    Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程。这个"看知乎"后台爬虫的源码是利用Node.js的强大功能来抓取和处理知乎网站上的数据。在本项目中,我们将深入...

    Node.js-node.js实现爬虫批量下载图片

    在IT行业中,Node.js是一个基于Chrome V8引擎的...项目"node_spider_download-img"的具体实现可能包含以上部分或全部知识点,通过阅读和理解项目代码,可以深入学习Node.js爬虫开发,提升网络数据抓取和处理的能力。

    Node.js-Node.js图片爬虫

    在信息技术领域,网络爬虫是一种自动抓取互联网信息的程序,而使用Node.js实现图片爬虫则是一种高效且灵活的方法。Node.js以其非阻塞I/O模型和JavaScript语言特性,使得它在处理大量并发请求时表现出色,尤其适合...

    基于node.js做的一个网络爬虫.zip

    【标题】"基于Node.js的网络爬虫"项目是一个实用的编程实践,它展示了如何使用JavaScript后端框架Node.js来构建网络数据抓取工具。Node.js因其非阻塞I/O模型和高性能特性,在处理大量并发请求时表现出色,非常适合...

    Node.js-js-crawler-Node.JS的网络爬虫支持HTTP和HTTPS

    在这个场景下,"js-crawler" 是一个使用Node.js实现的网络爬虫库,它具备处理HTTP和HTTPS协议的能力,这意味着它可以抓取并解析互联网上的各种网页内容。 网络爬虫是自动获取大量网页信息的程序,用于数据挖掘、...

    Node.js-一个Node.js福利图网站爬虫程序

    这个"Node.js-一个Node.js福利图网站爬虫程序"是一个利用 Node.js 实现的网络爬虫示例,旨在从特定的福利图网站抓取数据。下面将详细介绍 Node.js 开发中的关键知识点以及与 HTTP 工具相关的概念。 1. **Node.js ...

    node.js爬虫dome

    标题“node.js爬虫dome”表明我们正在讨论一个使用Node.js实现的网络爬虫示例项目。Node.js是一个开放源代码、跨平台的JavaScript运行环境,它允许开发者在服务器端执行JavaScript代码,尤其适合构建高性能的网络...

    从零学习node.js之简易的网络爬虫(四).docx

    总结来说,本文主要介绍了如何使用Node.js的request和cheerio模块构建一个简单的网络爬虫,包括抓取单个页面、多个页面以及处理需要登录的页面。通过这些基础知识,你可以开始构建自己的网络爬虫,进一步探索和处理...

    Node.js-spiderurlnodejs爬取网站的a标签链接

    本教程将专注于使用Node.js来编写一个简单的爬虫,其主要任务是抓取网页中的`<a>`标签链接。`<a>`标签在HTML中用于定义超链接,通常表示网页间的跳转链接。 首先,我们需要安装必要的库。Node.js的`axios`库用于...

    node.js爬虫例子

    在这个"node.js爬虫例子"中,我们看到作者使用了Node.js这一流行的JavaScript运行环境来编写爬虫程序。Node.js因其非阻塞I/O模型和事件驱动的特点,非常适合处理大量并发的网络请求,因此在爬虫开发中被广泛应用。 ...

    Node.js爬取新闻数据

    这个项目"Node.js爬取新闻数据"是利用Node.js 8.60版本实现的一个爬虫程序,专门用于抓取新浪网站上的NBA新闻信息。通过这个程序,我们可以自动化获取体育新闻,方便数据分析或构建相关应用。 首先,我们要了解Node...

    Node.js-node.js爬取招聘信息

    标题 "Node.js-node.js爬取招聘信息" 涉及到的主要知识点是使用Node.js进行网络爬虫开发,尤其是针对招聘网站的数据抓取。Node.js是一个基于Chrome V8引擎的JavaScript运行环境,因其非阻塞I/O和事件驱动的特性,...

    node.js简单爬虫

    可以作为node.js写爬虫的入门例子,代码也很单纯,http请求用superagent包实现,服务器端传回的json数据用cheerio包实现,无数据库代码。

    Node.js-仿简书nodejsexpressmongodbvue2angular4爬虫

    4. **爬虫** - 简单的网络爬虫可能使用Node.js的request或axios库,配合cheerio或puppeteer等库解析HTML,从简书网站抓取所需信息,如文章标题、作者、内容等。 **标签:“Node.js开发-HTTP工具”** 这个标签强调...

Global site tag (gtag.js) - Google Analytics