`
MyEyeOfJava
  • 浏览: 1123178 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7af2d6ca-4fe1-3e9a-be85-3f65f7120bd0
测试开发
浏览量:70131
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的开发来说。
 
 
 
 原文地址:
分享到:
评论

相关推荐

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

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

    node.js简单爬虫

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

    node.js实用爬虫

    在“node.js简单爬虫”基础上的深化版,一个实用化的爬虫,定时抓取,并存入数据库,用到更多的技术,用到的技术有: Vue.js: 前端页面展示。 Axios: vue官方推荐HTTP库,请求后端数据。 阿里巴巴的矢量图标库...

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

    之前已经介绍了node.js的一些基本知识,下面这篇文章我们的目标是学习完本节课程后,能进行网页简单的分析与抓取,对抓取到的信息进行输出和文本保存。 爬虫的思路很简单: 确定要抓取的URL; 对URL进行抓取,...

    ucla-web-scraper:Node.js 中的网络抓取工具,用于抓取 UCLA 课程表

    加州大学洛杉矶分校网络爬虫课程时间表 概念验证网络抓取工具,它使用 Node.js 和 request 和cheerio 库从加州大学洛杉矶分校的课程表中抓取数据并将数据存储在 mongodb 中。 数据不用于商业用途。安装使用要求:...

    node-spider:使用node.js获取ssr二维码,仅供学习

    获取 上的ssr二维码并下载到本地,仅供练习使用node.js写爬虫。 遗憾的是,此目标网站早已被和谐。 Techs https模块 cheerio模块 fs模块 How to use yarn install yarn start get images from img folder yarn run ...

    Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件的方法

    为什么用这个数据库,因为这个数据库是基于集合,数据的操作基本是json,与dom模块cheerio具有非常大的亲和力,cheerio处理过滤出来的数据,可以直接插入mongodb,不需要经过任何的处理,非常的便捷,当然跟node.js的...

    web-crawler:node.js 中的一个简单的网络爬虫

    网络爬虫爬虫是一个程序,它以网络上的 url(例如: )开始,获取与该 url 对应的网页,并将该页面上的所有链接解析为链接存储库。 接下来,它从刚刚创建的存储库中获取任何 url 的内容,将来自这个新内容的链接解析...

    basketball-reference:用于篮球参考.com 的 Node.js 抓取工具

    用 node+cheerio 构建一个网络爬虫是痛苦的。 但是男孩他妈的快 - 更不用说异步了。 安装 npm install basketball-reference --save 快速开始 var scraper = require ( 'basketball-reference' ) ; scraper . ...

    爬虫游戏-数据抓取分析系统

    爬虫游戏-数据抓取分析系统 主要用到的技术: React:MVVM 框架,用于构建前端界面。 Ant Design:基于 React 的组件库。 Bizchats:基于 React 的图表库。 Post-CSS:CSS 处理器,提供变量、计算、嵌套、Mixin、...

    Nodejs实现爬虫抓取数据实例解析

    开始之前请先确保自己安装了Node.js环境,如果没有安装,大家可以到软件开发网下载安装。 1.在项目文件夹安装两个必须的依赖包 npm install superagent --save-dev superagent 是一个轻量的,渐进式的ajax api,...

    node实现爬虫的几种简易方式

    第一种方式,采用node,js中的 superagent+request + cheerio。cheerio是必须的,它相当于node版的jQuery,用过jQuery的同学会非常容易上手。它 主要是用来获取抓取到的页面元素和其中的数据信息。superagent是node里...

    NodeJS制作爬虫全过程

    主要介绍了NodeJS制作爬虫的全过程,包括项目建立,目标网站分析、使用superagent获取源数据、使用cheerio解析、使用eventproxy来并发抓取每个主题的内容等方面,有需要的小伙伴参考下吧。

    Node-web-scraper:抓取网页的 CLI 程序

    Node.js 网络爬虫节点练习。 使用 Request 模块和 Cheerio 模块。 一个命令行程序,可以解析远程页面,读取 html,并以漂亮的打印输出到控制台。 致力于将内容写入磁盘文件的功能。

    nodejs爬虫抓取数据之编码问题

    cheerio DOM化并解析的时候 1.假如使用了 .text()方法,则一般不会有html实体编码的问题出现 2.如果使用了 .html()方法,则很多情况下(多数是非英文的时候)都会出现,这时,可能就需要转义一番了 类似这些 因为需要...

    node-imdb-scraper:使用 request 和 es6 的简单节点 web scaper

    节点网络爬虫使用请求,cheerio 抓取页面。 使用 es6 和 以 imdb 中的一页为例输出到当前 repo 中的 json 文件启动 npm start不错的教程

    NodeJs实现简单的爬虫功能案例分析

    1.爬虫:爬虫,是一种按照一定的规则,自动地抓取网页信息的程序或者脚本;利用NodeJS实现一个简单的爬虫案例,爬取Boss直聘网站的web前端相关的招聘信息,以广州地区为例; 2.脚本所用到的nodejs模块 express 用来...

    node-crawler:适用于NodeJS +服务器端jQuery的Web CrawlerSpider ;-)

    适用于Node的功能最强大,最受欢迎和生产中的抓取/抓取软件包,祝您黑客愉快:) 特征: 服务器端DOM和自动Cheerio(默认)或JSDOM的jQuery插入可配置的池大小和重试控制率限制优先请求队列forceUTF8模式让爬虫为您...

    NodeJS制作爬虫全过程(续)

    书接上回,我们需要修改程序以达到连续抓取40个页面的内容。也就是说我们需要输出每篇文章的标题、链接、第一条评论、评论用户和论坛积分。 如图所示,$('.reply_author').eq(0).text().trim();得到的值即为正确的第...

Global site tag (gtag.js) - Google Analytics