利用阿里云函数计算做一些好玩的事情-案例实战

前言:

阿里云函数计算,也许大家会感到陌生,相对于阿里云极力宣传的ecs服务器,确实冷落了这一款神奇的产品!

那么什么是函数计算呢?老规矩,先看一下官方的解释:

阿里云函数计算(Function Compute)是一个事件驱动的全托管计算服务。通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传。函数计算会为您准备好计算资源,以弹性、可靠的方式运行您的代码。更棒的是,您只需要为代码实际运行消耗的资源付费 - 代码未运行则不产生费用。

#########

上面的解释不知道大家有没有看明白,我再用通俗易懂的话给大家翻译一遍:

比如你写了一个python脚本函数,或者写了一个php文件,又或者写了一个js函数,又或者是java 函数 等等

而你所有的需求,  只是为了去运行这个函数,其他的都是浪费,那么你会选择在服务器搭建环境然后去运行吗? 嘿  老兄,仅仅是一个函数而已,何必搞的这么麻烦,阿里云函数计算正是可以帮你解决的!

阿里云函数计算目前支持的运行环境有 python,nodejs,go,php,java 所有主流的环境都支持了,那么就可以愉快开通玩耍了!

开通函数计算   

大家更关心的是怎么收费,调用次数:每月前 100 万次函数调用免费。 执行时间:每月前 400000(GB*秒) 费用免费。, 小打小闹是用不完的,推送个url到百度站长平台,轻轻松松.

下面说一下函数计算的触发方式, 主要的亮点就是最新开放的 http触发方式。这种方式前端调用异常简单。给你一个函数计算url 你在浏览器访问, 即可触发,当然不只是浏览器!

其他的触发方式 比如对象存储,api网关,定时触发。再说一下,触发的意思就是启动你的函数!!!!!!!(我就当你是菜鸟了 ,言多必失,是不是觉得我很啰嗦!)

函数计算大致算是介绍完了,那么今天来看一个使用案例。


意淫的虚拟场景:

我有个小爬虫,而这个爬虫封装在了一个函数里面,我想把这个爬虫函数,封装成一个api接口,供其他程序调用!


实战:

首先开通函数计算。

点击新建服务:


其他默认,点击新建函数



选择模板,我喜欢用python2.7,那我就选择2.7的空白函数


下面就是选择触发器配置,今天要说的是想把自己的函数封装成一个api接口,那么就选择http触发方式:



下一步:基础管理设置 , 在这一步,需要注意的就是选择自己需要的运行环境,如下图


还有一点需要注意的是 环境配置里的函数入口, 这里的函数入口比如名字是   bugscaner.main     其中的bugscaner就是bugscaner.py 文件,main就是你的主函数,也就是入口函数(为什么这么做呢?管他呢  记住就行了)

函数执行内存, 这里只是简单的演示一个http请求,然后返回数据,那我就选择最小的128G内存,内存越小,免费的额度就越大!

好了,开始路怒吧!一路向北, 下一步  下一步还是他妈的下一步  中间的都可以跳过不选择了!创建!!!!!!

# -*- coding: utf-8 -*-

import logging
HELLO_WORLD = b"Hello world!\n"

# if you open the initializer feature, please implement the initializer function, as below:
# def initializer(context):
#    logger = logging.getLogger()  
#    logger.info("initializing")


def handler(environ, start_response):
    context = environ['fc.context']
    request_uri = environ['fc.request_uri']
    for k, v in environ.items():
      if k.startswith("HTTP_"):
        # process custom request headers
        pass
    # do something here
    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)
    return [HELLO_WORLD]
创建成功后你就会看到官方这个黑乎乎的窗口里的几行代码, 直接运行是会出错了,怪我了,上面为了装X,创建的函数入口是bugscaner.main


那么拷贝里面的代码到本地保存为bugscaner.py   记得把def handler 改成def main  

好了,把这个bugscaner.py文件压缩成zip格式,一定要是zip格式,zip,zip,zip!!!!!!!!


打开函数计算控制台, 上传这个zip代码包,好了  上传公共后, 控制台运行一下试试!


出现了hello world!那么开始把咱们的代码传上去试试吧!

我今天测试的代码比较复杂,  需要使用python beautifulsoup4  ,看看官方有没有内置这个库!在刚才的代码里最顶部插入

