CentOS7安装playwright终极指南

CentOS7安装playwright终极指南

系统环境为CentOS Linux release 7.9.2009 (Core) 最小安装,考虑到playwright的安装需要 python3.7+ ,本次直接选择安装python3.8。

升级libstdc++

cd /opt
yum -y install wgetwget http://www.vuln.cn/wp-content/uploads/2019/08/libstdc.so_.6.0.26.zip
unzip libstdc.so_.6.0.26.zipfind /usr -name "libstdc++.so.*"
cd /usr/lib64
ll libstdc++.so.6
mv libstdc++.so.6 libstdc++.so.6.bakcp /opt/libstdc++.so.6.0.26 /usr/lib64/
cd /usr/lib64/
ln -snf ./libstdc++.so.6.0.26 libstdc++.so.6

升级glibc

下载并解压 glibc-2.28

cd /opt
wget http://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz
tar -xzvf glibc-2.28.tar.gz
cd glibc-2.28
### 创建临时文件
mkdir build && cd build
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin### 这一步时, 发生了错误, 提示大致为
*** These critical programs are missing or too old: compiler python
*** Check the INSTALL file for required versions.

升级 gcc 版本

yum -y install centos-release-scl
yum -y install devtoolset-8*rpm -ivh http://mirror.centos.org/centos/7/extras/x86_64/Packages/centos-release-scl-rh-2-3.el7.centos.noarch.rpm
yum -y install devtoolset-8-runtime
yum -y install devtoolset-8# 启用工具
scl enable devtoolset-8 bash# 安装GCC-8
yum -y install devtoolset-8-gcc devtoolset-8-gcc-c++ devtoolset-8-binutils bison# 直接替换旧的gcc
旧的gcc是运行的/usr/bin/gcc
mv /usr/bin/gcc /usr/bin/gcc-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc
mv /usr/bin/g++ /usr/bin/g++-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++gcc --version
g++ --version

升级 make

cd /opt
wget http://ftp.gnu.org/gnu/make/make-4.3.tar.gz
tar -xzvf make-4.3.tar.gz 
cd make-4.3/#安装到指定目录
./configure  --prefix=/usr/local/make
make
make install# 创建软链接
cd /usr/bin/
mv make make.bak
ln -sv /usr/local/make/bin/make /usr/bin/make

继续编译 glibc

# 进入之前的 `glibc-2.28/build`目录下
cd /opt/glibc-2.28/build
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/binmake
make install

查询libc版本

strings /lib64/libc.so.6 | grep GLIBC

设置(en_US.UTF-8)

vi /etc/environment
输入:
LANG=en_US.UTF-8
LC_ALL=
存盘,然后输入:source /etc/environment
localedef -v -c -i en_US -f UTF-8 en_US.UTF-8

安装python 3.8

Centos 7操作系统上默认安装了python 2.7.5版本,但是python 2即将成为历史,python 3才是未来的主流,本文记录了笔者在Centos 7上安装python 3.8的过程

下载python 3.8压缩包

使用如下命令下载python 3.8:

wget https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz

解压缩安装包

通过以下命令解压缩下载的文件:

cd /opt
tar zxvf Python-3.8.0.tgz

解压后进入Python-3.8.0目录:

cd /opt/Python-3.8.0

安装前准备工作

因为编译 Python 源代码需要依赖于很多工具,所以得先准备一下,依次执行以下命令:

yum update -yyum groupinstall -y 'Development Tools'yum install -y gcc openssl-devel bzip2-devel libffi-devel

安装python 3.8

现在我们就可以安装python 3.8了,首先执行以下命令(注意,一定要在Python-3.8.0目录下执行该命令):

cd /opt/Python-3.8.0
./configure --prefix=/usr/local/python3 --enable-optimizations

📝注意:

--prefix 选项是配置安装的路径,如果不配置该选项,安装后可执行文件默认放在 /usr/local/bin ,库文件默认放在 /usr/local/lib ,
配置文件默认放在 /usr/local/etc ,其它的资源文件放在 /usr/local/share ,比较凌乱.

如果配置 --prefix ,如: ./configure --prefix=/usr/local/python3 可以把所有资源文件放在 /usr/local/python3 的路径中,不会杂乱.用了 --prefix 选项的另一个好处是卸载软件或移植软件.当某个安装的软件不再需要时> ,只须简单的删除该安装目录,就可以把软件卸载得干干净净;移植软件只需拷贝整个目录到另外一个相同的操作系统机器即可.当然要卸载程序,也可以在原来的make 目录下用一次 make uninstall ,但前提是make文件指定过uninstall.

./configure 命令执行完毕之后创建一个文件 Makefile, 供下面的make命令使用,执行 make install 之后就会把程序安装到我们指定的文件夹中去.

make && make install

那么现在就安装好python 3了吗?很遗憾,答案是没有.因为系统默认使用的还是python 2.

修改 python 2 链接

