使用Node.js编写程序(puppeteer)
编写Node.js程序
我将创建一个程序,定期通过邮件发送特定网站的信息,并同时将值保存到数据库中。我将使用nodejs的puppeteer库来进行网页抓取。
前期准备
开始使用puppeteer,下载此程序所需模块可以通过npm install进行下载。
写代码来爬取信息
我本来可以认真地跟踪标签,不过我使用了一个名为Puppeteer Recorder的chrome扩展工具来提供辅助。
Chrome扩展程序Puppeteer Recorder的自动操作使用方法和注意事项 | iwb.jp
由于这样只会使代码变得冗长,所以稍后需要进行修改。
处理密码
我使用了一个名为dotenv的Node.js包。可以在程序中作为环境变量读取同文件夹下.env文件中写入的值。当然,.env文件不会被Git管理,防止将其提交到远程代码仓库。
require('dotenv').config();
const puppeteer = require('puppeteer');
const USER_ID = process.env.MY_USER_ID;
const PASSWORD = process.env.MY_PASSWORD;
虽然可以自己创建并读取类似secret.json的文件,但按照领域标准而非自行实现是最好的选择。
发送电子邮件
使用SaaS服务SendGrid。从SendGrid网页获取免费账户。获取访问密钥。在SendGrid上有快速入门指南,可以参考。
由于有适用于Node.js的库可用,所以需要引入。以下是代码。
const sgMail = require('@sendgrid/mail');
const msg = {
to: EMAIL,
from: EMAIL,
subject: 'Sending with SendGrid is Fun(APIKEY)',
text: 'and easy to do anywhere, even with Node.js',
html: '<strong>and easy to do anywhere, even with Node.js</strong>',
};
sgMail.send(msg);
儲存至存儲空間
我使用了 CosmosDB。按照下面的参考文档的指示进行操作很容易理解。
在Azure Cosmos DB中使用SQL API的Node.js教程| 微软文档
从零开始的Azure教程(15) 使用NoSQL数据库”Cosmos DB”在Azure中尝试 | My Navi新闻
有一个问题点。按照参考指南操作时,如果尝试向已手动创建的数据库添加项目,则会出现错误。这是因为使用GUI创建CosmosDB时需要指定分区键,而对于已指定分区键的数据库,在添加项目时必须同时指定分区键才能接受。如果不使用分区键,则需要按照教程中的指示,从命令行创建cosmosdb。
由于不知道如何设置分区键,所以我选择在没有分区键的数据库上继续处理。
Azure Cosmos DB入门(目录)- ryuichi111std的技术日记
确认行动
听说事情顺利处理了,真是太好了。
闲话不算数
宇宙数据库
只是為了應付而使用,並非必要。對於我的這次用途來說,僅將其輸出到文字日誌以便需要時查閱,已經足夠了。
不使用selenium的原因
有一款名为Python的Selenium,在Web爬取和自动化测试中非常有名。为什么不使用它,而选择了Puppeteer呢?因为我想要将这个脚本在Serverless上运行,而根据我的调查,使用Node.js和Puppeteer似乎比Python + Selenium + Headless Chrome更加适合。简单来说,前者需要将Headless Chrome单独上传到Serverless中并调用,可能会遇到很多问题。而后者只需引入Puppeteer,它内部已经包含了Headless,而且相较于Python,JavaScript在Serverless上的兼容性更好、速度更快。
在无服务器环境下运行
目前还无法做到,只阅读了文章。
-
- AWS Lambda
PuppeteerをLambdaで使う前段階、serverless-chrome/lambdaのnpmインストールでハマったときの解決法 | PRESSMAN*Tech
Puppeteer on AWS Lambda で日本語対応したキャプチャを撮影してS3にアップロードするまでの設定 – Qiita
Puppeteer on LambdaでWebページのキャプチャを撮る | PRESSMAN*Tech
AWS Lambda上でpuppeteerを動かして、スクレイピングする – Qiita
Azure Function
Azure Functions (Node.js) で npm パッケージを追加して利用する方法 (コンソール利用) – Qiita
Azure FunctionsでPuppeteerが使えない – Qiita
Google Cloud Functions
Cloud Functions with Puppeteer + Google Apps Script でスクレイピングサーバーをサクッと作る – Qiita
以下是障碍:
-
- Serverless毎に多少特徴があり、特徴が分かっていないとハマりどころが多い事
-
- Javascript自体の知識が必要な所もあり、その知識がないと余計な所でハマってしまうこと
- バージョン管理(npm)の知識が必要な所もあり、その知識がないと検証するにあたって時間がかかってしまうこと
好吧,作为我的倾向,在开始之前尽量排除一些“陷阱”,这样我才会着手处理(每个人都是这样)。从这个意义上说,我曾考虑使用我平常用的VSCode和稍微有些经验的Azure Function的组合来实现,但很明显,目前Azure Function对于Headless Chrome的执行有所限制…。于是,我尝试了AWS Lambda,但是发现有文件上传限制之类的问题,无法成功制作出来。
因此,我考虑尝试一下Google Cloud Functions。