from bs4 import BeautifulSoup,element
试一试  在线编辑完,记得保存,代码才生效


 {
   "errorMessage": "Unable to import module 'bugscaner'",
   "errorType": "ImportError",
   "stackTrace": [
      "ImportError: No module named bs4"
   ]
} 
预料之中了,没有安装,怎么办呢?


很简单,自己上传BeautifulSoup库, 在你本地的bugscaner.py同目录下Shift+鼠标右键,选择 在此处打开命令串口(W),运行如下命令:

pip install bs4 --target .
C:\Users\Administrator\Desktop\教程测试>pip install bs4 --target .
Looking in indexes: https://mirrors.aliyun.com/pypi/simple/
Collecting bs4
Collecting beautifulsoup4 (from bs4)
  Downloading https://mirrors.aliyun.com/pypi/packages/f8/c7/741c97d7366f4779ca
3d244904978b43a81fd37d85fcf05ad19d472c1ce/beautifulsoup4-4.6.3-py2-none-any.whl
(90kB)
    45% |██████████████▌                 | 40kB 1.2MB/s eta 0:00
    56% |██████████████████              | 51kB 1.1MB/s eta 0
    67% |██████████████████████          | 61kB 1.1MB/s e
    79% |█████████████████████████▌      | 71kB 1.0MB
    90% |█████████████████████████████   | 81kB 1.
    100% |████████████████████████████████| 92k
 1.0MB/s
Installing collected packages: beautifulsoup4, bs4
Successfully installed beautifulsoup4-4.6.3 bs4-0.0.1


好了,beautifulsoup4已经安稳的躺在你的bugscaner.py同目录里了!按照刚才的方式,把文件一起压缩成zip格式, 重新上传一下,  再试试,看看能不能找到模块了!

运行成功,不再报错,那么我就凑合的写一个简陋的脚本,  来运行一下试试:


# -*- coding: utf-8 -*-
#by tools.bugscaner.com
import json
import requests
from bs4 import BeautifulSoup

def main(environ, start_response):
    context = environ['fc.context']
    request_uri = environ['fc.request_uri']
    for k, v in environ.items():
      if k.startswith("HTTP_"):
        # process custom request headers
        pass
    # do something here
    status = '200 OK'
    response_headers = [('Content-type', 'text/html')]
    start_response(status, response_headers)
    html= requests.get("https://aliyun.bugscaner.com/").text
    soup = BeautifulSoup(html, 'html.parser')
    #寻找页面中所有的超链接网址
    return json.dumps([a.get("href") for a in soup.find_all("a")])



