开发函数计算的正确姿势 —— 爬虫
Posted 阿里云云栖号
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发函数计算的正确姿势 —— 爬虫相关的知识,希望对你有一定的参考价值。
云栖君导读:本文我们拿一个简单的场景来举例子——开发一个简单的爬虫函数(代码参考函数计算控制台模板),介绍如何以正确姿势,从零开始,开发一个自动伸缩、按调用次数收费的 serverless 爬虫应用。
开发步骤
我们将这个完整的应用拆分成多步,并且在每一步完成后,我们都会进行相应的运行验证。
1. 创建 Fun 项目
首先,我们创建一个名为 image-crawler 的目录作为项目的根。然后在该目录下创建一个名为 template.yml 的文件,内容为:
如果不了解 Fun 定义的 Serverless Application Model,可以参考 这里。https://github.com/aliyun/fun/blob/master/docs/specs/2018-04-03-zh-cn.md
操作完成后,我们的项目目录结构如下:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/a71f8cf1ac8b46f6bb6244635e98f3da.jpg)
2. 编写 helloworld 函数代码
在根目录下创建一个名为 code 的目录,并在该目录下创建一个名为 index.py 的文件,内容为一个简单的 helloworld 函数:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/a16bf0d20de848008e812f2077f62313.jpg)
在项目根目录下执行:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/16ab507063cb456396de980866b59766.jpg)
函数运行成功:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/affc1604c56347e8a053ab80852c3cd0.jpg)
操作完成后,我们的项目目录结构如下:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/14f6d2fcee14423483162160325f3077.jpg)
3. 事件触发函数运行
我们简单修改第 2 步的代码,将 event 打印到 log 中。
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/349d342c2a464248a2442b7dd74ba436.jpg)
通过触发事件的方式运行函数,得到如下结果:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/675511abbdc14ecca803f32a64d580e3.jpg)
可以看到,我们的函数已经能正确接收到触发事件了。
Fun Local 更多帮助信息,参考。
https://yq.aliyun.com/articles/672623
4. 获取网页源码内容
接下来,我们添加获取网页内容的代码。
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/8ea6f2ef34fd4d60a42ab66609ab04c5.jpg)
代码逻辑比较简单,我们这里直接使用了 urllib 库,读取网页内容。
运行函数,得到以下输出:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/628e4c69b5c240d08e3306ff36a15b99.jpg)
5. 解析网页中的图片
我们打算通过正则解析网页中包含的 jpg 图片,因此这一步会比较繁琐,因为涉及到正则表达式的微调。为了能快速的解决问题,我们决定利用 fun local 提供的 local debugging 解决问题。local debugging 方法参考: 《函数计算本地运行与调试 - Fun Local 基本用法》。
https://yq.aliyun.com/articles/672623
首先,我们在下面这一行下个断点:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/778ce7335b8549e9a57c922426ce5e90.jpg)
然后以 debug 的方式启动,vscode 调试器连接后,函数会继续运行到我们断点的这一行:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/ab0879ae9a974f7a8a38d78d62f648f8.jpg)
我们可以直接在 Locals 一栏看到本地变量,其中包含了 html 这个变量,也就是我们获取到的 html 源码。我们可以将它的值复制出来,分析下,然后设计正则表达式。
我们可以先写一个简单的,比如可以是
http:\/\/[^\s,"]*\.jpg。
怎么快速校验这段代码的正确性呢?我们可以利用调试器提供的 Watch(监视) 功能。
创建一个 Watch 变量,将下面的值输入进去:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/084e9316d25544d2875311e0065b9d52.jpg)
回车后,即可看到代码的执行效果:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/8acb47207a43478a96836aabdbd4b46e.jpg)
这里一般不太容易一次写对,可以反复修改正则测试,直到正确为止。
我们得到的正确的图片解析的逻辑添加到代码中:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/8c351ee7724f4720b81130e635fa3ba4.jpg)
然后在 handler 方法中调用即可:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/ba28ee33266040b9bfb0927ce7657f5a.jpg)
编写完成后,可以继续本地执行,验证下结果:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/b8168d86c07f414dad1461760b514a29.jpg)
可以看到,img_list 已经输出到控制台了:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/6ef96377b8704284ac4d37e0b3976a9b.jpg)
6. 将图片上传到 oss
解析到的图片,我们选择使用 oss 存储。
首先,我们需要通过环境变量配置 OSS Endpoint 以及 OSS Bucket。
在 template 中配置环境变量(需提前创建好 oss bucket):
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/220237d2dfbc4f64ad87686d5b556df1.jpg)
然后就可以直接在函数中获取到这两个环境变量了:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/96b7a98ee04143f3b68cdd72e1806967.jpg)
另外,fun local 运行函数时,还会提供一个额外的变量用来标识这是一个本地运行的函数。通过这个标识,我们可以用来做一些本地化的操作,比如我们可以在线上运行时连接 RDS,在本地运行时连接 mysql。
这里,我们用该标识以不同的的方式创建 oss client,原因是线上运行时,通过 credentials 获取到的是扮演角色的临时 ak,有有效期限制,而本地运行时,没有该限制。oss 提供了这两种方式的构造方法,我们直接使用即可:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/12182ecff6994f79ad784620a5399ffa.jpg)
接着我们遍历所有图片,将所有的图片上传到 oss:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/86ad73f031fc4f59acd7cf1e0e3f72d1.jpg)
再在本地运行一下函数:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/fc4c4bfc9d054b21962742e5e78ed6b1.jpg)
可以从日志看到,图片被一张一张的解析出来,并被上传到 oss 上了。
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/7b590bd1affd40d2a9672c4065ac9b44.jpg)
登陆 oss 控制台,可以看到这些图片。
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/4c36c339f150418f963ae33f03201b51.jpg)
部署
本地开发完成后,我们还需要将其发布到线上,让其成为一个可被调用的服务。以往,你可能觉得比较麻烦,比如要登陆控制台,创建服务、创建函数、配置环境变量,创建角色等,现在有了 fun 后,这一切都不需要了。
不过,本地与线上还是有些区别的,那就是要授权函数计算能够访问 OSS,怎么做呢?很简单,在我们的 template 中加入一行配置即可(Polices 文档,可以参考):
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/e2e20b1c3ba24a77b7d07dfb7584653c.jpg)
添加后的 template.yml 内容如下:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/d58efa0a49fa473799050a8961d3ed98.jpg)
然后,使用 fun deploy 后,可以看到部署成功的日志。
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/d743d90a00e14584afb0e39b486d6798.jpg)
验证
通过控制台验证
登陆控制台,可以看到,我们的服务、函数、代码、环境变量等都已经就绪了。
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/008c474208f64cfd9bcfcbe924faff76.jpg)
在触发事件中,写入我们用来测试的 json,然后执行:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/ba45fed3b9f54808b4a9a15a46909078.jpg)
可以发现,会获得与本地一致的效果:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/ac6eb1d8cd984ab39b433f348d179847.jpg)
通过 fcli 验证
fcli 帮助文档 参考。
https://help.aliyun.com/document_detail/52995.html
在终端执行以下命令,可以获取函数列表:
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/2eed3f01812740109b8ba2f95bf77766.jpg)
可以看到我们的 image-crawler 已经创建成功了。
![开发函数计算的正确姿势 —— 爬虫](https://image.cha138.com/20210502/d6e9ecb51f764ff8b715a971b3c915a2.jpg)
使用以下命令则可以调用函数运行:
运行成功后,会得到与控制台与 fun local 一致的结果。
小结
至此,我们的开发就算告一段落。
本文利用 fun local 提供的本地运行、调试的能力,做到了在本地开发函数,并且通过反复的执行函数得到反馈以便于快速迭代代码。
在本地开发完成后,不需要对代码进行任何修改,通过 fun deploy 命令,一键部署到云端,达到预期的效果。
本文介绍的方法,并不是开发函数计算的唯一方式。本文的目的,是能够向开发者传达一种信号——开发函数计算时,只要身姿正确,就会非常享受,开发流程也会十分顺畅。祝您使用愉快。
end
更多精彩
以上是关于开发函数计算的正确姿势 —— 爬虫的主要内容,如果未能解决你的问题,请参考以下文章