我们首先查看一下 Python 可执行文件的位置:

which python

然后切换到相应的目录:

cd /usr/bin

查看相关的python信息:

ls -la python*

发现当我们执行 python 命令时,系统指向python 2,然后python 2指向python 2.7,所以系统默认使用的python版本仍然是python 2.

首先将python 改名为 python.bak

mv python python2.bak

再次查看python相关信息:

修改yum配置文件

进入目录 /usr/bin ,查看有关yum的文件:

ls -la yum*

使用 vi 进入文本编辑器(如果有多个yum配置文件,都要进去修改):

vi yum

点击i进入编辑模式之后将 #!/usr/bin/python 改为 #!/usr/bin/python2,按ESC退出编辑模式,输入 :wq! 保存修改退出.

同样进入文件 /usr/libexec/urlgrabber-ext-down 做同样修改.

配置python 3软链接

进入 /usr/bin 目录,配置软链接.在我看来,其实软链接就像Windows操作系统里的快捷方式,比如现在桌面上有一个图标叫python,现在你双击打开它,发现它打开的是Python 2,所以我们要配置其指向python 3.

ln -s /usr/local/python3/bin/python3.8 /usr/bin/pythonln -s /usr/local/python3/bin/pip3.8 /usr/bin/pip

📝注意: 如果提示 /usr/bin/pip 已经存在,可以使用rm删除,然后再进行配置.

当然,也可以配置一个pip3软链接.

rm -f /usr/bin/pip3
ln -s /usr/local/python3/bin/pip3.8 /usr/bin/pip3

验证python版本

输入 python --versionpip -V,查看

yum安装依赖和中文字体

yum -y install libXcomposite libXtst gtk3 atk at-spi2-atk cups-libs libxkbcommon libXdamage libXrandr mesa-libgbm alsa-lib-develyum -y install fontconfig
yum -y install cjkuni-ukai-fonts cjkuni-uming-fonts

安装playwright

rm -rf ~/.cache/ms-playwright/pip install playwright -i https://pypi.tuna.tsinghua.edu.cn/simple
python -m playwright install

测试脚本

# 导入
from playwright.sync_api import Playwright, sync_playwright# 创建浏览器
def run (playwright: Playwright) -> None:# 创建浏览器browser = playwright.chromium.launch(headless=True)# 使用 selenium 如果要打开多个网页,需要创建多个浏览器,但是 playwright 中只需要创建多个上下文即可# 例如:content1 = browser.new_context()、content2 = browser.new_context() 分别去访问网页做处理content = browser.new_context()# 每个 content 就是一个会话窗口,可以创建自己的页面,也就是浏览器上的 tab 栏,在每个会话窗口中,可以创建多个页面,也就是多个 tab 栏# 例如:page1 = content.new_page()、page2 = content.new_page() 封面去访问页面page = content.new_page()# 页面打开指定网址page.goto('https://www.baidu.com')print(page.title())page.screenshot(path="screenshot.png",full_page=True)# page.wait_for_timeout(1000)# 使用完成关闭上下文(也就是会话窗口)content.close()# 关闭浏览器browser.close()# 调用
with sync_playwright() as playwright:run(playwright)

存为 /opt/test_playwright.py
运行测试: python ./test_playwright.py


<<完毕>>

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

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

相关文章

day14_集合

今日内容 零、 复习昨日 一、集合框架体系 二、Collection 三、泛型 四、迭代 五、List(ArrayList、LinkedList) 零、 复习 throw和throws什么区别 throwthrows位置方法里面方法签名上怎么写throw 异常对象throws异常类名(多个)作用真正抛出异常对象声明抛出的异常类型 运行时…

极智开发 | CUDA Memory内存模型

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文分享一下 CUDA Memory内存模型。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq 熟悉和了解 CUDA Memory 内存模型对于…

成本预算管理系统

成本预算管理系统 功能介绍&#xff1a; 一 基本信息&#xff1a; 1、产品设置&#xff1a;产品的长、宽、高及面积计算公式的设置。 2、板材设置&#xff1a;板材类别、厚度、尺寸的设置 3、系统名称&#xff1a;风管系统的类别设置 4、公司信息&#xff1a;本公司的信息…

【多线程】线程互斥 {竞态条件,互斥锁的基本用法,pthread_mutex系列函数,互斥锁的原理;死锁;可重入函数和线程安全}

一、进程线程间通信的相关概念 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源。确切的说&#xff0c;临界资源在同一时刻只能被一个执行流访问。临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区。互斥&#xff1a;通过互…

vue实现图片分页

本小节学会使用v-show和click 、v-bind&#xff0c;v-bind可以简写为: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

基于鸟群算法的无人机航迹规划-附代码

基于鸟群算法的无人机航迹规划 文章目录 基于鸟群算法的无人机航迹规划1.鸟群搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用鸟群算法来优化无人机航迹规划。 1.鸟群搜索算法 …

OSCAR数据库上锁问题如何排查

