使用node.js如何爬取网站数据
数据库又不会弄,只能扒扒别人的数据了。
搭建环境:
(1)、创建一个文件夹,进入并初始化一个package.json文件。
npm init -y
(2)、安装相关依赖:
npm install --save koa npm install --save cheerio // 后面会用到,用于抓取页面模块,为服务器特别定制的,快速、灵活、实施的jQuery核心实现
现在来一个简单的demo热热身。直接上代码(文件名:demo2.js):
var http = require('http') // Node.js提供了http模块,用于搭建HTTP服务端和客户端
var url = 'http://www.m4yy.com/type/2.html' //输入任何网址都可以
http.get(url,function(res){ //发送get请求
var html=''
res.on('data',function(data){
html += data //字符串的拼接
})
res.on('end',function(){
console.log(html)
})
}).on('error',function(){
console.log('获取资源出错!')
})
执行node demo2.js 得到结果如下:

很神奇有木有。然而这不是我们想要的,我们想要的是获取页面里面某一部份的数据。
这里以 没事影院 的电视剧页面为例。这时候cheerio就派上用场了,前面已经安装过,这里就不再赘述,它的用法其实跟jquery是很相似的。参考 cheerio(百度百科的解释)
在刚刚的js文件中引入cheerio模块,然后加载所需要的html内容。
var $ = cheerio.load(html) // 加载需要的html
为了方便使用,这里封装一个函数:
function filterChapters(html) {
var $ = cheerio.load(html) // 加载需要的html,然后就可以愉快地使用类似jQuery的语法了
var chapters = $('.movie-item') //在html里寻找需要的资源的class
var courseData = [] // 创建一个数组,用来保存资源
chapters.each(function(item, index) { //遍历我们的html文档
var chapter = $(this)
var chapterTitle = chapter.children('a').attr('title')
var tvUrl = chapter.children('a').attr('href').split('show/')[1]
var imgUrl = chapter.find('img').attr('src')
var updateStatus = chapter.find('.hdtag').text()
var type = chapter.find('.otherinfo a').text()
var url = `http://www.m4yy.com/show/${tvUrl}`
courseData.push({
chapterTitle: chapterTitle,
tvUrl: tvUrl,
imgUrl: imgUrl,
updateStatus: updateStatus,
type: type,
url: url
})
})
return courseData //返回需要的资源
}
现在将上面的demo2.js文件稍作修改。完整代码如下:
var http = require('http') // Node.js提供了http模块,用于搭建HTTP服务端和客户端
var url = 'http://www.m4yy.com/type/2-3.html' //输入任何网址都可以
var cheerio = require('cheerio') // 抓取页面模块,为服务器特别定制的,快速、灵活、实施的jQuery核心实现
http.get(url,function(res){ //发送get请求
var html=''
res.on('data',function(data){
html += data //字符串的拼接
})
res.on('end',function(){
var courseData = filterChapters(html)
console.log('courseData', courseData)
})
}).on('error',function(){
console.log('获取资源出错!')
})
function filterChapters(html) {
var $ = cheerio.load(html) // 加载需要的html
var chapters = $('.movie-item') //在html里寻找需要的资源的class
var courseData = [] // 创建一个数组,用来保存资源
chapters.each(function(item, index) { //遍历html文档
var chapter = $(this)
var chapterTitle = chapter.children('a').attr('title')
var tvUrl = chapter.children('a').attr('href').split('show/')[1]
var imgUrl = chapter.find('img').attr('src')
var updateStatus = chapter.find('.hdtag').text()
var type = chapter.find('.otherinfo a').text()
var url = `http://www.m4yy.com/show/${tvUrl}`
courseData.push({
chapterTitle: chapterTitle,
tvUrl: tvUrl,
imgUrl: imgUrl,
updateStatus: updateStatus,
type: type,
url: url
})
})
return courseData //返回需要的资源
}
再次执行node demo2.js 此时结果如下:

光这样还不够,我们想把它存在一个json文件中,下面就新建一个tvList.json文件。将上面获取的内容添加到json文件中,这里就涉及到文件的写操作了。
需要用到模块fs,因此在js文件中引入fs模块。完整代码如下:
var http = require('http') // Node.js提供了http模块,用于搭建HTTP服务端和客户端
var url = 'http://www.m4yy.com/type/2.html' //输入任何网址都可以
var cheerio = require('cheerio') // 抓取页面模块,为服务器特别定制的,快速、灵活、实施的jQuery核心实现
var fs = require("fs")
http.get(url,function(res){ //发送get请求
var html=''
res.on('data',function(data){
html += data //字符串的拼接
})
res.on('end',function(){
var courseData = filterChapters(html)
let content = courseData.map((o)=>{
return JSON.stringify(o) // JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串。
})
fs.writeFile('./tvlist.json',content, function(err){ //文件路经,写入的内容,回调函数
if(err) throw new Error ('写文件失败'+err);
console.log("成功写入文件")
})
})
}).on('error',function(){
console.log('获取资源出错!')
})
function filterChapters(html) {
var $ = cheerio.load(html) // 加载需要的html
var chapters = $('.movie-item') //在html里寻找需要的资源的class
var courseData = [] // 创建一个数组,用来保存资源
chapters.each(function(item, index) { //遍历html文档
var chapter = $(this)
var chapterTitle = chapter.children('a').attr('title')
var tvUrl = chapter.children('a').attr('href').split('show/')[1]
var imgUrl = chapter.find('img').attr('src')
var updateStatus = chapter.find('.hdtag').text()
var type = chapter.find('.otherinfo a').text()
var url = `http://www.m4yy.com/show/${tvUrl}`
courseData.push({
chapterTitle: chapterTitle,
tvUrl: tvUrl,
imgUrl: imgUrl,
updateStatus: updateStatus,
type: type,
url: url
})
})
return courseData //返回需要的资源
}
执行node demo2.js 效果如下:

