事情起因
最近报了实验楼nodejs训练营,第一个任务是完成nodejs爬虫爬取豆瓣电影top250电影信息,但是它给出的代码只能实现对一张页面的爬取,而且是对本地服务器上的网页进行爬取信息,但是如果换成实际网页上这个程序就无法运行了,所以我又对代码进行了重新修改
遇到的大问题
在过程中遇到了两个大问题,由于需要对多页面进行信息爬取,所以我就打算先获取每个页面的url,然后把爬取一个页面信息的函数写好,传入这个页面的url到那个函数中进行信息爬取,将爬取的信息存入一个对象中,随后将这个对象推入另一个数组中
我按照这个逻辑写出了代码,运行也很顺利,但是查看运行输出文件的内容后发现了问题,电影的顺序和网页上电影的顺序不符,以一页网页为单位,电影的顺序乱了。
豆瓣Top250分为了10页,排序由前向后是1,2,3…,10页,但是我获取的电影信息却是按1,5,3…….2,7页排的。
一直想不通,纠结了好久,最后突然想到nodejs是异步的,写一个循环只是告诉这十个读取页面信息的函数开始运行,而不是像别的编程语言一样执行完读取第一页信息的函数后再执行下一个,在这里相当于是10个函数同时执行,由于在每个函数运行结束后才将读取的信息存入对象中,而每个函数执行的时间参差不齐,所以就导致对后的结果混乱。
必须要使用递归的写法才能保证其安循环的顺序执行,贴一个链接,我觉得讲的不错,后面有我我也会翻译一下
需要解决的问题
- 对内容进行正则判断
- 使部分程序非异步执行
- 多页面自动化读取信息
源代码以及过程讲解
//爬取的内容为电影的名称以及其等级
'use strict';
//用于对http的处理
const http = require('http'),
//对文件进行操作
fs = require('fs'),
//对路径进行操作
path = require('path'),
//用于对页面进行类似于jquery的操作,需要npm安装
cheerio = require('cheerio'),
//用来对外发送请求,需要npm安装
request = require('request&