简单新颖爬虫实例的Node.js实现
最近因为剧荒,老板追了一部爱奇艺的网剧,改编自墨锭的同名小说《美人为馅》。目前已经上映两季了。虽然整部剧档期都排满了,但是老板还是很乐意看的,看完第二季就找我要小说资源,直接去原著看结局.
搜索后,都是网上资源。如果你下载它们,你需要登录。注册和登录都很麻烦。写一个爬虫玩也不错,所以你写了一个带node的,在这里做了笔记
工作流程
获取URL列表(请求资源请求模块)根据URL列表,获取相关页面源代码的源代码分析(可能会遇到页面编码问题,iconv-lite模块),获取新颖信息(chef模块),将新颖信息保存到Markdown文件,并添加适当的装饰和章节信息(写入文件fs,同步请求资源的同步请求模块),Markdown到PDF(使用Pandoc或Chrome的打印功能)获取URL
根据小说的导航页面,获取小说所有章节的URL,并存储在JSON数组中。
第一种选择是通过http.get()获取页面的源代码。打印时发现中文乱码。找到charset=“gbk”。使用iconv-lite模块需要转码。中文显示正常后,解析源代码,得到需要的URL。为了便于解析,需要引入cheerio模块。Cheerio可以理解为后台运行的jQuery,其用法与jQuery非常相似。熟悉jQuery的学生可以很快上手,将源代码加载到cheerio中。分析源代码后,他们知道所有章节信息都存储在div包装的A标签中,并通过cheerio取出合格的A标签组并遍历。获取章节的标题和URL,将其保存为对象,并将其存储在数组中。(因为链接中存储的URL不完整,需要在存储时完成。)序列化对象数组。在list.json文件中写入var http=require(' http ')var fs=require(' fs ')var chef=require(' chef ')var iconv=require(' iconv-lite ')The var URL=' http://www.17fa.com/files/article/html/90/90747/index.html' http . get(URL,function(RES){//resource request var chunks=[]RES . on(' data ',function(chunk){ push(chunk)})RES . on(' end ',function(){ var html=iconv . decode(buffer . concat(chunks),Gb2312儿童(' a ')。每个(函数(I,elem){ var link=new Object(). link . title=$(this)。text()link . link=' http://www . 17fa.com/files/article/html/90/90747/' $(this)。attr('href') //完整的URL信息if(I ^ 5){ links . push(link)} })fs . write file(' list . JSON ',JSON . stringfy(link),function (err) {if(!Err) {console.log('文件写入成功')}})})。on ('error ',function () {console.log('网页访问错误')})})。
【{ 'title': '3法医',' link' :' http://www.17fa.com/files/article/html/90/90747/16548771.html'}, { ' title ' : ' 4,首梦Link ' : ' http://www.17fa.com/files/article/html/90/90747/16548772.html'}, { ' title ' : ' 5刑警韩申',Link ' : ' http://www.17fa.com/files/article/html/90/90747/16548773.html'}, { ' title ' : ' 6初战',' Link ' : ' http://www。
有了网址列表,接下来的工作就很机械了。遍历URL列表请求资源,获取源代码,解析源代码,获取小说,写文件。但是由于所有章节最终都保存到一个文件中,所以必须保证章节的顺序,所以写文件需要同步操作。事实上,当我编码时,所有操作都被更改为同步模式。
获取源代码
通过解析读取的list.json文件,获得URL列表,通过遍历列表获得资源。由于需要保证章节的顺序,这里引入了sync-request模块来同步请求请求资源,并在请求资源后照常进行代码转换。
var http=require(' http ')var fs=require(' fs ')var cheerio=require(' cheerio ')var iconv=require(' iconv-lite ')var request=require(' sync-request ')Varurlist=JSON . parse(fs . readfile sync(' list . JSON ',' utf8 ')函数get content(chapter){ var RES=request(' get ',chapter . link)var html=iconv . decode(RES . body,' gb2312')/。i urlList.lengthI) {getContent(urlList[i])}解析源代码并获取小说
或者通过cheerio模块获取小说内容,避免影响观感,在写作前去掉内容中的html标签
函数GetContent(chapter){ var RES=request(' GET ',chapter . link)var html=iconv . decode(RES . body,' gb2312') var $=cheerio.load(html,{ decadenties : false })var content=($(' div # r1c ')。text())。替换(/\/g ' ')}保存小说
写操作也需要同步操作,所以使用同步写函数fs.writeFileSync()和同步添加函数fs.appendFileSync()。首次使用write函数,然后进行内容追加操作。为了提高阅读体验,每章前都加了标题。
您也可以在内容前添加[目录]作为导航链接
var http=require(' http ')var fs=require(' fs ')var cheerio=require(' cheerio ')var iconv=require(' iconv-lite ')var path=require(' path ')var urlList=JSON . parse(fs . readfilesync(' list . JSON ',' utf8 ')函数getContent(chapter){ console . log(chapter . link)http . get(chapter . link,function(RES){ var chunks=[]. on(' data ',function(chunk){ push(chunk)}。text())。替换(/\/g ' ')if(fs。existssync('美是填充。MD '){ fs . appendfilesync('美是填充.# # # ' chapter . title)fs . appendfilesync('美是填充。md ',content)} else {fs.writefilesync('美是填充。MD ',# # # ' chapter . title)fs . appendfilesync('美是填充。' MD ',内容)}})))。on ('error ',function(){ console . log(' crawling ' chapter . link '链接错误!)})}for(让I=0;i urlList.lengthI){ console . log(URL list[I])get content(URL list[I])}降价到PDF
我把小说保存在马克唐档案里。为了提高阅读体验,我可以把Markdown文件转换成PDF文件。目前我比较喜欢两种方式,通过Chrome打印功能和pandoc转换
镀铬印刷
升华文字有一个插件markdown预览,可以使用Alt m快捷键在Chrome中预览Markdown,在Chrome页面右键点击,选择Print,调整参数,选择Save as PDF,简单粗暴,深得我心。
印刷效果:
Pandoc转换pandoc是一个非常强大的文件格式转换工具,可以将Markdown文件转换成各种格式。经过今晚在windows10下长时间的挣扎,pdflatex始终无法找回。关于pandoc的总结将在后面写。
PDF已发送给老板,现在正在阅读
关于python,节点,爬虫
之前很长一段时间,我都想用Python,写爬虫,甚至用Python写爬虫,这甚至成了我心中的执念。随着接触的知识越来越全面,执念逐渐淡去,少了很多“思考”。我想过在我有困难的时候做更多的事情,练习我真正的知识。
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。
版权声明:简单新颖爬虫实例的Node.js实现是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。