首页 > 语言 > JavaScript > 正文

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

2024-05-06 15:37:52
字体:
来源:转载
供稿:网友

需求:

使用Node.js爬取网页资源,开箱即用的配置 将爬取到的网页内容以PDF格式输出

如果你是一名技术人员,那么可以看我接下来的文章,否则,请直接移步到我的github仓库,直接看文档使用即可

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

本需求使用到的技术:Node.js和puppeteer

puppeteer 官网地址: puppeteer地址 Node.js官网地址:链接描述 Puppeteer是谷歌官方出品的一个通过DevTools协议控制headless Chrome的Node库。可以通过Puppeteer的提供的api直接控制Chrome模拟大部分用户操作来进行UI Test或者作为爬虫访问页面来收集数据。 环境和安装 Puppeteer本身依赖6.4以上的Node,但是为了异步超级好用的async/await,推荐使用7.6版本以上的Node。另外headless Chrome本身对服务器依赖的库的版本要求比较高,centos服务器依赖偏稳定,v6很难使用headless Chrome,提升依赖版本可能出现各种服务器问题(包括且不限于无法使用ssh),最好使用高版本服务器。(建议使用最新版本的Node.js)

小试牛刀,爬取京东资源

const puppeteer = require('puppeteer'); // 引入依赖 (async () => { //使用async函数完美异步 const browser = await puppeteer.launch(); //打开新的浏览器const page = await browser.newPage(); // 打开新的网页 await page.goto('https://www.jd.com/'); //前往里面 'url' 的网页const result = await page.evaluate(() => { //这个result数组包含所有的图片src地址let arr = []; //这个箭头函数内部写处理的逻辑 const imgs = document.querySelectorAll('img');imgs.forEach(function (item) {arr.push(item.src)})return arr });// '此时的result就是得到的爬虫数据,可以通过'fs'模块保存'})()

复制过去 使用命令行命令 ` node 文件名 ` 就可以运行获取爬虫数据了 这个 puppeteer 的包 ,其实是替我们开启了另一个浏览器,重新去开启网页,获取它们的数据。

上面只爬取了京东首页的图片内容,假设我的需求进一步扩大,需要爬取京东首页中的所有<a> 标签对应的跳转网页中的所有 title的文字内容,最后放到一个数组中。 我们的async函数上面一共分了五步, 只有 puppeteer.launch() ,browser.newPage(), browser.close() 是固定的写法。 page.goto 指定我们去哪个网页爬取数据,可以更换内部url地址,也可以多次调用这个方法。 page.evaluate 这个函数,内部是处理我们进入想要爬取网页的数据逻辑 page.goto和page.evaluate两个方法,可以在async内部调用多次,那意味着我们可以先进入京东网页,处理逻辑后,再次调用page.goto这个函数

注意,上面这一切逻辑,都是puppeteer这个包帮我们在看不见的地方开启了另外一个浏览器,然后处理逻辑,所以最终要调用browser.close()方法关闭那个浏览器。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选