`
aigo
  • 浏览: 2675695 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

用nodejs抓取并存储网页内容

阅读更多

原文:

前端乱炖 http://www.html-js.com/article/2558

说明:
原文中的API可能比较旧,最新版的superagent会有执行错误,在原文基础上代码修改了一些

目标

  1. 获取http://segmentfault.com/blogs/recommend?page=3页面的文章列表postList

  2. 根据postList,逐个获取具体的文章页面

  3. 用文章标题作为文件名,如:{{ title }}.txt;将文章内容储存在txt文件

工具或库的选择

  1. superagent可以便捷的发送网络请求,并得到其响应的结果

  2. cheerio让我们可以用熟悉的jQuery风格处理html字符串

  3. observe.js可以侦听对象的属性,被侦听的属性的值发生改变时,会自动调用指定回调函数,方便运用观察者模式

准备工作

  1. 分别加载需要的模块:

npm install superagent
npm install cheerio
npm install observe.js

  1. 新建文件app.js,引入模块:
    var superagent = require('superagent')
    var observe = require('observe.js')
    var cheerio = require('cheerio')
    var path = require('path')
    var url = require('url')
    var fs = require('fs')
     

具体实现

  1. 创建文件夹postList,用来储存txt文件
    //以同步的方式:判断是否存在这个文件夹,不存在才创建
    if (!fs.existsSync('postList')) {
        fs.mkdirSync('postList')
    }
    //获取当前路径,方便读写目录跟文件
    var cwd = process.cwd()
     
  1. 创建单例
    //reptile 的意思是爬行动物、卑鄙的人。
    //爬别人的内容,有点卑鄙的意味
    var reptile = observe({})
     
  1. 侦听属性
    //observe过的对象,有on off once hold collect tie等方法
    //这里只用了on,根据属性名添加侦听函数
    //用法跟jQuery.on类似,可以是对象批量侦听,可以逐个侦听reptile.on('url', callback)
    reptile.on({
        //根据 url ,获取 text
        url: function(url) {
            var that = this
            //get方法发出请求,query方法为url添加query字段(url问号背后的)
            //end方法接受回调参数,html一般在res.text中
            superagent
                .get(url)
                .query(this.query)
                .end(function(err, res) {
                    if (err || !res.ok){
    					console.log('ERROR!!!!')
    				}
    				else{
    					//赋值给reptile.text,就会触发回调
    					that.text = res.text
    				}
                })
        },
        //触发的回调函数在这里
        text: function(text) {
            var that = this
            //cheerio 的 load 方法返回的对象,拥有与jQuery相似的API
            var $ = cheerio.load(text)
            var postList = []
            //根据html结构,筛选所需部分
            //这个页面我们只要标题跟对应的url。这里Blog_table1和Blog_td1是class属性名,a指的是a标签
            $(".Blog_table1").find('.Blog_td1 a').each(function(i, e) {
                    postList.push({
                        title: $(this).text(),
                        url: path.join(url.parse(that.url).hostname, $(this).attr('href'))
                    })
                })
            //赋值就触发回调
            this.postList = postList
            this.postItem = postList.shift()
        },
        //在这个回调里发出每一篇文章的请求
        postItem: function(postItem) {
            console.log(postItem.url)
            var that = this
            superagent
                .get(postItem.url)
                .end(function(err, res) {
                    if (err || !res.ok) {
                       console.log(res)
                    } else {
    					 //我们在这里构造filename,指定了具体路径
                        that.content = {
                            filename: path.join(cwd, 'postList', postItem.title + '.txt'),
                            title: postItem.title,
                            text: res.text
                        }
                    }
                })
        },
        //在这里处理每篇文章的具体内容
        content: function(content) {
            var that = this
            var $ = cheerio.load(content.text)
            var data = ''
            //根据html结构选取正文,只要text部分,去掉html标签
            $('.article *').each(function() {
                    data += $(this).text() + '\n'
                })
            //前面已经构造好了文件路径,直接写入即可
            fs.writeFile(content.filename, data, function(err) {
                if (err) {
                    console.log(err)
                } else if (that.postList.length) {
                    //写入完毕后,检查postList还有没有剩余
                    //若有,取出来赋值给postItem,又goto到请求文章的步骤
                    that.postItem = that.postList.shift()
                }
            })
        }
    })
     
  1. 初始化爬虫单例
    reptile.url = 'http://segmentfault.com/blogs/recommend'
    reptile.query = 'page=3'
     

以上,全部逻辑都写完.

运行app.js

在当前目录打开命令行,window系统下快捷方式为:按住shift键,点击鼠标右键,菜单栏会多出在此处打开命令窗口

node app.js

等待结果,查看postList目录下有无新增txt文件

分享到:
评论

相关推荐

    nodejs抓取今日头条

    在本文中,我们将深入探讨如何使用Node.js来抓取今日头条的数据。Node.js作为一个基于Chrome V8引擎的JavaScript运行环境,因其非阻塞I/O模型和轻量级特性,非常适合进行网络爬虫的开发。我们将主要关注以下几个方面...

    nodejs网络图片爬虫

    9. **数据存储**:如果需要长期保存抓取的图片,可以考虑将图片URL和下载后的图片文件路径存储在数据库中,如MongoDB。 10. **速率限制**:为了避免对目标网站造成过大压力,可能需要实现速率限制功能,限制每秒或...

    用nodejs抓取

    学习并掌握Node.js网页抓取,不仅可以帮助我们获取大量网络数据,还能够提升我们的编程能力和对网络结构的理解。随着技术的不断进步,网页抓取的工具和方法也在持续更新,保持学习和实践,才能在这个领域保持竞争力...

    node-crawling-framework:S受Scrapy启发的NodeJs抓取和抓取框架

    扩展框架蜘蛛并免费获得一些功能。 DownloadManager:延迟和并发限制设置, RequestDownloader:基于请求包的下载器, 下载器中间件: cookie:处理请求之间的cookie存储, defaultHeaders:向每个请求添加...

    nodejs爬虫-通过抓取搜狗微信网站获取微信文章信息!.zip

    其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...

    基于Node.JS 与puppeteer的纯命令行爬虫软件,以爬取小说网站上的小说资源。.zip

    其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...

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

    在本实例中,我们将探讨如何使用Node.js来实现一个简单的网页爬虫,通过解析HTML内容来抓取Boos直聘网站上的职位数据。这个过程分为几个关键步骤: 首先,确保你的开发环境中已经安装了Node.js。如果你还没有安装,...

    node-js-scraping:测试nodeJS抓取库

    9. **测试框架**: 对于一个名为“测试nodeJS抓取库”的项目,测试是必不可少的。可能使用了Mocha、Jest等测试框架,确保代码的功能正确性。 总的来说,“node-js-scraping”项目提供了一套完整的解决方案,帮助...

    基于NodeJS的Express框架开发的动态网站项目源码+项目说明(电影抓取等功能).zip

    电影抓取功能采用先进的爬虫技术,能够自动从指定网站获取电影信息,并存储到数据库中。用户可以通过网站界面轻松查询和浏览抓取到的电影数据。此外,本项目还提供了丰富的API接口,方便与其他系统集成或进行数据...

    appengine-nodejs-quicks:这用于抓取网络

    appengine-nodejs-quicks 使用自定义运行时的 Google App Engine 托管 VM 上的 node.js 入门项目。 用法 首先克隆这个存储库。 要在开发应用程序服务器中本地运行应用程序: gcloud preview app run . 如果需要...

    用于nodejs的网络爬虫抓取器蜘蛛_JavaScript_HTML_下载.zip

    "用于nodejs的网络爬虫抓取器蜘蛛_JavaScript_HTML_下载.zip"这个压缩包可能包含了一个使用JavaScript编写的网络爬虫项目,其目标是抓取HTML网页内容。在这个项目中,我们将会探讨Node.js中的网络爬虫基础、主要库的...

    scraper:使用Amazon Web Services和DynamoDB的无服务器框架的NodeJS抓取应用程序

    【标题】:“scraper:使用Amazon Web Services和DynamoDB的无服务器框架的NodeJS抓取应用程序” 在当今的Web开发领域,数据抓取(也称为网络爬虫)是一种广泛采用的技术,用于从互联网上自动收集信息。这个项目,名...

    基于nodejs的微博爬虫

    3. 遵守Robots协议:尊重网站的爬虫规则,不抓取禁止爬取的内容。 4. 反反爬策略:如使用代理IP,更换User-Agent,避免单一行为模式。 综上所述,基于Node.js的微博爬虫是一个涵盖网络请求、HTML解析、数据抓取和...

    Rss spider by nodejs , rss 爬虫,正文抓取.zip

    其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...

    基于nodejs的股票数据爬虫.zip

    其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...

    nodejs简单爬虫

    在爬虫中,我们需要向目标网站发送GET请求以获取网页内容。例如,我们可以创建一个http.get()函数来获取指定URL的响应数据。 2. **URL模块**:处理URL的细节,如解析、组合等,便于构建和修改爬虫的请求地址。 3. ...

    使用Nodejs多进程分页爬虫.zip

    其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...

    nodejs爬虫抓取数据乱码问题总结

    然而,有些网站尤其是非英语国家的站点可能使用Windows-1251这样的编码,例如俄语网站。Windows-1251是一种针对东欧语言设计的编码,与UTF-8不兼容,如果不正确地处理,会导致字符显示为乱码。 针对非UTF-8编码的...

    基于nodejs 的博客园爬虫项目(javascript)

    当把页面内容抓回来后,一般不会直接分析,而是用一定策略存下来,个人觉得更好的架构应该是把分析和抓取分离,更加松散,每个环节出了问题能够隔离另外一个环节可能出现的问题,好排查也好更新发布。 那么存文件...

Global site tag (gtag.js) - Google Analytics