原文:
前端乱炖 http://www.html-js.com/article/2558
说明:
原文中的API可能比较旧,最新版的superagent会有执行错误,在原文基础上代码修改了一些
目标
-
获取
http://segmentfault.com/blogs/recommend?page=3
页面的文章列表postList
-
根据
postList
,逐个获取具体的文章页面 -
用文章标题作为文件名,如:
{{ title }}.txt
;将文章内容储存在txt文件
中
工具或库的选择
-
superagent
可以便捷的发送网络请求,并得到其响应的结果 -
cheerio
让我们可以用熟悉的jQuery
风格处理html
字符串 -
observe.js
可以侦听对象的属性,被侦听的属性的值发生改变时,会自动调用指定回调函数,方便运用观察者模式
准备工作
- 分别加载需要的模块:
npm install superagent
npm install cheerio
npm install observe.js
- 新建文件
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')
具体实现
- 创建文件夹
postList
,用来储存txt文件//以同步的方式:判断是否存在这个文件夹,不存在才创建 if (!fs.existsSync('postList')) { fs.mkdirSync('postList') } //获取当前路径,方便读写目录跟文件 var cwd = process.cwd()
- 创建单例
//reptile 的意思是爬行动物、卑鄙的人。 //爬别人的内容,有点卑鄙的意味 var reptile = observe({})
- 侦听属性
//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() } }) } })
- 初始化爬虫单例
reptile.url = 'http://segmentfault.com/blogs/recommend' reptile.query = 'page=3'
以上,全部逻辑都写完.
运行app.js
在当前目录打开命令行,window系统下快捷方式为:按住shift
键,点击鼠标右键,菜单栏会多出在此处打开命令窗口
node app.js
等待结果,查看postList
目录下有无新增txt文件
相关推荐
在本文中,我们将深入探讨如何使用Node.js来抓取今日头条的数据。Node.js作为一个基于Chrome V8引擎的JavaScript运行环境,因其非阻塞I/O模型和轻量级特性,非常适合进行网络爬虫的开发。我们将主要关注以下几个方面...
9. **数据存储**:如果需要长期保存抓取的图片,可以考虑将图片URL和下载后的图片文件路径存储在数据库中,如MongoDB。 10. **速率限制**:为了避免对目标网站造成过大压力,可能需要实现速率限制功能,限制每秒或...
学习并掌握Node.js网页抓取,不仅可以帮助我们获取大量网络数据,还能够提升我们的编程能力和对网络结构的理解。随着技术的不断进步,网页抓取的工具和方法也在持续更新,保持学习和实践,才能在这个领域保持竞争力...
扩展框架蜘蛛并免费获得一些功能。 DownloadManager:延迟和并发限制设置, RequestDownloader:基于请求包的下载器, 下载器中间件: cookie:处理请求之间的cookie存储, defaultHeaders:向每个请求添加...
其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...
其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...
在本实例中,我们将探讨如何使用Node.js来实现一个简单的网页爬虫,通过解析HTML内容来抓取Boos直聘网站上的职位数据。这个过程分为几个关键步骤: 首先,确保你的开发环境中已经安装了Node.js。如果你还没有安装,...
9. **测试框架**: 对于一个名为“测试nodeJS抓取库”的项目,测试是必不可少的。可能使用了Mocha、Jest等测试框架,确保代码的功能正确性。 总的来说,“node-js-scraping”项目提供了一套完整的解决方案,帮助...
电影抓取功能采用先进的爬虫技术,能够自动从指定网站获取电影信息,并存储到数据库中。用户可以通过网站界面轻松查询和浏览抓取到的电影数据。此外,本项目还提供了丰富的API接口,方便与其他系统集成或进行数据...
appengine-nodejs-quicks 使用自定义运行时的 Google App Engine 托管 VM 上的 node.js 入门项目。 用法 首先克隆这个存储库。 要在开发应用程序服务器中本地运行应用程序: gcloud preview app run . 如果需要...
"用于nodejs的网络爬虫抓取器蜘蛛_JavaScript_HTML_下载.zip"这个压缩包可能包含了一个使用JavaScript编写的网络爬虫项目,其目标是抓取HTML网页内容。在这个项目中,我们将会探讨Node.js中的网络爬虫基础、主要库的...
【标题】:“scraper:使用Amazon Web Services和DynamoDB的无服务器框架的NodeJS抓取应用程序” 在当今的Web开发领域,数据抓取(也称为网络爬虫)是一种广泛采用的技术,用于从互联网上自动收集信息。这个项目,名...
3. 遵守Robots协议:尊重网站的爬虫规则,不抓取禁止爬取的内容。 4. 反反爬策略:如使用代理IP,更换User-Agent,避免单一行为模式。 综上所述,基于Node.js的微博爬虫是一个涵盖网络请求、HTML解析、数据抓取和...
其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...
其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...
在爬虫中,我们需要向目标网站发送GET请求以获取网页内容。例如,我们可以创建一个http.get()函数来获取指定URL的响应数据。 2. **URL模块**:处理URL的细节,如解析、组合等,便于构建和修改爬虫的请求地址。 3. ...
其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...
然而,有些网站尤其是非英语国家的站点可能使用Windows-1251这样的编码,例如俄语网站。Windows-1251是一种针对东欧语言设计的编码,与UTF-8不兼容,如果不正确地处理,会导致字符显示为乱码。 针对非UTF-8编码的...
当把页面内容抓回来后,一般不会直接分析,而是用一定策略存下来,个人觉得更好的架构应该是把分析和抓取分离,更加松散,每个环节出了问题能够隔离另外一个环节可能出现的问题,好排查也好更新发布。 那么存文件...