iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >开发函数计算的正确姿势 —— 爬虫
  • 845
分享到

开发函数计算的正确姿势 —— 爬虫

2023-06-03 23:06:41 845人浏览 泡泡鱼
摘要

在 《函数计算本地运行与调试 - Fun Local 基本用法》 中,我们介绍了利用 Fun Local 本地运行、调试函数的方法。但如果仅仅这样简单的介绍,并不能展现 Fun Local 对函数计算开发的巨大效率的提升。这一次,我们拿一个

在 《函数计算本地运行与调试 - Fun Local 基本用法》 中,我们介绍了利用 Fun Local 本地运行、调试函数的方法。但如果仅仅这样简单的介绍,并不能展现 Fun Local 对函数计算开发的巨大效率的提升。

这一次,我们拿一个简单的场景来举例子——开发一个简单的爬虫函数(代码参考函数计算控制台模板),介绍如何以正确姿势,从零开始,开发一个自动伸缩、按调用次数收费的 serverless 爬虫应用。

开发步骤

我们将这个完整的应用拆分成多步,并且在每一步完成后,我们都会进行相应的运行验证。

1. 创建 Fun 项目

首先,我们创建一个名为 image-crawler 的目录作为项目的根。然后在该目录下创建一个名为 template.yml 的文件,内容为:

ROSTemplateFORMatVersion: '2015-09-01'Transform: 'Aliyun::Serverless-2018-04-03'Resources:  localdemo:    Type: 'Aliyun::Serverless::Service'    Properties:      Description: 'local invoke demo'    image-crawler:      Type: 'Aliyun::Serverless::Function'      Properties:        Handler: index.handler        CodeUri: code/        Description: 'Hello world with python2.7!'        Runtime: Python2.7

如果不了解 Fun 定义的 Serverless Application Model,可以参考 这里。

操作完成后,我们的项目目录结构如下:

.└── template.yml

2. 编写 helloworld 函数代码

在根目录下创建一个名为 code 的目录,并在该目录下创建一个名为 index.py 的文件,内容为一个简单的 helloworld 函数:

def handler(event, context):    return 'hello world!'

在项目根目录下执行:

fun local invoke image-crawler

函数运行成功:

开发函数计算的正确姿势 —— 爬虫

操作完成后,我们的项目目录结构如下:

.├── code│   └── index.py└── template.yml

3. 事件触发函数运行

我们简单修改第 2 步的代码,将 event 打印到 log 中。

import logginglogger = logging.getLogger()def handler(event, context):    logger.info("event: " + event)    return 'hello world!'

通过触发事件的方式运行函数,得到如下结果:

开发函数计算的正确姿势 —— 爬虫

可以看到,我们的函数已经能正确接收到触发事件了。

Fun Local 更多帮助信息,参考。

4. 获取网页源码内容

接下来,我们添加获取网页内容的代码。

import loggingimport JSONimport urlliblogger = logging.getLogger()def handler(event, context):    logger.info("event: " + event)    evt = json.loads(event)    url = evt['url']      html = get_html(url)      logger.info("html content length: " + str(len(html)))    return 'Done!'def get_html(url):    page = urllib.urlopen(url)    html = page.read()    return html

代码逻辑比较简单,我们这里直接使用了 urllib 库,读取网页内容。

运行函数,得到以下输出:

开发函数计算的正确姿势 —— 爬虫

5. 解析网页中的图片

我们打算通过正则解析网页中包含的 jpg 图片,因此这一步会比较繁琐,因为涉及到正则表达式的微调。为了能快速的解决问题,我们决定利用 fun local 提供的 local debugging 解决问题。local debugging 方法参考: 《函数计算本地运行与调试 - Fun Local 基本用法》。

首先,我们在下面这一行下个断点:

logger.info("html content length: " + str(len(html)))

然后以 debug 的方式启动,vscode 调试器连接后,函数会继续运行到我们断点的这一行:

开发函数计算的正确姿势 —— 爬虫

我们可以直接在 Locals 一栏看到本地变量,其中包含了 html 这个变量,也就是我们获取到的 html 源码。我们可以将它的值复制出来,分析下,然后设计正则表达式。