BodyHeadersAbstractLogsstatus code: 200
 [
   "/",
   "https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=4uyvx8l4&utm_source=4uyvx8l4",
   "/url/ecs.html",
   "/url/huiyuanzhuanxiang.html",
   "/url/21.html",
   "#",
   "/index.html",
   "/aliyunyouhuihuodong/index.html",
   "/aliyundanxingjisuan/index.html",
   "/aliyundanxingjisuan/yunfuwuqiecs/index.html",
   "/aliyundanxingjisuan/aliyunxunizhuji/index.html",
   "/aliyunshujuku/index.html",
   "/aliyunshujuku/mysql/index.html",
   "/aliyunshujuku/hbaseban/index.html",
   "/aliyunshujuku/mongodbban/index.html",
   "/aliyunshujuku/redisban/index.html",
   "/aliyunshujuku/oceanbase/index.html",
   "/aliyunshujuku/polardb/index.html",
   "/aliyunshujuku/ppasban/index.html",
   "/aliyunshujuku/postgresqlban/index.html",
   "/aliyunshujuku/sqlserver/index.html",
   "/aliyunshujuku/memcacheban/index.html",
   "/aliyunyuncunchu/index.html",
   "/aliyunyuncunchu/duixiangcunchuoss/index.html",
   "/aliyunyuncunchu/wenjiancunchunas/index.html",
   "/shipinyucdn/index.html",
   "/shipinyucdn/cdnjiasu/index.html",
   "/hulianwangzhongjianjian/index.html",
   "/hulianwangzhongjianjian/xiaoxiduilie/index.html",
   "/hulianwangzhongjianjian/xiaoxifuwu/index.html",
   "/aliyunwendang/index.html",
   "https://promotion.aliyun.com/ntms/act/oss-discount.html?accounttraceid=f466617b-f482-49b8-93b1-eedd15b61529&userCode=4uyvx8l4",
   "/url/daijinquan.html",
   "/url/ecs.html",
   "/aliyunyouhuihuodong/3119.html",
   "/aliyunyouhuihuodong/3117.html",
   "/aliyunyouhuihuodong/3111.html",
   "/url/21.html",
   "/url/23.html",
   "/aliyunyouhuihuodong/index.html",
   "/aliyunyouhuihuodong/9813.html",
   "/aliyunyouhuihuodong/9812.html",
   "/aliyunyouhuihuodong/9810.html",
   "/aliyunyouhuihuodong/9808.html",
   "/aliyunyouhuihuodong/9779.html",
   "/aliyunyouhuihuodong/6577.html",
   "/aliyunyouhuihuodong/3119.html",
   "/aliyunyouhuihuodong/3118.html",
   "/aliyundanxingjisuan/yunfuwuqiecs/index.html",
   "/aliyundanxingjisuan/yunfuwuqiecs/9196.html",
   "/aliyundanxingjisuan/yunfuwuqiecs/9195.html",
   "/aliyundanxingjisuan/yunfuwuqiecs/9194.html",
   "/aliyundanxingjisuan/yunfuwuqiecs/9193.html",
   "/aliyundanxingjisuan/yunfuwuqiecs/9192.html",
   "/aliyundanxingjisuan/yunfuwuqiecs/9191.html",
   "/aliyundanxingjisuan/yunfuwuqiecs/9190.html",
   "/aliyundanxingjisuan/yunfuwuqiecs/9189.html",
   "/aliyundanxingjisuan/aliyunxunizhuji/index.html",
   "/aliyundanxingjisuan/aliyunxunizhuji/9776.html",
   "/aliyundanxingjisuan/aliyunxunizhuji/9775.html",
   "/aliyundanxingjisuan/aliyunxunizhuji/9774.html",
   "/aliyundanxingjisuan/aliyunxunizhuji/9773.html",
   "/aliyundanxingjisuan/aliyunxunizhuji/9772.html",
   "/aliyundanxingjisuan/aliyunxunizhuji/9771.html",
   "/aliyundanxingjisuan/aliyunxunizhuji/9770.html",
   "/aliyundanxingjisuan/aliyunxunizhuji/9769.html",
   "/aliyunwendang/index.html",
   "/aliyunwendang/9811.html",
   "/aliyunwendang/9809.html",
   "/aliyunwendang/9807.html",
   "/aliyunwendang/9806.html",
   "/hulianwangzhongjianjian/index.html",
   "/hulianwangzhongjianjian/xiaoxiduilie/3970.html",
   "/hulianwangzhongjianjian/xiaoxifuwu/3107.html",
   "/hulianwangzhongjianjian/xiaoxiduilie/236.html",
   "/aliyunshujuku/index.html",
   "/aliyunshujuku/mysql/10130.html",
   "/aliyunshujuku/mysql/10129.html",
   "/aliyunshujuku/mysql/10128.html",
   "/aliyunshujuku/mysql/10127.html",
   "/aliyunshujuku/mysql/10126.html",
   "/aliyunshujuku/mysql/10125.html",
   "/shipinyucdn/index.html",
   "/shipinyucdn/cdnjiasu/3112.html",
   "/shipinyucdn/cdnjiasu/282.html",
   "/shipinyucdn/cdnjiasu/283.html",
   "/aliyunyuncunchu/index.html",
   "/aliyunyuncunchu/duixiangcunchuoss/328.html",
   "/aliyunyuncunchu/duixiangcunchuoss/327.html",
   "/aliyunyuncunchu/duixiangcunchuoss/326.html",
   "/aliyunyuncunchu/duixiangcunchuoss/325.html",
   "/aliyunyuncunchu/duixiangcunchuoss/324.html",
   "/aliyunyuncunchu/duixiangcunchuoss/322.html",
   "http://whatweb.bugscaner.com",
   "http://whois.bugscaner.com",
   "http://tools.bugscaner.com",
   "http://www.bugscaner.com",
   "http://aliyun.bugscaner.com",
   "/tags.html",
   "/tags.html",
   "/sitemap.xml"
] 
ok,  代码正常运行啦!  不对,一开始说好的http触发呢?好了, 最后一哆嗦,来看下怎么触发。




复制这个网址到浏览器,  访问一下快看看吧! 




上一篇:dictionary update sequence element #0 has length 1; 2 is required解决方案
下一篇:django异常解决办法