使用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,练练手. 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲 ...
随机推荐
- 零基础爬虫----python爬取豆瓣电影top250的信息(转)
今天利用xpath写了一个小爬虫,比较适合一些爬虫新手来学习.话不多说,开始今天的正题,我会利用一个案例来介绍下xpath如何对网页进行解析的,以及如何对信息进行提取的. python环境:pytho ...
- CSS 表单
输入框前有图片 老板让你实现在输入框前有图片的功能.老板觉得用图片代替文字更有说服力. 要实现这样的功能很简单,它的原理是将图片放在内边距内. 代码 1 2 3 4 5 6 7 8 9 10 11 1 ...
- Jenkins安装时Web页面报错提示离线安装
先跳过所有. 方法1 先看它的提示:”参考离线Jenkins安装文档“发现链接点不开,我还以为是被墙了呢,FQ以后还是打不开.看来这个参考文档是没有用滴.点击配置HTTP代理跳出如下界面:安装Jenk ...
- JS数组存储(两个数组相等,一个改变,另一个跟着改变)
数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里是分开存放的实际的数组元素被存储在堆(heap)内存中:数组引用变量是一个引用类型的变量,被存储在栈(stack)内存中. ...
- http 连接 analysis service (ssas)
当数据仓库搭建好后,我们就可以通过sqlserver的管理工具查看服务器上的数据集了.但是这样挺不方便的,如果要远程访问,那么就可以通过http来连接数据仓库.要配置数据仓库http连接非常的简单.如 ...
- Partition by使用
说到排序肯定第一个想到的就是order by 说到分组第一个想到的这是 group by ,partition by 使用的很少,少到快被忘记了,但是用的时候发现功能还是很强大的,有了它 很多复 ...
- vba文件对比并高亮显示
每月月底要和人事要离职人员名单,并账号列表里删除已经离职人员的账号,如下代码通过将账号列表与人事发来的离职清单进行对比,高亮找出离职人员的账号,并进行删除. Sub DeleteMain() Dim ...
- python3+scrapy 趣头条爬虫实例
项目简介 爬取趣头条新闻(http://home.qutoutiao.net/pages/home.html),具体内容: 1.列表页(json):标题,简介.封面图.来源.发布时间 2.详情页(ht ...
- JS基础-运算符-函数
1.运算符 1.赋值运算符和扩展运算符 1.赋值运算符 = 2.扩展运算符 +=,-=,*=,/=,%=,^=.... ex: a=a+b;--> ...
- Windows系统编程之异步I/O和完成端口
Windows系统编程之异步I/O和完成端口[作者]北极星2003[来源]看雪技术论坛(bbs.pediy.com) [时间]2006年7月1日 一. 同步I/O和异步I/O 在介绍这部分内容之前先 ...