我们可以先写一个简单的,比如可以是 Http:\/\/[^\s,"]*\.jpg

怎么快速校验这段代码的正确性呢?我们可以利用调试器提供的 Watch(监视) 功能。

创建一个 Watch 变量,将下面的值输入进去:

re.findall(re.compile(r'http:\/\/[^\s,"]*\.jpg'), html)

回车后,即可看到代码的执行效果:

开发函数计算的正确姿势 —— 爬虫

这里一般不太容易一次写对,可以反复修改正则测试,直到正确为止。

我们得到的正确的图片解析的逻辑添加到代码中:

reg = r'http:\/\/[^\s,"]*\.jpg'imgre = re.compile(reg)def get_img(html):    return re.findall(imgre, html)

然后在 handler 方法中调用即可:

def handler(event, context):    logger.info("event: " + event)    evt = json.loads(event)    url = evt['url']      html = get_html(url)      img_list = get_img(html)    logger.info(img_list)      return 'Done!'

编写完成后,可以继续本地执行,验证下结果:

echo '{"url": "https://image.baidu.com/search/index?tn=baiduimage&Word=%E5%A3%81%E7%BA%B8"}' \    | fun local invoke image-crawler

可以看到,img_list 已经输出到控制台了:

开发函数计算的正确姿势 —— 爬虫

6. 将图片上传到 oss

解析到的图片,我们选择使用 oss 存储。

首先,我们需要通过环境变量配置 OSS Endpoint 以及 OSS Bucket。

在 template 中配置环境变量(需提前创建好 oss bucket):

EnvironmentVariables:    OSSEndpoint: oss-cn-hangzhou.aliyuncs.com    BucketName: fun-local-test

然后就可以直接在函数中获取到这两个环境变量了:

endpoint = os.environ['OSSEndpoint']bucket_name = os.environ['BucketName']

另外,fun local 运行函数时,还会提供一个额外的变量用来标识这是一个本地运行的函数。通过这个标识,我们可以用来做一些本地化的操作,比如我们可以在线上运行时连接 RDS,在本地运行时连接 Mysql

这里,我们用该标识以不同的的方式创建 oss client,原因是线上运行时,通过 credentials 获取到的是扮演角色的临时 ak,有有效期限制,而本地运行时,没有该限制。oss 提供了这两种方式的构造方法,我们直接使用即可:

creds = context.credentialsif (local):    auth = oss2.Auth(creds.access_key_id,                     creds.access_key_secret)else:    auth = oss2.StsAuth(creds.access_key_id,                        creds.access_key_secret,                        creds.security_token)                        bucket = oss2.Bucket(auth, endpoint, bucket_name)

接着我们遍历所有图片,将所有的图片上传到 oss:

count = 0for item in img_list:    count += 1    logging.info(item)    # Get each picture    pic = urllib.urlopen(item)    # Store all the pictures in oss bucket, keyed by timestamp in microsecond unit    bucket.put_object(str(datetime.datetime.now().microsecond) + '.png', pic)

再在本地运行一下函数:

echo '{"url": "https://image.baidu.com/search/index?tn=baiduimage&word=%E5%A3%81%E7%BA%B8"}' \    | fun local invoke image-crawler

可以从日志看到,图片被一张一张的解析出来,并被上传到 oss 上了。
开发函数计算的正确姿势 —— 爬虫

登陆 oss 控制台,可以看到这些图片。
开发函数计算的正确姿势 —— 爬虫

部署

本地开发完成后,我们还需要将其发布到线上,让其成为一个可被调用的服务。以往,你可能觉得比较麻烦,比如要登陆控制台,创建服务、创建函数、配置环境变量,创建角色等,现在有了 fun 后,这一切都不需要了。

不过,本地与线上还是有些区别的,那就是要授权函数计算能够访问 OSS,怎么做呢?很简单,在我们的 template 中加入一行配置即可(Polices 文档,可以参考):

Policies: AliyunOSSFullAccess

添加后的 template.yml 内容如下:

ROSTemplateFormatVersion: '2015-09-01'Transform: 'Aliyun::Serverless-2018-04-03'Resources:  localdemo:    Type: 'Aliyun::Serverless::Service'    Properties:      Description: 'local invoke demo'      Policies: AliyunOSSFullAccess    image-crawler:      Type: 'Aliyun::Serverless::Function'      Properties:        Handler: index.handler        CodeUri: code/        Description: 'Hello world with python2.7!'        Runtime: python2.7        EnvironmentVariables:          OSSEndpoint: oss-cn-hangzhou.aliyuncs.com          BucketName: fun-local-test

然后,使用 fun deploy 后,可以看到部署成功的日志。

开发函数计算的正确姿势 —— 爬虫

验证

通过控制台验证

登陆控制台,可以看到,我们的服务、函数、代码、环境变量等都已经就绪了。

开发函数计算的正确姿势 —— 爬虫

在触发事件中,写入我们用来测试的 json,然后执行:

开发函数计算的正确姿势 —— 爬虫

可以发现,会获得与本地一致的效果:

开发函数计算的正确姿势 —— 爬虫

通过 fcli 验证

fcli 帮助文档 参考。

在终端执行以下命令,可以获取函数列表:

fcli function list --service-name localdemo

可以看到我们的 image-crawler 已经创建成功了。

{  "Functions": [    "image-crawler",    "java8",    "nodejs6",    "nodejs8",    "PHP72",    "python27",    "python3"  ],  "NextToken": null}

使用以下命令则可以调用函数运行:

fcli function invoke --service-name localdemo \    --function-name image-crawler \    --event-str '{"url": "https://image.baidu.com/search/index?tn=baiduimage&word=%E5%A3%81%E7%BA%B8"}'

运行成功后,会得到与控制台与 fun local 一致的结果。

小结

至此,我们的开发就算告一段落。

本文利用 fun local 提供的本地运行、调试的能力,做到了在本地开发函数,并且通过反复的执行函数得到反馈以便于快速迭代代码。

在本地开发完成后,不需要对代码进行任何修改,通过 fun deploy 命令,一键部署到云端,达到预期的效果。

本文介绍的方法,并不是开发函数计算的唯一方式。本文的目的,是能够向开发者传达一种信号——开发函数计算时,只要身姿正确,就会非常享受,开发流程也会十分顺畅。祝您使用愉快。

--结束END--

本文标题: 开发函数计算的正确姿势 —— 爬虫

本文链接: https://www.lsjlt.com/news/235958.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 开发函数计算的正确姿势 —— 爬虫
    在 《函数计算本地运行与调试 - Fun Local 基本用法》 中,我们介绍了利用 Fun Local 本地运行、调试函数的方法。但如果仅仅这样简单的介绍,并不能展现 Fun Local 对函数计算开发的巨大效率的提升。这一次,我们拿一个...
    99+
    2023-06-03
  • 开发函数计算的正确姿势——tensor
    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行...
    99+
    2023-01-31
    函数 姿势 正确
  • 开发函数计算的正确姿势 —— 安装第三
    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行...
    99+
    2023-01-31
    函数 姿势 正确
  • 开发函数计算的正确姿势 —— 使用 Fun Local 本地运行与调试
    前言首先介绍下在本文出现的几个比较重要的概念:函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码...
    99+
    2023-06-03
  • golang函数避免资源泄漏的正确姿势
    go 函数中避免资源泄漏的正确姿势:defer 语句:允许在函数退出前执行指定函数释放资源,即使因错误提前返回也是如此。闭包:创建一个函数在指定时间释放资源,延迟释放直到完成对资源的使用...
    99+
    2024-04-25
    golang 资源泄漏
  • Windows环境下PHP开发,解决PATH问题的正确姿势
    在Windows环境下进行PHP开发时,经常会遇到PATH问题。这个问题很常见,但是解决起来并不难。本文将会介绍Windows环境下PHP开发的正确姿势,包括如何解决PATH问题。 环境变量 在Windows环境下,环境变量是非常重要的...
    99+
    2023-07-22
    开发技术 windows path
  • Java中打包同步函数的正确姿势是什么?
    在Java中,同步函数可以让我们更好地控制多个线程对共享资源的访问,从而避免线程安全问题。但是,如果同步函数不正确地使用,就会导致性能下降或者死锁等问题。因此,在Java中打包同步函数的正确姿势是非常重要的。 一、synchronized...
    99+
    2023-09-29
    打包 同步 函数
  • Python开发者面向文档编程的正确姿势是什么
    这篇文章将为大家详细讲解有关Python开发者面向文档编程的正确姿势是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。概述秦人不暇自哀,而后人哀之;后人哀之而不鉴之,亦使后人而复哀后人也!...
    99+
    2023-06-17
  • C++ 函数异常与资源管理:释放内存的正确姿势
    在 c++++ 中,通过适当的异常处理和资源管理,可以安全有效地释放内存和管理资源:异常处理:try-catch 块用于捕获和处理异常,并释放获取的资源以防止内存泄漏。资源管理:std:...
    99+
    2024-05-03
    c++ 内存管理 异常处理
  • 2021 年发布Python软件包的正确姿势是怎样的
    这期内容当中小编将会给大家带来有关2021 年发布Python软件包的正确姿势是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。如果您像我一样,偶尔编写一个有用的python实用小程序,并希望与您的同...
    99+
    2023-06-15
  • 数据库压力测试的正确姿势:轻松应对突发流量
    数据库压力测试是评估数据库系统性能和容量的重要手段。通过模拟实际生产环境中的负载,压力测试可以帮助您发现数据库系统的瓶颈,并及时采取措施进行优化。压力测试还可以帮助您评估数据库系统是否能够满足业务需求,并为容量规划提供依据。 压力测试的...
    99+
    2024-02-04
    数据库压力测试 性能评估 容量规划 突发流量
  • 重定向操作的正确姿势:PHP异步编程开发技术解析?
    重定向操作的正确姿势:PHP异步编程开发技术解析 随着互联网应用的普及,Web开发技术也在不断地发展和演进。其中,重定向操作是Web开发中的一项基础技术,它可以实现网页之间的跳转、访问权限的控制等功能。PHP作为一门流行的Web开发语言,其...
    99+
    2023-06-20
    异步编程 重定向 开发技术
  • 网页设计的秘密武器:HTML嵌入样式,解锁美观布局的正确姿势
    HTML嵌入样式是什么? HTML嵌入样式(Inline Styling)是一种在HTML元素中使用style属性来设置元素样式的方法。它允许您直接在HTML中控制元素的外观,而无需使用外部样式表。 <p style="color...
    99+
    2024-02-08
    HTML CSS 嵌入样式 网页设计 布局 美观
  • 选择云计算数据库的正确方法是什么
    这篇文章将为大家详细讲解有关选择云计算数据库的正确方法是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。近年来,企业将本地部署的数据迁移云端越来越成为一种...
    99+
    2024-04-02
  • golang函数文档编写的正确打开方式
    golang 函数文档应包含函数签名、功能描述、输入参数、输出值和示例。编写函数文档的最佳实践包括使用 godoc 注释、保持简短简洁、提供具体示例、使用代码块和持续更新。 Golan...
    99+
    2024-04-28
    golang 函数文档
  • PHP扩展开发:如何通过单元测试确保自定义函数的正确性?
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-15
  • 计算机网络中避开网站反爬虫限制的方法有哪些
    小编给大家分享一下计算机网络中避开网站反爬虫限制的方法有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、使用动态ip代理。使用动态ip的强大之处在于,它可以在爬虫运行的同时在线获取动态ip。每次只获得一页,存储在几组...
    99+
    2023-06-15
  • PHP函数和JavaScript数据类型:如何在Web开发中选择正确的工具?
    Web开发需要掌握多种编程语言和技术,其中PHP和JavaScript是最常用的两个语言。PHP是一种服务器端语言,而JavaScript则是一种客户端语言。在Web开发中,经常需要使用PHP函数和JavaScript数据类型来完成各种任...
    99+
    2023-11-14
    函数 javascript 数据类型
  • 选择正确的云计算数据库服务的技巧有哪些
    这篇文章主要介绍“选择正确的云计算数据库服务的技巧有哪些”,在日常操作中,相信很多人在选择正确的云计算数据库服务的技巧有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”选择...
    99+
    2024-04-02
  • 函数编程在Go和Django中的应用:算法开发的新趋势?
    函数编程是一种程序设计范式,它将计算机程序视为数学函数的组合,从而避免了副作用和共享状态等问题。这种编程风格在近年来日益流行,不少编程语言也开始支持函数式编程。在本文中,我们将探讨函数式编程在Go和Django中的应用,以及如何利用函数式...
    99+
    2023-10-07
    django 函数 编程算法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作