手机版

如何使用Node.js抓取任何网页资源并在本地输出PDF文件

时间:2021-08-22 来源:互联网 编辑:宝哥软件园 浏览:

要求:

使用Node.js对网页资源进行抓取,将抓取到的网页内容以PDF格式开箱输出。如果你是技术人员,可以看我的下一篇文章,否则请直接搬到我的github仓库,直接看文档。

仓库地址:附带文档和源代码

该需求中使用的技术:Node.js和木偶师

Puppeter官网地址: puppeteer Address Node.js官网地址: Link Description Puppeter是谷歌出品的Node库,通过DevTools协议控制无头Chrome。可以直接控制Chrome模拟UI Test的大部分用户操作,也可以作为爬虫访问页面,通过Puppeteer提供的api收集数据。木偶师的环境和安装取决于6.4以上的节点,但对于异步/等待,建议使用7.6以上的节点。另外,无头Chrome本身对服务器所依赖的库的版本要求较高,centos服务器稳定,所以在v6中很难使用无头Chrome。升级依赖版本时可能会出现各种服务器问题(包括但不限于无法使用ssh),因此最好使用更高版本的服务器。(建议使用最新版本的Node.js)试刀爬JD的资源。计算机输出缩微胶片

const木偶师=require('木偶师');//引入依赖关系(async ()={//使用async函数完美异步const browser=await puppet . launch();//打开一个新的浏览器const page=await browser . new page();//打开一个新网页await page . goto(' https://www . JD.com/');//转到const result=await page . evaluate(()={//此结果数组包含所有图片src地址let arr=[];//在这个箭头函数constit MGS=document . queryselectorall(' img ')内部写入处理的逻辑;imgs.forEach(函数(item) {arr.push(item.src)})返回arr });//'此时的结果是爬虫数据,可以通过' fs '模块保存。) ()复制过去并使用命令行命令节点文件名'来运行傀儡包以获取爬虫数据。事实上,它为我们打开了另一个浏览器,重新打开了网页并获得了他们的数据。

以上只抓取JD的图片内容。COM的主页,假设我的需求进一步扩大,我需要抓取JD中所有A标签对应的跳转页面中标题的所有文本内容。COM的主页,最后把它放在一个数组中。我们的异步函数分为五个步骤,但只有puppet.launch()、browser.newpage()和browser.close()是固定的。Page.goto指定我们要对哪个页面的数据进行爬网,并且可以更改内部url地址或多次调用此方法。page.evaluate函数包含两个方法,page.goto和page.evaluate,它们处理我们进入要抓取的网页的数据逻辑。它们可以在异步中被多次调用,这意味着我们可以先进入JD.COM网页,然后在处理完逻辑后再次调用函数page.goto。注意,上面所有的逻辑,都是木偶师包帮助我们在看不见的地方打开另一个浏览器,然后处理逻辑,所以我们要调用browser.close()方法关闭那个浏览器。

此时,我们优化前面的代码并抓取相应的资源。

const木偶师=require('木偶师');(async()={ const browser=wait puppeter . launch();const page=wait browser . NewPage();wait page . goto(' https://www . JD.com/');const HRefrar=await page . evaluate(()={ let arr=[];const阳极=document.querySelectorAll('。cate _ menu _ lk’);阳极. forEach(函数(项){arr.push(项. href)})返回arr });让arr=[];for(设I=0;i hrefArr.lengthI){ const URL=HRefrar[I];Console.log(url) //您可以在此打印等待页面. goto(URL);Const result=awaitpage。evaluate(()={//此方法的console.log返回$(“title”))无效。text();//返回各界面的标题文本内容});Arr.push(result) //每次在数组中加入对应的值}console.log(arr) //得到的对应数据可以保存到本地的await browser.close()})()页面内部的console.log .带有天坑的evaluate函数无法打印。而且外部变量不能从内部获取,只能通过return返回。使用的选择器必须先去对应界面的控制台,测试DOM是否可以选择然后使用。例如,JD.COM不能使用querySelector。这里,因为JD.COM的所有接口都使用jQuery,所以我们可以使用jQuery。简而言之,我们可以使用他们开发的所有选择器,否则我们不能。

接下来我们直接爬Node.js的官网主页,直接生成PDF

不管你知不知道Node.js和木偶剧的爬虫,都可以操作。请仔细阅读本文档,并按顺序执行每个步骤。

这个项目的要求:给我们一个网址,抓取他的网页内容,然后输出成我们想要的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打开),输入npm i cnpm nodemon -g,在第6步下载puppeteer crawler包。完成第5步后,您可以使用cnpm I puppeter-save命令下载它。打开这个项目的url.js,替换需要爬虫抓取的网页地址(默认为http://nodejs.cn/)。第八步:在命令行输入nodemon index.js,抓取相应的内容。并自动输出到当前文件夹下的index.PDF文件。TIPS:这个项目的设计思路是一个网页就是一个pdf文件,所以爬取单个页面后,请复制index.PDF,然后继续更改url地址,继续爬取,并生成新的PDF文件。当然,你可以通过循环编译的方式,一次抓取多个网页,生成多个pdf文件。

对应图片偷懒加载的网页,比如JD.COM的主页,部分抓取的内容就是加载状态的内容。对于有一些反爬虫机制的网页,爬虫也会有问题,但是大部分网站都可以

const木偶师=require('木偶师');const url=require('。/URL ');(async()={ const browser=await puppet . launch({ headled : true })const page=await browser . new page()//选择要打开的网页wait page.goto(url,{ wauntil : ' network idle 0 ' })//选择要输出的PDF文件路径,并将抓取的内容输出到PDF,该PDF必须是现有的PDF或空内容。如果它不是一个空的内容PDF,它将覆盖内容let pdfFilePath='。/index . pdf ';//根据您的配置选项,我们选择A4纸输出PDF,方便打印AwaitPage.pdf({ Path : PDF文件路径,Format :' A4 ',Scale : 1,打印背景3360 True,横向: False,DisplayHeaderfoot 3360 False });wait browser.close()})()文件的解构设计

数据在这个时代非常珍贵。根据网页的设计逻辑,如果选择一个特定的href地址,可以直接获取对应的资源,也可以使用page.goto方法再次输入,然后调用page.evaluate()处理逻辑,或者输出对应的PDF文件,当然也可以一次输出多个PDF文件~

这里就不多介绍了。毕竟Node.js可以上天堂,说不定以后真的什么都能做。请收藏或转发这么短的高质量教程给你的朋友,谢谢。

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:如何使用Node.js抓取任何网页资源并在本地输出PDF文件是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。