关键字 oscar lock 问题描述 oscar 数据库上锁问题如何排查 解决问题思路 准备数据 create table lock_test(name varchar(10),age varchar(10));insert into lock_test values(ff,10); insert into lock_test values(yy,20); insert into lock_test values(ll,30);sessio…

0基础学习PyFlink——用户自定义函数之UDF

大纲 标量函数入参并非表中一行&#xff08;Row&#xff09;入参是表中一行&#xff08;Row&#xff09;alias PyFlink中关于用户定义方法有&#xff1a; UDF&#xff1a;用户自定义函数。UDTF&#xff1a;用户自定义表值函数。UDAF&#xff1a;用户自定义聚合函数。UDTAF&…

vue2+ant-design-vue a-select组件二次封装(支持单选/多选添加全选/分页(多选跨页选中)/自定义label)

一、效果图 二、参数配置 1、代码示例 <t-antd-selectv-model"selectVlaue":optionSource"stepList"change"selectChange" />2、配置参数&#xff08;Attributes&#xff09;继承 a-select Attributes 参数说明类型默认值v-model绑定值…

安装PS及AI遇到的问题

Mac安装PS/AI/PR/AE提示错误代码146 Failed with error code 146解决办法: 访达, -> 前往 ->前往文件夹 -> /Applications/Utilities/Adobe Sync 将Adobe Sync 文件夹里的CoreSync文件夹直接删掉

C++ 标准库随机数:std::default_random_engine

库头文件 #include <random> // 通过种子值设置随机数生成器 std::default_random_engine rng(seed);// 不设置种子值&#xff0c;使用默认值 std::default_random_engine rng; // 生成一个0到9之间的随机整数 int random_int rng() % 10;// 生成一个0到1之间的随机浮…

vivado crash

将增量编译去了

[Shell] ${} 的多种用法

文章目录 解释代码 解释 在Shell脚本中&#xff0c;${} 是一种变量替换语法。它用于获取和操作变量的值。 具体来说&#xff0c;${} 可以用来执行以下操作&#xff1a; 变量引用&#xff1a;${variable} 表示引用变量 variable 的值。 变量默认值&#xff1a;${variable:-de…

FPGA时序分析与约束(9)——主时钟约束

一、时序约束 时序引擎能够正确分析4种时序路径的前提是&#xff0c;用户已经进行了正确的时序约束。时序约束本质上就是告知时序引擎一些进行时序分析所必要的信息&#xff0c;这些信息只能由用户主动告知&#xff0c;时序引擎对有些信息可以自动推断&#xff0c;但是推断得到…

Sprint Cloud Stream整合RocketMq和websocket实现消息发布订阅

1.引入RocketMQ依赖&#xff1a;首先&#xff0c;在pom.xml文件中添加RocketMQ的依赖&#xff1a; <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</versi…

文件改名,轻松添加前缀顺序编号,文件改名更高效!

您是否曾经需要批量修改文件名&#xff0c;并希望在文件名中添加特定的前缀或顺序编号&#xff1f;现在&#xff0c;我们为您带来了一款全新的文件改名工具&#xff0c;帮助您轻松解决这个问题&#xff01; 第一步&#xff0c;进入文件批量改名高手主页面&#xff0c;在板块栏…

C++学习笔记之四(标准库、标准模板库、vector类)

C 1、C标准库2、C标准模板库2.1、vector2.1.1、vector与array2.1.2、vector与函数对象2.1.3、vector与迭代器2.1.4、vector与算法 1、C标准库 C C C标准库指的是标准程序库( S t a n d a r d Standard Standard L i b a r a y Libaray Libaray)&#xff0c;它定义了十个大类…

js读取文件 vue读取文件 JavaScript 读取文件解析为字符串 js读取文件 Vue读取文件

js读取文件 vue读取文件 JavaScript 读取文件解析为字符串 js读取文件 Vue读取文件 js读取文件 vue读取文件 JavaScript 读取文件解析为字符串 js读取文件 Vue读取文件使用 FileReader js读取文件 vue读取文件 JavaScript 读取文件解析为字符串 js读取文件 Vue读取文件 使用 F…

【python爬虫】设计自己的爬虫 1. request封装

通过requests.session().request 封装request方法 考虑到请求HTTP/2.0 同时封装httpx 来处理HTTP/2.0的请求 封装requests # 遇到请求失败的情况时 重新请求&#xff0c;请求5次等待2s retry(stop_max_attempt_number5, retry_on_resultlambda re_data: re_data is None, wai…

亚马逊,速卖通,美客多如何打造爆款商品,排名提升榜首

1、产品Listing的完整性 Listing是亚马逊A9算法认识你产品的基础&#xff0c;在发布一条listing的时候&#xff0c;尽可能地做到最好!在准备一条listing之前&#xff0c;一定事先要收集、整理足够多的产品关键词&#xff0c;在优化listing内容的时候填充进去。仔细观察优秀竞品…