博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node.js爬虫实例
阅读量:6337 次
发布时间:2019-06-22

本文共 2647 字,大约阅读时间需要 8 分钟。

今天来用Node.js做一个小小的爬虫项目

爬虫目标:(科学松鼠会)

  • 我们需要创建一个文件夹,自己命名就好,然后在文件夹里创建两个文件夹分别命名为data和img,进入到这个总文件夹的目录终端下。

  • 终端输入npm init,创建package.json配置文件,根据自己的实际情况填写,或者一路回车。

  • 再次输入npm install cheerio request --save,会下载好cheerio(用法几乎和Jquery一样),request依赖包。

  • 在总文件夹里再创建index.js,用来编写我们的主体逻辑代码。

下面就是代码

var http = require('http');var fs = require('fs');var cheerio = require('cheerio');var request = require('request');var i = 0;var url = "http://songshuhui.net/archives/96881";//初始化的地址function fetchPage(x){    startFetch(x);}//封装函数function startFetch(x){    //采用http模块向服务器发起一次get请求    http.get(x,function(res){        var html = ""; //用来储存整个页面的html内容        res.setEncoding("utf-8");//防止中文乱码        res.on('data',function(chunk){            html  += chunk;        });//监听data事件,每次取一块数据        res.on('end',function(){            var $ = cheerio.load(html);//用cheerio模块解析html            var author = $(".metax_single a:first-child").text().trim();//获取文章的作者            var title = $(".atrctitle .contenttitle a").text().trim();//获取文章的标题            var link = $(".atrctitle .contenttitle a").attr("href");//获取文章的网页地址            var new_item = {                Title: title,                Author: author,                Link: link,                i: i =i + 1//用来判断获取了多少文章            };            console.log(new_item);            savedContent($,title);//储存文章的文字内容            savedImg($,title);//储存文章的图片内容            var nextLink = $(".navilinks .prevlink a").attr("href");            var str = encodeURI(nextLink);            if(i <= 500){                fetchPage(str);            }//通过控制i控制抓取的文章的数目        });//监听end事件,如果整个网页内容都获取完毕,执行回调函数    }).on('error',function (err) {        console.log(err);    });}function savedContent($,title){    $(".entry p").each(function(index,item) {        var x = $(this).text();        x = x + "\n";        fs.appendFile("./data/" + title + ".txt", x, "utf-8", function (err) {            if (err) {                console.log(err);            }        });    });}//本地储存爬取的文字资源function savedImg($,title){    $(".entry .wp-caption img").each(function(index,item) {        var img_title = $(this).attr("alt");        var img_filename = img_title + ".jpg";        var img_src = $(this).attr("src");        request.head(img_src,function(err,res,body){            if(err){                console.log(err);            }        });        request(img_src).pipe(fs.createWriteStream("./img/" + title + "--" + img_filename));        //采取request模块向服务器发起一次请求,获取图片资源    });}//本地储存爬取的图片资源fetchPage(url);
  • 代码部分完成,在webstorm上运行index.js文件,直接选中index.js,点击右上角的绿色三角按钮。

  • 选取的这个网址,分析网站源代码,每个文章都有上一页或者下一页的内容,这样我们可以串联式的获取dom节点的不同url,因此获得每个url的内容。

控制台的输出

图片描述

获取的图片

图片描述

获取的文章

图片描述

爬虫成功!

转载地址:http://elaoa.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
vim 纵向编辑
查看>>
Vsftp精解之安装配置及原理(一)
查看>>
我的友情链接
查看>>
思科路由与交换系列--------NA系列
查看>>
FragmentPagerAdapter不能更新fragment的问题
查看>>
Zepto源码分析(1)——类型判断函数
查看>>
阿里AoneFlow分支管理模式-个人理解
查看>>
LAMP环境下搭建discuz论坛
查看>>
运行程序时提示:Could not resize...No space left on device
查看>>
01前段一条龙-git仓库的建立
查看>>
我的程序员之路(一)
查看>>
我的友情链接
查看>>
1号店连添头都算不上,京东与沃尔玛,谁才是接盘侠
查看>>
隐藏数值为0的情况下的div
查看>>
ionic2-Toast
查看>>
laravel打印查询日志
查看>>
设计模式第十一课 中介者模式 Mediator Pattern
查看>>
centos安装
查看>>
docker容器的数据卷以及使用方式
查看>>