使用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,练练手. 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲 ...
随机推荐
- SSM商城项目(九)
1. 学习计划 1.Activemq整合springMQ的应用场景 2.添加商品同步索引库 3.商品详情页面动态展示 4.展示详情页面使用缓存 2. Activemq整合spring 2.1. ...
- cast
https://blog.csdn.net/seabeam/article/details/47841539 在UVM中经常可以看到$cast的身影,这是SV的build-in task之一,当然它还 ...
- KO ----- 静态资源404问题
--------------------siwuxie095 KO ----- 静态资源 404 问题 在 Spring ...
- HDU 5734 Acperience(数学推导)
Problem Description Deep neural networks (DNN) have shown significant improvements in several applic ...
- nignx知识点总结
https://segmentfault.com/a/1190000013781162
- 前端移动开发之rem
前言 作为一名前端工程师,我们不仅要会PC端开发,还要会移动端开发,而且现在移动端占据主要流量,所以掌握移动端开发的技能更是必须的. 那么进行移动端的开发,什么是必须,我们想要的效果是什么? 自适应. ...
- maven插件后报错:org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project
在给eclipse换了高版本的maven插件后,引入jar包报如下的错误: org.apache.maven.archiver.MavenArchiver.getManifest(org.apache ...
- charles本地调试之map和rewrite功能
charles是一款mac下代理调试工具,对于前端开发同学来说是相当方便的一个调试接口的工具:不过charles需要收费,不过在天朝几乎收费的软件都能找到破解方法: 使用charles前,需要将cha ...
- spring mvc+mybatis 构建 cms + 实现UC浏览器文章功能
最近公司在模拟UC浏览器做一个简单的cms系统,主要针对于企业内部的文章浏览需求,这边考虑用户大多用mobile浏览文章内容,故使用原生的ios和android进行开发,后面也会集成html5. 1. ...
- java 小心使用float和double他可能不如你所想
public static void main(String[] args) { double funds=1.00; ; // ; ;funds>=price;price+=.){ funds ...