当前位置: 首页 > news >正文

如何使用 AWS Lambda 运行 selenium

借助 AWS Lambda 运行 selenium 来爬取网络数据。

简介

与手动从网站收集数据相比,爬虫可以为我们节省很多时间,对于爬虫的每次请求而言,这相当于 AWS Lambda 的每次函数的运行。

AWS Lambda 是一种将脚本部署到云的简单且价格低廉的服务,如果我们要实现在 AWS Lambda 上运行 selenium 实现数据的爬取,我们需要解决如何在 AWS Lambda 函数中安装 Chrome 浏览器?

同时,AWS Lambda 的主要限制是超时限制,即 15 分钟,部署包不能超过 250 MB(但使用容器最多可接受10 GB)。因此使用容器化的部署方式便成了不二之选。

相对于我们单独运行一个 Selenium Grid 来进行 Chrome 远程调用,使用 Lambda 的方式运行有以下好处。

  • 无需担心 Chrome 在负载高的情况下崩溃,因此每次 Lambda 的执行都会启动一个新的实例。
  • 更容易进行大量的并发执行。
  • 无需担心服务崩溃。

程序部署

本文重点在于如何使用 Docker 部署 Selenium 到 AWS Lambda,因此在看之前可以阅读在 AWS lambda 上部署 docker 应用。

创建项目结构

创建如下的项目结构,app.py 是 Lambda 程序的主要入口,我们通过 Dockerfile 来构建一个集成了 Selenium,Chrome 的运行环境。

docker-selenium-test- app.py- Dockerfile- requirements.txt- README.md

Dockerfile 配置

这也是核心的配置。

FROM public.ecr.aws/lambda/python:3.8 as build
# 下载 Linux 版本的 Chrome 和对应的驱动文件
RUN yum install -y unzip && \curl -Lo "/tmp/chromedriver.zip" "https://chromedriver.storage.googleapis.com/107.0.5304.62/chromedriver_linux64.zip" && \curl -Lo "/tmp/chrome-linux.zip" "https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Linux_x64%2F1047731%2Fchrome-linux.zip?alt=media" && \unzip /tmp/chromedriver.zip -d /opt/ && \unzip /tmp/chrome-linux.zip -d /opt/FROM public.ecr.aws/lambda/python:3.8# 安装 Chrome 运行需要的依赖
RUN yum install atk cups-libs gtk3 libXcomposite alsa-lib \libXcursor libXdamage libXext libXi libXrandr libXScrnSaver \libXtst pango at-spi2-atk libXt xorg-x11-server-Xvfb \xorg-x11-xauth dbus-glib dbus-glib-devel -y# 将 pre-build 阶段构建的 Chrome 和对应的驱动文件复制到运行环境
COPY --from=build /opt/chrome-linux /opt/chrome
COPY --from=build /opt/chromedriver /opt/# 运行代码配置
COPY . ${LAMBDA_TASK_ROOT}
WORKDIR ${LAMBDA_TASK_ROOT}
RUN pip install -r requirements.txtCMD [ "app.handler" ]

app.py 代码实现

这一步主要是程序测试代码的实现。

import sys
from tempfile import mkdtemp
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.service import ServiceCHROMIUM_PATH = '/opt/chrome/chrome'
CHROMEDRIVER_PATH = '/opt/chromedriver'def handler(event, context):print(event)# print(context)print('Hello from AWS Lambda using Python' + sys.version + '!')options = webdriver.ChromeOptions()options.binary_location = CHROMIUM_PATHoptions.add_argument("--headless")  # Hide the GUIoptions.add_argument("--no-sandbox")  # No protection neededoptions.add_argument("--window-size=1280x1696")  # Setup a fixed screens sizeoptions.add_argument("--single-process")  # Lambda only give us only one CPUoptions.add_argument("--no-zygote")  # Don't create zygote processes because Lambda give us only one CPUoptions.add_argument("--disable-dev-shm-usage")  # Create temporary folder for shared memory filesoptions.add_argument("--disable-dev-tools")  # Disable Chrome dev toolsoptions.add_argument(f"--user-data-dir={mkdtemp()}")  # Create temporary folder to user dataoptions.add_argument(f"--data-path={mkdtemp()}")  # Create temporary folder to browser dataoptions.add_argument(f"--disk-cache-dir={mkdtemp()}")  # Create temporary folder to cacheservice = Service(CHROMEDRIVER_PATH)driver = webdriver.Chrome(service=service, options=options)# 开始 ----------driver.get("https://example.com")header = driver.find_element(By.CSS_SELECTOR, "h1")text = header.textdriver.close()driver.quit()response = {"statusCode": 200,"body": f"the header content is {text}",}print(response)return {}

