爬取IMDB页面数据
这里我以冰火之歌电影为例子,也就要拿到冰火之歌的数据。数据分为两大数据,一是家族数据,一是角色数据。首先要先得到角色数据,通过数据做清理对比后去爬家族数据,然后根据家族数据进行合并生成两份数据,一份是每个家族里的人物,另一个是每个人物自己的数据,也就是个人介绍数据。
首先拿到数据url,对抓取的页面进行解析。这就要用到爬虫相关的工具,我使用cheerio,它是nodejs的抓取页面模块,为服务器特别定制的,快速、灵活、实施的jQuery核心实现,可以将HTML告诉你的服务器。
server/crawler/imdb.js
|
|
使用request-promise发送请求,
|
|
通过选择器获取数据,遍历table中的每一条数据,然后对数据进行解析
|
|
获取到原始数据后,通过ramda对数据进行处理,对nmId和chId进行正则比配,最后将数据写入imdb.json内。
|
|
修改start.js文件,将启动文件修改成imdb.js
|
|
数据爬取完成,成功写入imdb.json,如图:
爬取API数据
设置爬取url,同步发送请求,将url作为参数传入
server/crawler/api.js
|
|
从第一页开始爬取数据,对爬取到的数据进行解析拼接
|
|
判断拿到的数据长度是否小于50,如果是,执行console.log('爬完了')
;反之,将数据写入character.json文件中,每隔1秒执行一次,page++,继续调用getAPICharacters(page)
。
|
|
修改start.js文件,将启动文件修改成api.js
|
|
爬取成功,如图:
校对数据
在imdb上爬到的数据与在API上爬到的数据有所不同,以API里的数据为基准来校对从imdb上爬到的数据,如果某个数据不符合条件就过滤掉,通过imdb数据对比API数据最后筛选出正确的数据。新建校对文件。
server/crawler/check.js
拿到角色数据和imdb数据
|
|
通过name和playedBy对传入的每条数据进行对比
|
|
查找name和playedBy这两个参数是否存在
|
|
验证IMDbData获取新的数据,将新数据写入wikiCharacters.json文件里。
|
|
修改start.js文件
|
|
校对后的正确数据写入wikiCharacters.json,如图:
爬取人物头像
获取到characters的数据,然后遍历,判断characters是否存在profile字段,构建请求地址,执行爬取IMDbProfile函数获取profile,将最后的数据写入imdbCharacters.json文件里。
|
|
头像数据爬取完成,成功写入imdbCharacters.json,不再截图了。
检查数据是否包含头像
拿到characters的数据然后遍历,如果数据包含profile字段就放进chaaracters里,将新数据写入validCharacters.json。
|
|
爬取角色剧照
|
|
爬取中文人物数据
遍历本地imdb的人物数据拿到id,根据id查询详细数据,将详细数据存入本地后进行筛选。
获取id
定义查询的字段和url,通过request-promise发出请求获取数据,将获取到的数据进行转换合并处理。
|
|
获取详情
声明id及url,发出请求获取数据。通过ramda对数据进行整合。
|
|
获取cname和intro
先拿到sections,接着筛选出level为1的数据,将筛选后的第一条数据拿出来,挑选出title和content参数,然后遍历拿出的参数。
|
|
获取level
拿到sections筛选出所有内容不为空的数据,将title为扩展阅读和引用与注释的数据去除,然后将剩下的数据组织起来。
|
|
拿到所有数据后返回
|
|
获取WikiCharacters
引入清理后的数据data,通过data遍历每条数据的id,通过Promise.all(data)
发出所有的异步请求,获取wiki id和wiki 详情数据,将这些数据写入finalCharacters.json。最后调用getWikiCharacters()
|
|
修改入口文件start.js
|
|
将头像和封面图上传到七牛云
在七牛云上新建个存储空间,会默认分配一个测试域名,使用这个域名就可以。接下来就可以上传图片了。上传图片之前需要把你的七牛云的AK和SK配置到本地。
修改server/config/index.js
|
|
上传图片工具函数
上传七牛云是需要ak和sk,可能其他地方也需要用到上传图片,就单独封装七牛云函数
server/lib/qiniu.js
|
|
拼接shell脚本qshell fetch ${url} ${bucket} '${key}'
,设置异步执行脚本exec(bash, {async: true})
,最后标准输出数据data。
从IMDb上获取图片
引入IMDbCharacters数据遍历它。
server/crawler/wiki.js
|
|
上传图片
声明文件名key,上传图片出入参数profile和key fetchImage(item.profile, key)
,把item.profile的值设置为key。
|
|
上传剧照
和上传图片的步骤一样,最后将item.images[i]
的值设置为_key
|
|
将最后的数据写入completeCharacters.json文件中
|
|
安装插件
运行项目之前记得安装所需要的插件
全局安装qshell
|
|
安装qiniu、shelljs、random-token
|
|
安装完qshell就可以执行qshell配置命令
|
|
运行项目
修改start.js
|
|