使用node.js如何爬取网站数据的更多相关文章
- 手把手教你用Node.js爬虫爬取网站数据
个人网站 https://iiter.cn 程序员导航站 开业啦,欢迎各位观众姥爷赏脸参观,如有意见或建议希望能够不吝赐教! 开始之前请先确保自己安装了Node.js环境,还没有安装的的童鞋请自行百度 ...
- 利用linux curl爬取网站数据
看到一个看球网站的以下截图红色框数据,想爬取下来,通常爬取网站数据一般都会从java或者python爬取,但本人这两个都不会,只会shell脚本,于是硬着头皮试一下用shell爬取,方法很笨重,但旨在 ...
- Node.js 爬虫爬取电影信息
Node.js 爬虫爬取电影信息 我的CSDN地址:https://blog.csdn.net/weixin_45580251/article/details/107669713 爬取的是1905电影 ...
- node.js爬虫爬取拉勾网职位信息
简介 用node.js写了一个简单的小爬虫,用来爬取拉勾网上的招聘信息,共爬取了北京.上海.广州.深圳.杭州.西安.成都7个城市的数据,分别以前端.PHP.java.c++.python.Androi ...
- 养只爬虫当宠物(Node.js爬虫爬取58同城租房信息)
先上一个源代码吧. https://github.com/answershuto/Rental 欢迎指导交流. 效果图 搭建Node.js环境及启动服务 安装node以及npm,用express模块启 ...
- Node.js爬虫-爬取慕课网课程信息
第一次学习Node.js爬虫,所以这时一个简单的爬虫,Node.js的好处就是可以并发的执行 这个爬虫主要就是获取慕课网的课程信息,并把获得的信息存储到一个文件中,其中要用到cheerio库,它可以让 ...
- Node.js/Python爬取网上漫画
某个周日晚上偶然发现了<火星异种>这部漫画,便在网上在线看了起来.在看的过程中图片加载很慢,而且有时候还不小心点到广告,大大延缓了我看的进度.后来想到能不能把先把漫画全部抓取到本地再去看. ...
- C# 关于爬取网站数据遇到csrf-token的分析与解决
需求 某航空公司物流单信息查询,是一个post请求.通过后台模拟POST HTTP请求发现无法获取页面数据,通过查看航空公司网站后,发现网站使用避免CSRF攻击机制,直接发挥40X错误. 关于CSRF ...
- python爬取网站数据
开学前接了一个任务,内容是从网上爬取特定属性的数据.正好之前学了python,练练手. 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲 ...
随机推荐
- P1880 [NOI1995]石子合并-(环形区间dp)
https://www.luogu.org/problemnew/show/P1880 解题过程:本次的题目把石子围成一个环,与排成一列的版本有些不一样,可以在后面数组后面再接上n个元素,表示连续n个 ...
- Session & Cookie 简介
(一)简介 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通 ...
- mui之上拉刷新和mui-content结合解决ios上拉不回弹的bug
打电话.发短信 https://blog.csdn.net/itguangit/article/details/78210770
- django 模板使用
1 配置 在工程中创建模板目录templates. 在settings.py配置文件中修改TEMPLATES配置项的DIRS值: TEMPLATES = [ { 'BACKEND': 'django. ...
- vue去掉地址栏#(带来的后果)
按以下修改后,带来的后果:打包后部分图片访问不到,首页没加载router-view内容 router 的index中配置模式设置为history export default new Router({ ...
- 46 【golang项目】完成了一个小小的播放器功能
项目地址:https://github.com/helww/mylab/tree/master/go/player 这个项目中用到了readme说明文件是一个markdown文件. 基础的控制语法,网 ...
- vue的条件渲染和列表渲染介绍
一.条件渲染 1.v-if语句 <div v-if="seen">hahahah</div> <!-- v-if插入或者删除元素的指令 --> ...
- 650. 2 Keys Keyboard复制粘贴的次数
[抄题]: Initially on a notepad only one character 'A' is present. You can perform two operations on th ...
- 646. Maximum Length of Pair Chain 最长的链条长度
[抄题]: You are given n pairs of numbers. In every pair, the first number is always smaller than the s ...
- 数字提取——C语言
Problem Description AekdyCoin is the most powerful boy in the group ACM_DIY, whose signature is valu ...