用Nodejs做爬虫

欢迎访文我的博客YangChen’s Blog

引言

提起爬虫,最容易想到的就是python,因为python给人的感觉就是啥都能干,但是之前用python做爬虫的过程还是很不爽的,主要问题来自这么几个方面:第一个是对爬来的网页dom操作上,第二个就是编码的处理,第三就是多线程,所以用python做爬虫其实并不是很爽,有没有更爽的方式呢?当然有那就是node.js!

Nodejs做爬虫的优劣

首先说一下node做爬虫的优势

第一个就是他的驱动语言是JavaScript。JavaScript在nodejs诞生之前是运行在浏览器上的脚本语言,其优势就是对网页上的dom元素进行操作,在网页操作上这是别的语言无法比拟的。

第二就是nodejs是单线程异步的。听起来很奇怪,单线程怎么能够异步呢?想一下学操作系统的时候,单核cpu为什么能够进行多任务处理?道理也是类似,在操作系统中进程对CPU的占有进行时间切片,每一个进程占有的时间很短,但是所有进程循环很多次,因此看起就像是多个任务在同时处理。js也是一样,js里有事件池,CPU会在事件池循环处理已经响应的事件,未处理完的事件不会放到事件池里,因此不会阻塞后续的操作。在爬虫上这样的优势就是在并发爬取页面上,一个页面未返回不会阻塞后面的页面继续加载,要做到这个不用像python那样需要多线程。

其次是node的劣势

首先是异步并发上。处理的好很方便,处理的不好就会很麻烦。例如要爬取10个页面,用node不做异步处理话,那返回的结果可不一定是按1、2、3、4……这个顺序,很可能是随机。解决的办法就是增加一个页面的序列戳,让爬取的数据生成csv文件,然后重新排序。

第二个是数据处理上的劣势,这点是不如python的,如果只是单纯的爬数据,用node当然很好,但是如果用爬来的数据继续做统计分析,做个回归分析聚类啥的话,那就不能用node一步到底了。

如何用nodejs做爬虫

下面就要说一下如何用nodejs做爬虫了

1、初始化项目文件

在对应的项目文件夹下执行npm init来初始化一个package.json文件

2、安装request和cheerio依赖包

request听起来很熟悉吧,跟python里request功能一样。它的功能就是建立起对目标网页的链接,并返回相应的数据,这个不难理解。

cheerio的功能是用来操作dom元素的,他可以把request返回来的数据转换成可供dom操作的数据,更重要的cheerio的api跟jquery一样,用$来选取对应的dom结点,是不很方便?对一个前端程序员来说,这比python的什么xpath和beautisoup方便了不知道多少啊哈哈

安装命令也很简单,分别是npm install request --savenpm install cheerio

3、引入依赖包并使用

接下来就用request和cherrio写一个爬虫吧!

首先引入依赖

var request = require("request");
var cheerio = require("cheerio");

接下来就以爬取我们学校的新闻页为例吧,我们学校的新闻页面链接是http://news.shu.edu.cn/Default.aspx?tabid=446

然后调用request的接口

request(‘http://news.shu.edu.cn/Default.aspx?tabid=446‘,function(err,result){
    if(err){
        console.log(err);
    }
    console.log(result.body);
})

运行一下结果就是这样的

是不是很激动哈哈,html返回回来了。这样还是不够的,接下就是要处理下返回的数据,并提炼出我们想要获得的信息,这就轮到cheerio登场了

将request返回的结果传入cheerio中,并获得想要获取的信息,看代码是不是想在写脚本的感觉?

request(‘http://news.shu.edu.cn/Default.aspx?tabid=446‘,function(err,result){
    if(err){
        console.log(err);
    }
    var $ = cheerio.load(result.body);
   $(‘a[id^="dnn"]‘).each(function(index,element){
       console.log($(element).text());
   })
})

运行下结果如下:

这样一个简单的爬虫就完成啦,是不是很简单啊,当然这远远是不够的。

4、设置请求头

众所周知,http协议里,建立连接要发送请求头header,对于一些动态网页的爬取有时候需要设置user agent、cookies等等,那么这些设置如何使用呢?

具体事例代码如下:

var options = {
    url: startUrl+‘?page=1‘,
    method: ‘GET‘,
    charset: "utf-8",
    headers: {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36",
        "cookie": cookies
    }
};
request(options,function(err,response,body){
//...
})

5并发控制

爬取一个页面还好,要是页面多了就是无限制并发了,那肯定就要被封了,所以就要有一个并发控制,这里要介绍的就是async。跟上述一样要通过npm install async --save来安装并通过var async = require("async")来引入。

具体以一个限制并发的方式来示例一下

async.mapLimit(5,function(url,callback)){
//...
fetch(url,callback)
})

这里面的5就是限制的并发数量,可以自由发挥,最后千万不要忘了执行完后callback,因为如果没有的话就会阻塞了,async并不知道他限制的函数是否执行完毕,因此不会释放掉。

总结

至此呢,Nodejs爬虫的核心就已经介绍完毕了,剩下就完全可以自由发挥了,最后附上一个自己做的简单的新浪微博的爬虫吧https://github.com/Fazich/nodeSpider