在打包好 Docker 镜像之后,推荐使用 AWS ECR 进行镜像存储和管理。具体也可参考文章在 AWS lambda 上部署 docker 应用。

进一步实现文件下载

除了获取网页内容之外,我们同时也可以通过 Chrome 进行文件的下载。Selenium 驱动 Chrome 进行文件下载重要的是指定下载文件的路径。

通常指定的方式比较简单如下:

options.add_experimental_option('prefs', {"download.default_directory": tmp_dir,  # Change default directory for downloads"download.prompt_for_download": False,  # To auto download the file"download.directory_upgrade": True,"plugins.always_open_pdf_externally": True  # It will not show PDF directly in chrome
})

但在无头浏览器模式下这是行不通的,我们需要下面的配置方式:

# 先得到 driver
# Headless 模式下要这种设置才能指定下载路径
driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
params = {'cmd': 'Page.setDownloadBehavior', 'params': {'behavior': 'allow', 'downloadPath': tmp_dir}}
driver.execute("send_command", params)

这样就可以实现文件下载了。

总结

这是 AWS Lambda 和 Selenium 使用的一个非常具体的例子,但我希望它能说明这些技术的潜力。不仅仅是数据的获取,同时我们也可以借助这项技术来进行端到端的测试,或通过构建 API Gateway 的方式进行同步的方法调用等。

参考文档

[1] How To Use Selenium To Web-Scrape on AWS Lambda https://cheesecakelabs.com/blog/selenium-scraper-aws-lambda/
[2] lambda/python https://gallery.ecr.aws/lambda/python
[3] Python – Selenium Download a File in Headless Mode https://www.onlinetutorialspoint.com/selenium/python-selenium-download-a-file-in-headless-mode.html
[4] Selenium give file name when downloading https://stackoverflow.com/questions/34548041/selenium-give-file-name-when-downloading

相关文章:

如何使用 AWS Lambda 运行 selenium

借助 AWS Lambda 运行 selenium 来爬取网络数据。 简介 与手动从网站收集数据相比,爬虫可以为我们节省很多时间,对于爬虫的每次请求而言,这相当于 AWS Lambda 的每次函数的运行。 AWS Lambda 是一种将脚本部署到云的简单且价格低廉的服务&…...

认识Cesium旋转大小变量

前文代码中有如下;矩阵乘以旋转大小,还放入mat; Cesium.Matrix4.multiply(mat, rotationX, mat); 初看以为rotationX是一个数值,因为矩阵可以和数相乘; 但是看它的代码,rotationX是由一长串代码获得的&a…...

异响加持、吐槽声不断,小鹏G9难解困局

小鹏汽车的烦恼就好比红尘中的三千青丝,小鹏G9“惊魂48小时”的恐慌还未平息,车门异响等问题就已经层出不穷,再次将小鹏汽车推上风口浪尖。 可以毫不客气的说,G9承载着小鹏汽车盈利的希望,但在原本处于上升之势的G9却…...

【react】react18的学习

一、安装 $ create-react-app [Project name]默认支持sass 二、核心依赖 react:react 核心 react-dom:用于开发渲染web 应用; react-scripts:封装webpack服务; "start": "react-scripts start&quo…...

Ep_操作系统面试题-什么是线程,线程和进程的区别

1. 一个进程中可以有多个线程,多个线程共享进程的堆和方法区 (JDK1.8 之后的元空间),但是每个线程有自己的程序计数器、虚拟机栈和 本地方法栈。 2.进程是资源分配的最小单位,线程是CPU调度的最小单位 视频讲解: https://edu.csdn.net/course/detail/38090 点我…...

最流行的自动化测试工具,总有一款适合你(附部分教程)

前言 在自动化测试领域,自动化工具的核心地位毋庸置疑。本文总结了最顶尖的自动化测试工具和框架,这些工具和框架可以帮助组织更好地定位自己,跟上软件测试的趋势。这份清单包含了开源和商业的自动化测试解决方案。 1)Selenium …...

Shell高级——进程替换vs管道

以下内容源于C语言中文网的学习与整理,如有侵权请告知删除。 1、问题引入 这里将Shell中的“进程替换”与“管道”放在一起讲,是因为两者的作用几乎类似。 进程替换:将一个命令的输出结果传递给另一个(组)命令。 管…...

国内有哪些支持定制化的低代码平台?

编者按:贴合企业业务需求的系统才是好系统,高程度的定制能力平台意味着可以提供更高契合度的产品,更好地匹配业务需求。本文介绍了国内支持定制化的老厂商低代码平台,具有源码交付、私有化部署、国产化、数据对接等优势。关键词&a…...

