前言
今天下午闲来无事,突然想学习一下爬虫技术了,就在网上看了点资料,然后自己亲手制作了一只小爬虫,在这里呢,我们主要用nodejs
来写哦,为什么呢?因为我喜欢~哈哈哈,给大家开个小玩耍
,别生气哦,接下来我们到底爬那个网站呢?恩,随便百度一个吧,好的,就是豆瓣电影了,希望豆瓣电影大大不要介意,因为毕竟我们也只是练习一下技术,为光大我中国努力呀,闲话少说,请看具体的网页。
解析及制作小爬虫
- 解析
首先,网页中有很多电影介绍,我们随便找了一个电影,这里就用水形物语做测试了,我们第一步需要分析,我们想要什么资料?
- 电影标题
- 电影头像
- 电影导演
- 电影编剧
......
对于这么一抹多资料,凡是自己想要的,都可以得到~
- 制作小爬虫
第一步:对于nodejs
来制作小爬虫,我们需要request
,cheerio
,express
,fs
这四种就完全足够了,对于原始自带的fs不用安装,其余的三个库都需要自行安装,不会安装的同学自行百度,这个我没法教。
第二步:安装好了之后,根目录下新建一个movie目录和app.js
,movie
目录主要存放我们爬过的数据,app.js
中创建一个服务:
const express = require("express");
const request = require("request");
const cheerio = require("cheerio");
const fs = require("fs");
let app = express();
app.listen(80);
第三步:开始编写爬虫代码,获取我们需要的信息,此处提一下,cheerio
的用法和jQuery
十分相似,大家可以自行去学习下,这里就不赘述了,代码如下:
app.get('/', function(req, res) {
request(`https://movie.douban.com/subject/26752852/?from=showing`, function(error, response, body) {
if (!error && response.statusCode == 200) {
let $ = cheerio.load(body,{ decodeEntities: false });
let movie = {
title: $("#content span").eq(0).text() + $("#content span").eq(1).text(),// 电影名称
avatar: $("#mainpic img").attr("src"), // 电影头像,
mainpic: $("#info .attrs").eq(0).text(), // 导演
screenwriter: $("#info .attrs").eq(1).text(), // 编剧
Starring: $("#info .actor").find(".attrs").text(), // 主演
type: $("[property='v:genre']").text(), // 类型
releaseDate: $("[property='v:initialReleaseDate']").text(), // 上映时间
property: $("[property='v:runtime']").text(), // 时长
score: $("[property='v:average']").text() // 评分
};
console.log(movie);
}
})
});
日志打印
第四步:获取信息后,开始写入文件
fs.writeFile(`./movie/${movie.title}.txt`, `
电影名称: ${movie.title}\r
电影头像: ${movie.avatar}\r
导演: ${movie.mainpic}\r
编剧: ${movie.screenwriter}\r
主演: ${movie.Starring}\r
类型: ${movie.type}\r
上映时间: ${movie.releaseDate}\r
时长: ${movie.property}\r
评分: ${movie.score}\r
`, (err) => {
if (err) throw err;
console.log('introduce had been saved!');
});
request(movie.avatar).pipe(fs.createWriteStream(`./movie/${movie.title}.jpg`));
最终项目结构图:
image.png
最终项目文件图:
image.png
实际效果图
注意事项【2017.03.22补充】
对于爬虫爬大量数据的时候,尤其是文字加内容,而且还要新建文件夹/文件的,请注意,for
循环内部再嵌套各种fs操作,这真是一个很大的灾难!!!,fs
自带同步功能,但是request
没有,这里解决方案之一就是其中将request
可以换成sync-request
,将其转换成同步,否则可能导致爬下来的数据不全或没有图片。对于爬虫的技术还在研究,后期如果有更多有意义的收获,会来此继续补充内容。
后言
对于制作一只小爬虫,其实原理很简单,接下来关于怎么遍历所有电影,那就需要大家自己好好开动自己的小脑袋了,这里可以提示一下不懂得小伙伴,提示语:“网页url
”。好了,今天花了几分钟学习了下nodejs
小爬虫,实在是算不得入门,未来要走的路还很长,希望在自学的日子里,不是我一个人在前进,欢迎更多自学前端的小伙伴陪我一起成长,相互交流,当然我也欢迎大佬们可以指点一二,谢谢大家。
说明
原创作品,禁止转载和伪原创,违者必究!
网友评论