时间: 2024-10-28 19:56:21

用Nodejs做爬虫的相关文章

手把手教你做爬虫---基于NodeJs

前言: 趁着北京今儿天气格外的蓝,我觉得我得干点什么,于是乎,卷起袖子,整理一下最近做爬虫的那些事儿. 目标:爬取北京大学软件与微电子学院的所有新闻,并将内容及图片存储到本地. 设计思路:经过对北京大学软件与微电子学院的新闻网址http://www.ss.pku.edu.cn/index.php/newscenter/news/内容及网页格式的分析,我发现了这样一个规律:在每篇文章中,都会有下一篇文章url的链接.所以,我的做法是:给定一个初始(最新的)网页的url,如http://www.ss

NodeJS制作爬虫全过程

这篇文章主要介绍了NodeJS制作爬虫的全过程,包括项目建立,目标网站分析.使用superagent获取源数据.使用cheerio解析.使用eventproxy来并发抓取每个主题的内容等方面,有需要的小伙伴参考下吧. 今天来学习alsotang的爬虫教程,跟着把CNode简单地爬一遍. 建立项目craelr-demo我们首先建立一个Express项目,然后将app.js的文件内容全部删除,因为我们暂时不需要在Web端展示内容.当然我们也可以在空文件夹下直接 npm install express

Nodejs做web服务器的一个简单逻辑和实现

本文写了自己对"Nodejs做web服务器的一个简单逻辑和实现",如果不太合理,或者了解这部分的大神,欢迎拍死.哈哈,新手. 昨天开始学习Nodejs,w3cschool看了一遍.感觉其上的内容,一上来就开始介绍Nodejs的模块.看来后来,连如何"从零创建一个nodejs版的web服务器"都没能明白.可能是自己太过肤浅,或者,陷到了WAMP的思维里,不能自拔吧.后来在nodejs中文社区发了个帖子.感觉自己算是明白了点儿.写出来,希望和大家一起学习,同时也希望得到

网络爬虫作业代码代写代实现、代做爬虫程序

网络爬虫作业代码代写代实现.代做爬虫程序任务二.网络爬虫实现 一.任务描述编写大学排名爬虫程序,从"最好大学网"获取"软科中国最好大学排名"2016.2017.2018年的国内大学排名数据,并将它们输出出来.2016年中国最好大学排名网址目的1.学习运用requests库编写基本URL访问过程2.学习运用beautifulsoup4库解析和处理HTML3.掌握编写网络爬虫的基本方法二.任务分析(必须有,主要分析任务需求,完成任务的思路与方法,采用的技术等,如爬虫的任

Nodejs做整站转发

刚接触nodejs,做个东西练下手,通过nodejs直接转发整站,原本想把内容全翻译成英文,但google对流量行审查,被封IP,所以就没啥用了, 效果像这样 var b = function (a, b) { for (var d = 0; d < b.length - 2; d += 3) { var c = b.charAt(d + 2), c = "a" <= c ? c.charCodeAt(0) - 87 : Number(c), c = "+&quo

用NodeJs做一个小爬虫

作者:北京起步科技前端研究员,专注分享HTML5 App快速开发工具 WeX5 的黑魔法以及相应的前端技术. 前言 利用爬虫可以做很多事情,单身汉子们可以用爬虫来收集各种妹子情报,撩妹族们可以用爬虫收集妹子想要的小东西,赚大钱的人可以用来分析微博言论与股票涨跌的关系诸如此类的,简直要上天了. 你们感受一下 点我点我: 蠢蠢欲动 抛开机器学习这种貌似很高大上的数据处理技术,单纯的做一个爬虫获取数据还是非常简单的.对于前段er们来说,生在有nodejs的年代真是不要太幸福了,下面就用nodejs来做

基于Nodejs的爬虫

简介 基于 Node.JS 爬取 博客园 1W+博文,对博文内容做关键词提取,生成词云. 演示 安装 安装 git.Node.JS.MongoDB.Yarn 克隆代码 git clone [email protected]:ZhihaoJian/bokeyuan_spider.git 如果觉得安装速度慢,可将源切换到淘宝,cmd 或者 powershell 下执行 yarn config set registry 'https://registry.npm.taobao.org' 进入bokey

Nodejs小爬虫

记得先装载http这个模块 打开cmd  :npm install http -g var http=require('http') var url='http://www.imooc.com/learn/348' http.get(url,function(res){ var html='' res.on('data',function(data){ html +=data }) res.on('end',function(){ console.log(html) }) }).on('erro

Nodejs书写爬虫工具

看了几天的nodejs,的确是好用,全当是练手了,就写了一个爬虫工具. 爬虫思路都是一致的,先抓取页面数据,然后分析页面,获取到所需要的数据,最后获得这些数据,是写入到硬盘,还是显示到网页,自己看着办. 其中最难的是分析页面,如果不用其他工具,那就只能用正则表达式来分析了.这里采用cheerio这个模块,这个很好用,不要有抵触心理(因为刚开始我比较抵触这个,想不用任何别的东西,结果自己搞崩了,还是用了它).cheerio网上介绍很多,它可以根据div,根据class ,href等html标签,获