封装chrome镜像

news2024/7/6 17:58:55

chrome镜像

selenium提供了一个镜像,但这个镜像里面包含了比较多的东西:

镜像地址-github

  1. supervisord

  2. java

  3. chrome

  4. webDriver

实际的使用中遇到了一些问题

  1. chrome遇到一些比较耗费内存和cup的操作的时候,有的时候会kill掉java进程,但supervisord不会自动拉起java进程。从ps看的话,webdriver和chrome就是孤儿进程了。
  2. 在某些情况下,webdriver退出不彻底,再次启动webdriver会在启动浏览器,此时,就会有两个浏览器。

当然加大内存是最简单的处理方式,但为了可控,随即自己封装chrome,将chrome和自己的业务代码封装在一起,要是发生上面的情况,可以调用命令行来做操作。

提供两种镜像

  1. 基于Ubuntu
  2. 基于Debian

大体流程如下

  1. 下载对应平台的安装包(手动下载到本地在安装,或者直接用apt-get 去搜索下载)。
  2. 下载对应版本的webDriver。
  3. apt-get 安装字体。
  4. 安装python,pip,用pip安装selenium库(这一点可以按照自己所熟悉的来,python我提供了代码,java也可以自己来安装jdk的环境,将自己的代码写成jar包,java jar运行,或者可以安装jdk17,命令行交互来操作)

基于Ubuntu

下载对应平台的安装包

  1. 手动下载安装

    需要下载两个东西

    • chromium-codecs-ffmpeg-extra 90.0.4430.72-0ubuntu0.16.04.1 (amd64 binary) in ubuntu xenial

      • 访问页面

        https://launchpad.net/ubuntu/xenial/amd64/chromium-codecs-ffmpeg-extra/90.0.4430.72-0ubuntu0.16.04.1

      • 下载链接

        http://launchpadlibrarian.net/534151129/chromium-codecs-ffmpeg-extra_90.0.4430.72-0ubuntu0.16.04.1_amd64.deb

在这里插入图片描述

  • chromium-browser 90.0.4430.72-0ubuntu0.16.04.1

    • 访问页面

      https://www.ubuntuupdates.org/package_metas?cx=005406051221663887916%3Aaw7ejs-ceqo&cof=FORID%3A11&ie=UTF-8&q=google-chrome-stable&commit=Package+Search
      在这里插入图片描述

    • 下载链接

      https://www.ubuntuupdates.org/package/core/xenial/universe/updates/chromium-browser

  1. apt-get在线下载安装

    这个安装方式基于Debian也是可以的,在Debian里面就不写了。

    这里的安装方式来源于selenium提供的Dockfile

    https://github.com/SeleniumHQ/docker-selenium/blob/trunk/NodeChrome/Dockerfile

    ARG CHROME_VERSION="google-chrome-stable"
    RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
      && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list \
      && apt-get update -qqy \
      && apt-get -qqy install \
        ${CHROME_VERSION:-google-chrome-stable} \
      && rm /etc/apt/sources.list.d/google-chrome.list \
      && rm -rf /var/lib/apt/lists/* /var/cache/apt/*
      
    #============================================
    # Chrome webdriver
    #============================================
    # can specify versions by CHROME_DRIVER_VERSION
    # Latest released version will be used by default
    #============================================
    ARG CHROME_DRIVER_VERSION
    RUN if [ -z "$CHROME_DRIVER_VERSION" ]; \
      then CHROME_MAJOR_VERSION=$(google-chrome --version | sed -E "s/.* ([0-9]+)(\.[0-9]+){3}.*/\1/") \
        && NO_SUCH_KEY=$(curl -ls https://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROME_MAJOR_VERSION} | head -n 1 | grep -oe NoSuchKey) ; \
        if [ -n "$NO_SUCH_KEY" ]; then \
          echo "No Chromedriver for version $CHROME_MAJOR_VERSION. Use previous major version instead" \
          && CHROME_MAJOR_VERSION=$(expr $CHROME_MAJOR_VERSION - 1); \
        fi ; \
        CHROME_DRIVER_VERSION=$(wget --no-verbose -O - "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROME_MAJOR_VERSION}"); \
      fi \
      && echo "Using chromedriver version: "$CHROME_DRIVER_VERSION \
      && wget --no-verbose -O /tmp/chromedriver_linux64.zip https://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip \
      && rm -rf /opt/selenium/chromedriver \
      && unzip /tmp/chromedriver_linux64.zip -d /opt/selenium \
      && rm /tmp/chromedriver_linux64.zip \
      && mv /opt/selenium/chromedriver /opt/selenium/chromedriver-$CHROME_DRIVER_VERSION \
      && chmod 755 /opt/selenium/chromedriver-$CHROME_DRIVER_VERSION \
      && sudo ln -fs /opt/selenium/chromedriver-$CHROME_DRIVER_VERSION /usr/bin/chromedriver
    

