当前位置: 首页 > 后端技术 > Node.js

使用Node.js爬取任意网页资源并输出高质量的PDF文件到本地~

时间:2023-04-03 14:50:17 Node.js

本文适合有无爬虫和Node.js基础的朋友~要求:使用Node.js爬取网页资源,开箱即用如果你是技术人员,可以看下我的文章,否则请直接移步我的github仓库,看文档就用吧地址:附上文档和源码,别忘了给astar本次需求用到的技术:Node.js和puppeteerpuppeteer官网地址:puppeteer地址Node.js官网地址:链接说明Puppeteer是Google官方的一个产品,由HeadlessChrome的DevTools协议Node库控制。您可以通过Puppeteer提供的API直接控制Chrome,模拟大部分用户操作进行UITest或者作为爬虫访问页面进行数据采集。环境及安装Puppeteer本身依赖于Node6.4或更高版本,但是对于超级好用的async/await,建议使用Node7.6或更高版本。另外,headlessChrome本身对服务端所依赖的库的版本要求比较高。centos服务器依赖比较稳定,很难用v6的headlessChrome。升级依赖版本可能会导致各种服务器问题(包括但不限于无法使用ssh),最好使用高版本服务器。(建议使用最新版本的Node.js)小测试,爬取京东资源constpuppeteer=require('puppeteer');//引入依赖(async()=>{//使用async函数来完美异步constbrowser=awaitpuppeteer.launch();//打开一个新的浏览器constpage=awaitbrowser.newPage();//打开一个新的浏览器webpageawaitpage.goto('https://www.jd.com/');//转到'url'里面的网页constresult=awaitpage.evaluate(()=>{//这个结果数组包含所有theimagesrcaddressesletarr=[];//这个箭头函数里面的写处理逻辑constimgs=document.querySelectorAll('img');imgs.forEach(function(item){arr.push(item.src)})returnarr});//'此时的结果就是获取到的爬虫数据,可以通过'fs'模块保存'})()复制过去,使用命令行命令`节点文件名`运行并获取爬虫数据。这个puppeteer包其实是帮我们打开了另外一个浏览器,重新打开网页,获取到了。数据。以上只爬取了京东首页的图片内容。假设我的需求进一步扩展,我需要爬取京东首页所有标签对应的跳转页面中标题的所有文字内容,最后放入一个数组中。我们的异步函数分为五步,只有puppeteer.launch(),browser.newPage(),browser.close()是固定的。page.goto指定我们去哪个网页爬取数据,可以更改内部url地址,也可以多次调用该方法。page.evaluate这个函数内部处理了我们要爬取到网页的数据逻辑page.goto和page.evaluate。async内部可以调用多次,也就是说我们可以先进入京东网页,处理逻辑。最后,再次调用page.goto函数。注意上面所有的逻辑都是puppeteer包帮我们在看不见的地方打开另一个浏览器,然后处理逻辑,所以最后调用browser.close()方法关闭那个浏览器。这个时候我们优化上篇文章的代码,爬取对应的资源。constpuppeteer=require('puppeteer');(async()=>{constbrowser=awaitpuppeteer.launch();constpage=awaitbrowser.newPage();awaitpage.goto('https://www.jd.com/');consthrefArr=awaitpage.evaluate(()=>{letarr=[];constaNodes=document.querySelectorAll('.cate_menu_lk');aNodes.forEach(function(item){arr.push(item.href)})returnarr});letarr=[];for(leti=0;i{//该方法内部console.log无效return$('title').text();//返回每个界面的标题文本内容});arr.push(result)//通过循环每次将对应的值添加到数组中}console.log(arr)//可以通过将对应的数据保存到本地Node.js的fs模块awaitbrowser.close()})()有一个天坑page.evaluate函数。内部无法打印console.log,内部无法获取外部变量。只能退货了。使用的选择器必须先到相应的边界我们测试了是否可以在控制台再次选择DOM使用。比如京东不能用querySelector。既然京东的界面使用了jQuery,那么我们就可以使用jQuery。总之,他们开发的选择器我们都可以用,否则没办法。接下来我们直接爬取Node.js官网首页,然后直接生成PDF。不管你会不会Node.js和puppeteer爬虫,都可以操作。请仔细阅读本文档并按顺序执行此项目的每个步骤。实现需求:给我们一个网页地址,爬取它的网页内容,然后输出成我们想要的PDF格式文档。请注意,这是高质量PDF文档的第一步。安装Node.js,推荐http://nodejs.cn/download/,Node.js中文官网下载对应的操作系统包第二步,下载安装好Node.js后,启动windows命令行工具(windows下启动系统搜索功能,输入cmd,回车,会出来)第三步,查看环境变量是否已经自动配置,在命令行工具中输入node-v,如果字段v10。出现***,表示Node.js安装成功。第三步,如果你发现输入node-v后没有出现相应的字段,那么请重启电脑。第五步,打开项目文件夹,打开命令行工具(windows系统直接在文件的url地址栏输入cmd即可打开),输入npmicnpmnodemon-g第六步下载puppeteer爬虫包,第五步完成后,使用cnpmipuppeteer--save命令下载第七步第六步下载完成后,打开项目url.js,将你需要爬取的网页地址替换为爬虫(默认为http://nodejs.cn/)Step8在命令行输入nodemonindex.js,爬取相应内容并自动输出到当前文件夹下的index.pdf文件。TIPS:本项目的设计思路是一个网页和一个PDF文件,所以每次爬取一个页面后,请将index.pdf复制出来,然后继续更改url地址继续爬取Fetch和生成新的PDF文件。当然你也可以一次爬取多个网页,通过循环编译的方式生成多个PDF文件。对应像京东首页这种开启了图片延迟加载的网页,抓取到的部分内容是处于loading状态。对于有一些反爬虫机制的网页,爬虫也会有问题,但是大部分网站是可以的browser=awaitpuppeteer.launch({headless:true})constpage=awaitbrowser.newPage()//选择要打开的网页awaitpage.goto(url,{waitUntil:'networkidle0'})//选择路径你要输出的PDF文件名,将爬取的内容输出为PDF,必须存在PDF,可以为空内容,如果不是空内容PDF,则覆盖内容letpdfFilePath='./index.pdf';//根据你的配置选项,这里我们选择A4纸张大小输出PDF,方便打印awaitpage.pdf({path:pdfFilePath,format:'A4',scale:1,printBackground:true,landscape:false,displayHeaderFooter:false});awaitbrowser.close()})()这个时代的文件解构设计资料非常珍贵。根据网页的设计逻辑,如果选择了具体的href地址,可以直接先获取对应的资源,或者再次使用page.goto方法进入,然后调用page.evaluate()处理逻辑,或者输出对应的当然也可以一口气输出多个PDF文件~这里就不过多介绍了,毕竟Node.js可以上天,说不定以后真的可以无所不能。如此优质短小的教程,请收藏或转发给您的朋友,谢谢。