使用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。

bannerAds