安装字体

#================
# Font libraries
#================
# libfontconfig            ~1 MB
# libfreetype6             ~1 MB
# xfonts-cyrillic          ~2 MB
# xfonts-scalable          ~2 MB
# fonts-liberation         ~3 MB
# fonts-ipafont-gothic     ~13 MB
# fonts-wqy-zenhei         ~17 MB
# fonts-tlwg-loma-otf      ~300 KB
# ttf-ubuntu-font-family   ~5 MB
#   Ubuntu Font Family, sans-serif typeface hinted for clarity 在Debian里面也可以用
# Removed packages:
# xfonts-100dpi            ~6 MB
# xfonts-75dpi             ~6 MB
# fonts-noto-color-emoji   ~10 MB
# Regarding fonts-liberation see:
#  https://github.com/SeleniumHQ/docker-selenium/issues/383#issuecomment-278367069
# Layer size: small: 50.3 MB (with --no-install-recommends)
# Layer size: small: 50.3 MB
RUN apt-get -qqy update \
  && apt-get -qqy --no-install-recommends install \
    libfontconfig \
    libfreetype6 \
    xfonts-cyrillic \
    xfonts-scalable \
    fonts-liberation \
    fonts-ipafont-gothic \
    fonts-wqy-zenhei \
    fonts-tlwg-loma-otf \
    ttf-ubuntu-font-family \
    fonts-noto-color-emoji \
  && rm -rf /var/lib/apt/lists/* \
  && apt-get -qyy clean

下载webdriver

下载对应版本的webDriver,这里下载90版本的

http://chromedriver.storage.googleapis.com/index.html

Dockfile

前期准备工作已经就绪,需要注意,我这里用的是本地先下载好安装包,本地安装的方式,如果是在线安装,就把本地安装的代替掉

FROM ubuntu:18.04

RUN mkdir /google

#==============================
# copy chrome and driver
#==============================
COPY chromium-browser_90.0.4430.72-0ubuntu0.16.04.1_amd64.deb \
    chromedriver \
	chromium-codecs-ffmpeg-extra_90.0.4430.72-0ubuntu0.16.04.1_amd64.deb \
    /google/

#==============================
# Locale and encoding settings,install fonts and chrome,python3.6 pip3
#==============================
ENV LANG_WHICH en
ENV LANG_WHERE US
ENV ENCODING UTF-8
ENV LANGUAGE ${LANG_WHICH}_${LANG_WHERE}.${ENCODING}
ENV LANG ${LANGUAGE}
# Layer size: small: ~9 MB
# Layer size: small: ~9 MB MB (with --no-install-recommends)
RUN apt-get -y update \
  && apt-get -y --no-install-recommends install \
    language-pack-en \
    tzdata \
    locales \
  && locale-gen ${LANGUAGE} \
  && dpkg-reconfigure --frontend noninteractive locales \
  && apt-get -y autoremove \
  && apt-get -y --no-install-recommends install \
    libfontconfig \
    libfreetype6 \
    xfonts-cyrillic \
    xfonts-scalable \
    fonts-liberation \
    fonts-ipafont-gothic \
    fonts-wqy-zenhei \
    fonts-tlwg-loma-otf \
    ttf-ubuntu-font-family \
    fonts-noto-color-emoji \
    python3.6  python3-pip \
  && apt-get install -y --no-install-recommends  \
      /google/chromium-codecs-ffmpeg-extra_90.0.4430.72-0ubuntu0.16.04.1_amd64.deb  \
     /google/chromium-browser_90.0.4430.72-0ubuntu0.16.04.1_amd64.deb \
  && rm -rf /var/lib/apt/lists/* \
  && apt-get -qyy clean

#==============================
# pip3 install selenium
#==============================
RUN pip3 install selenium

目录结构

在这里插入图片描述

构建命令

在当前目录下面运行build命令

docker build . -t test/chrome:90

进入容器查看

在这里插入图片描述

基于Debian

和上面相比,主要是安装包不一样,别的都一样, chrome也得下载对应的版本

这里安装的chrome的版本是108的

下载对应平台的安装包

需要安装两个东西

  1. chromium(108.0.5359.94-1~deb11u1)

    • 访问页面

      https://packages.debian.org/bullseye/chromium

    • 下载链接

      https://packages.debian.org/bullseye/amd64/chromium/download

  2. chromium-common(108.0.5359.94-1~deb11u1)

    • 访问页面

      https://packages.debian.org/bullseye/chromium-common

    • 下载链接

      https://packages.debian.org/bullseye/amd64/chromium-common/download

要注意,webdriver也需要下载108的

Dockerfile

FROM ubuntu:18.04

RUN mkdir /google

#==============================
# copy chrome and driver
#==============================
COPY chromium-common_108.0.5359.94-1~deb11u1_amd64.deb \
    chromedriver \
	chrome/chromium_108.0.5359.94-1~deb11u1_amd64.deb \
    /google/

#==============================
# Locale and encoding settings,install fonts and chrome,python3.6 pip3
#==============================
ENV LANG_WHICH en
ENV LANG_WHERE US
ENV ENCODING UTF-8
ENV LANGUAGE ${LANG_WHICH}_${LANG_WHERE}.${ENCODING}
ENV LANG ${LANGUAGE}
# Layer size: small: ~9 MB
# Layer size: small: ~9 MB MB (with --no-install-recommends)
RUN apt-get -y update \
  && apt-get -y --no-install-recommends install \
    language-pack-en \
    tzdata \
    locales \
  && locale-gen ${LANGUAGE} \
  && dpkg-reconfigure --frontend noninteractive locales \
  && apt-get -y autoremove \
  && apt-get -y --no-install-recommends install \
    libfontconfig \
    libfreetype6 \
    xfonts-cyrillic \
    xfonts-scalable \
    fonts-liberation \
    fonts-ipafont-gothic \
    fonts-wqy-zenhei \
    fonts-tlwg-loma-otf \
    ttf-ubuntu-font-family \
    fonts-noto-color-emoji \
    python3.6  python3-pip \
  && apt-get install -y --no-install-recommends  \
      /google/chromium-common_108.0.5359.94-1~deb11u1_amd64.deb  \
     /google/chrome/chromium_108.0.5359.94-1~deb11u1_amd64.deb \
  && rm -rf /var/lib/apt/lists/* \
  && apt-get -qyy clean

#==============================
# pip3 install selenium
#==============================
RUN pip3 install selenium

ps:需要注意,我这里在安装成功之后并没有删除deb包,可以在上面结束之后删除掉。

Python 代码

这里是将网页导出PDF

import base64
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.ui import WebDriverWait
import time

option = webdriver.ChromeOptions()
option.add_argument("--headless")
option.add_argument("--no-sandbox")
driver = webdriver.Chrome(executable_path="/usr/src/app/chromedriver", port = 5055,options=option)
# 绑定命令
driver.command_executor._commands["SendCommand"] = ("POST","/session/$sessionId/chromium/send_command")
driver.command_executor._commands["executeCdpCommand"] = ("POST","/session/$sessionId/goog/cdp/execute")

driver.get("https://www.baidu.com/")
time.sleep(10)
driver.set_page_load_timeout(300) # set page load time out for wait pdf render
param = {"paperWidth": 8.27,"paperHeight": 11.69,"printBackground": True}
page_res = driver.execute("executeCdpCommand", {"cmd": "Page.printToPDF", "params": param})["value"]
img_byte_arr = base64.b64decode(page_res["data"])

with open("/test1.pdf","wb") as f:
    f.write(img_byte_arr)

这里保存在容器里面,需要通过cp命令从容器copy出来才可以查看
在这里插入图片描述相关的可以看

https://stackoverflow.com/questions/49614217/selenium-clear-chrome-cache

https://chromedevtools.github.io/devtools-protocol/tot/Storage/
https://peter.sh/experiments/chromium-command-line-switches/#hide-scrollbars
https://stackoverflow.com/questions/53902507/unknown-error-session-deleted-because-of-page-crash-from-unknown-error-cannot

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

干货 | 大数据交易所数据安全流通体系标准化尝试

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。第一部分:国内大数据交易所发展现状第二部分:国外大数据交易模式及法律法规欧盟的数据交易模式是基于2022年5月16日所提出的《数据治理法案》,其中提出了数据中…

【C++11】—— 包装器

目录 一、function包装器 1. function包装器基本介绍 2. function包装器统一类型 3. function包装器的使用场景 二、bind包装器 一、function包装器 1. function包装器基本介绍 function包装器 也叫作适配器。C中的function本质是一个类模板,也是一个包装器…

第四章 基本数据

在第2章中,我们讨论了多种导入数据到R中的方法。遗憾的是,将你的数据表示为矩阵或数据框这样的矩形形式仅仅是数据准备的第一步。这里可以演绎Kirk船长在《星际迷航》“末日决战的滋味”一集中的台词(这完全验明了我的极客基因)&a…

聚观早报|春节档新片预售总票房破千万;苹果获可折叠iPhone新专利

今日要闻:比亚迪据称拟在越南建汽车零部件厂;2023 年春节档新片预售总票房破 7000 万;苹果获得可折叠 iPhone 新专利;北京汽车获1000台EU5 PLUS约旦订单;娃哈哈要解决100万农户农产品出路 比亚迪据称拟在越南建汽车零部…

C 语言目标文件

前言 一个 C 语言程序经编译器和汇编器生成可重定位目标文件,再经链接器生成可执行目标文件。那么目标文件中存放的是什么?我们的源代码在经编译以后又是怎么存储的? 文章为 《深入理解计算机系统》的读书笔记,更为详细的内容可…

【数据结构】双向链表

1.双向链表的结构2.双向链表的实现首先在VS里面的源文件建立test.c和List.c,在头文件里面建立List.hList.h:#pragma once #include <stdio.h> #include <stdlib.h> #include <assert.h> typedef int LTDateType; typedef struct ListNode {LTDateType data;s…

LeetCode 329. 矩阵中的最长递增路径(C++)*

思路&#xff1a; 1.用动态规划&#xff0c;但是时间复杂度太高&#xff0c;效率太低 2.使用常规的DFS&#xff0c;时间复杂度高&#xff0c;包含了太多重复无效遍历&#xff0c;会超时 3.在DFS的基础上使用记忆化搜索&#xff0c;帮助消去重复的遍历&#xff0c;提高效率 原题…

解决: 您目前无法访问 因为此网站使用了 HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常

目录 问题描述 报错信息 问题原因 如何解决 参考资料 问题描述 您目前无法访问 因为此网站使用了 HSTS。网络错误和攻击通常是暂时的&#xff0c;因此&#xff0c;此网页稍后可能会恢复正常。 报错信息 今天使用Edge浏览器在访问一个平时常用的emoji网站时&#xff0c;…

springboot整合spring-security

在web开发中&#xff0c;安全性问题比较重要&#xff0c;一般会使用过滤器或者拦截器的方式对权限等进行验证过滤。此博客根据b站up主&#xff0c;使用demo示例进行展示spring-security的一些功能作用。 目 录 1、创建项目 2、编写controller 3、添加spring-security依赖 …

Spring Cloud OpenFeign 配置

最少的配置&#xff08;使用默认配置&#xff09; 最少/默认配置示例如下&#xff08;使用Nacos作为服务的注册与发现中心&#xff09;&#xff1a; application.properties server.port8082 spring.application.namenacos-consumer spring.cloud.nacos.discovery.server-ad…

[拆轮子] PaddleDetection中__shared__、__inject__ 和 from_config 三者分别做了什么

在上一篇中&#xff0c;PaddleDetection Register装饰器到底做了什么 https://blog.csdn.net/HaoZiHuang/article/details/128668393 已经介绍了 __shared__ 和 __inject__ 的作用: __inject__ 表示引入全局字典中已经封装好的模块。如loss等。__shared__为了实现一些参数的配…

excel函数技巧:函数TEXT七助数据大变身

如果函数有职业&#xff0c;那各函数的职业会是什么呢&#xff1f;别的先不说&#xff0c;就拿TEXT而言&#xff0c;它可以让日期变数字、数字变日期、阿拉伯数字变大写中文数字、金额元变万元&#xff0c;连IF的条件判断它也可以变出来…这简直就是当之无愧的变装女皇啊&#…

从0到1完成一个Node后端(express)项目(三、写接口、发起请求)

往期 从0到1完成一个Node后端&#xff08;express&#xff09;项目&#xff08;一、初始化项目、安装nodemon&#xff09; 从0到1完成一个Node后端&#xff08;express&#xff09;项目&#xff08;二、下载数据库、navicat、express连接数据库&#xff09; 写接口 我们看ex…

关于Linux部署Tomcat的访问问题

文章目录1.问题2.排除问题2.1检查Tomcat是否启动2.2检查防火墙&端口3.其他可能的问题3.1java的配置问题3.2可能出现了端口占用问题1.问题 在CentOS7系统的主机中配置好了Tomcat后发现通过默认端口无法访问到&#xff08;http://xx:xx:xx:xx:8080&#xff09; 2.排除问题 …

C语言在杨氏矩阵中找一个数

这道题大家都会做&#xff0c;使用暴力算法遍历整个数组。但是题目要求时间复杂度小于O&#xff08;n&#xff09;&#xff0c;这样做显然不合题意&#xff0c;所以&#xff0c;通过分析杨氏矩阵的特点&#xff0c;我们发现矩阵右上角的那个数为一行中最大的&#xff0c;一列中…

SAP MM 新建移动类型(Movement Type)

一、概念 物料的移动类型&#xff08;Movement Type&#xff09;代表了货物的移动&#xff0c;当一个物料做某种移动时&#xff0c;便开始了如下一系列事件&#xff1a; 1、一个物料凭证会被创建&#xff0c;可以被用来作为移动的证明及作为其它任何相关应用的一个信息来源&am…

Jetson nano 入手系列之6—使用qt creator 开发c++ opencv+CSI摄像头人脸检测

Jetson nano 入手系列之6—使用qt creator 开发c opencvCSI摄像头人脸检测1.创建摄像头人脸检测项目1.1 创建并配置项目1.2 编辑文件1.2.1 main.cpp1.2.2 CMakeLists.txt2.构建及编译2.1 直接使用qt creator完成2.2 使用命令行参考文献本系列针对亚博科技jetson nano开发板。 …

一篇文章带你学会MySQL数据库的基本管理

目录 前言 一、数据库的介绍 二、mariadb的安装 三、数据库的开启及安全初始化 四、数据库的基本管理 五、数据库密码更改及破解 六、用户授权 七、数据库的备份 八、phpmyadmin的安装 总结 前言 什么是数据库&#xff1f; 每个人家里都会有衣柜&#xff0c;衣柜是…

前端效果积累 | 酷炫、实用3D地球路径飞行效果实现

&#x1f4cc;个人主页&#xff1a;个人主页 ​&#x1f9c0; 推荐专栏&#xff1a;前端开发成神之路 --【这是一个为想要入门和进阶前端开发专门开启的精品专栏&#xff01;从个人到商业的全套开发教程&#xff0c;实打实的干货分享&#xff0c;确定不来看看&#xff1f; &…

【C语言进阶】自定义类型之结构体

目录一&#xff1a;结构体1.1&#xff1a;结构的基础知识&#xff1a; 1.2&#xff1a;结构的声明&#xff1a; 1.3&#xff1a;特殊声明&#xff08;匿名结构体&#xff09;&#xff1a; 1.4&#xff1a;结构的自引用&#xff1a; 1.5&#xff1a;结构体变量的定义和初始化&am…