返回
NodeJs或命令行爬取网络教程并生成PDF文件
前端
2023-11-10 03:37:05
前言
在互联网上,有许多优秀的网络教程,但这些教程往往都是以网页的形式呈现的,这使得我们很难将其保存下来,或者在没有网络连接的情况下阅读。因此,本文将介绍如何使用NodeJs或命令行爬取网络教程并生成PDF文件,以阮一峰JavaScript教程和ES6教程为例。
使用NodeJs爬取网络教程并生成PDF文件
安装依赖
首先,我们需要安装必要的依赖。我们可以使用以下命令来安装:
npm install --save cheerio puppeteer wkhtmltopdf
编写代码
安装完成后,我们就可以编写代码了。我们可以使用以下代码来爬取阮一峰JavaScript教程并生成PDF文件:
const cheerio = require('cheerio');
const puppeteer = require('puppeteer');
const wkhtmltopdf = require('wkhtmltopdf');
async function main() {
// 首先,我们需要创建一个Puppeteer浏览器。
const browser = await puppeteer.launch();
// 然后,我们需要创建一个新的页面。
const page = await browser.newPage();
// 接下来,我们需要导航到阮一峰JavaScript教程的首页。
await page.goto('https://www.ruanyifeng.com/javascript/');
// 等待页面加载完成。
await page.waitForNavigation();
// 使用Cheerio来解析页面内容。
const $ = cheerio.load(await page.content());
// 获取所有文章的链接。
const links = $('a[href^="/javascript/"]').map((i, el) => $(el).attr('href')).get();
// 循环遍历所有文章的链接。
for (let i = 0; i < links.length; i++) {
// 导航到文章的页面。
await page.goto(`https://www.ruanyifeng.com${links[i]}`);
// 等待页面加载完成。
await page.waitForNavigation();
// 使用Wkhtmltopdf将页面另存为PDF文件。
await wkhtmltopdf.pdf(`https://www.ruanyifeng.com${links[i]}`, {
output: `./javascript/${i}.pdf`,
});
}
// 关闭浏览器。
await browser.close();
}
main();
运行代码
运行代码后,我们会在当前目录下生成一个名为“javascript”的文件夹,其中包含了所有阮一峰JavaScript教程文章的PDF文件。
使用命令行爬取网络教程并生成PDF文件
安装依赖
首先,我们需要安装必要的依赖。我们可以使用以下命令来安装:
sudo apt install wkhtmltopdf
编写脚本
安装完成后,我们就可以编写脚本了。我们可以使用以下脚本来爬取阮一峰JavaScript教程并生成PDF文件:
#!/bin/bash
# 创建一个临时目录。
mkdir tmp
# 导航到阮一峰JavaScript教程的首页。
curl -s 'https://www.ruanyifeng.com/javascript/' > tmp/index.html
# 使用Cheerio来解析页面内容。
links=$(cat tmp/index.html | grep -oP 'href="(/javascript/[^"]+)"' | cut -d'"' -f2)
# 循环遍历所有文章的链接。
for link in $links; do
# 导航到文章的页面。
curl -s "https://www.ruanyifeng.com$link" > tmp/article.html
# 使用Wkhtmltopdf将页面另存为PDF文件。
wkhtmltopdf tmp/article.html "${link/\//-}.pdf"
done
# 删除临时目录。
rm -rf tmp
运行脚本
运行脚本后,我们会在当前目录下生成一个名为“javascript”的文件夹,其中包含了所有阮一峰JavaScript教程文章的PDF文件。
总结
以上两种方法都可以用来爬取网络教程并生成PDF文件。NodeJs方法更加灵活,但需要安装更多的依赖。命令行方法更加简单,但功能有限。我们可以根据自己的需要来选择使用哪种方法。