Altair 宣布将于3月举办 Future.Industry 2023 全球虚拟大会

Altair(纳斯达克股票代码:ALTR)近日宣布将于 2023 年 3 月 8 - 9 日 举办年度全球虚拟大会 Future.Industry 2023。旨在探索影响全球未来的新趋势,并深入探讨仿真、高性能计算 (HPC)、人工智能(AI)和数据分…...

react lazyLoad学习记录

react lazyLoad学习记录1.lazyLoad用处2.使用2.1 react-router-dom5版本写法2.2 react-router-dom6版本写法1.lazyLoad用处 默认例如首页,如果有好十几个甚至百个路由,react是会默认一下全部把路由组件一下全部加载的,极可能造成页面卡顿。r…...

29 openEuler管理网络-配置网络绑定

文章目录29 openEuler管理网络-配置网络绑定29.1 使用nmcli29.2 使用命令行29.2.1 检查是否已安装Bonding内核模块29.2.2 创建频道绑定接口29.2.3 创建从属接口29.2.4 激活频道绑定29.2.5 创建多个绑定29 openEuler管理网络-配置网络绑定 29.1 使用nmcli 创建名为bond0的绑定&…...

RTT 全志D1s RDC2022纪念版开发板开箱使用分享与折腾记录

原文链接:https://bbs.aw-ol.com/topic/3021/ 作者caoxuetian 1:开发板介绍 RTT D1s RDC2022纪念版开发板是一块基于全志科技RISC-V内核 芯片 D1S的小尺寸开发板,尺寸仅为5.5cm*4cm,能够已非常小的体积带来舒适的开发感受&#…...

24日常实习万得一面面径

文章目录分析与复盘面试题分析与复盘 应该将项目进行复习好的,两个项目都应该对简历写的那些进行复习,以为日常不问项目的一面。哭死… 面试题 1.自我介绍 2.为什么从土木转到开发,学习java有哪些途径 3.介绍下项目中你觉得最有设计的模…...

MySQL的DML和DDL操作(1)

这里介绍几种DML操作INSERT INTO——插入记录插入一条记录插入一条记录 INSERT INTO table [(column [, column . ])] VALUES(value [,value . ]); 例子: insert into student values( 1,"承太郎" )default charset utf8;插入多条记录插入多条…...

Kafka系列之:Kafka生产者和消费者

Kafka系列之:Kafka生产者和消费者 一、Kafka生产者发送流程二、提高生产者吞吐量三、Kafka消费方式四、Kafka消费者总体工作流程五、按照时间消费Kafka Topic一、Kafka生产者发送流程 batch.size:只有数据积累到batch.size之后,sender才会发送数据,默认16K。linger.ms:如果…...

Linux进程间通信:信号量(一)

前提知识 在介绍信号量之前,先来看看一些概念和一些简单的前提知识: 进程间通信的前提是让不同的进程看到同一份资源。于是,就有提出让这种资源成为一种公共资源的方法,方法的提出,导致了一种新的问题的出现&#xf…...

Python笔记一之excel的读取

这里我常用的 python 对于 excel 的读取库有两个,一个是 xlsxwriter 用于操作 excel 的写入,一个是 xlrd 用于 excel 文件的读取。 使用的库的版本如下: xlsx1.2.6xlrd1.1.0 xlsxwriter 写入 excel 新建一个 excel import xlsxwriterpat…...

JavaScript Number 数字对象

文章目录JavaScript Number 数字对象JavaScript 数字所有 JavaScript 数字均为 64 位精度八进制和十六进制无穷大(Infinity)NaN - 非数字值数字可以是数字或者对象数字属性数字方法JavaScript Number 数字对象 JavaScript 只有一种数字类型。 可以使用也…...

设计模式-服务定位器模式

设计模式-服务定位器模式一、背景1.1 服务定位模式1.2 策略模式二、代码实战2.1 服务定位器2.2 配置ServiceLocatorFactoryBean2.3 定义一个支付的接口2.4 根据不同类型处理Bean2.5 controller层三、项目结构及测试结果3.1 测试结果3.2 项目结构及源码(欢迎star)四、参考资料一…...

Android Dalvik虚拟机 GC流程分析

前言 本篇继续介绍安卓dalvik虚拟机,介绍Dalvik虚拟技的GC流程。 GC结构体 dalvik/vm/alloc/Heap.h static const GcSpec kGcForMallocSpec {true, /* isPartial */false, /* isConcurrent */true, /* doPreserve */"GC_FOR_ALLOC" }; /* Not eno…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...