分类目录归档:python

ubuntu下selenium Firefox环境搭建

在命令行下的Ubuntu系统需要使用Selenium来爬取网页。

首先
apt update

apt install firefox

pip3 install selenium

cd /usr/bin

下载firefox的驱动 geckodriver https://github.com/mozilla/geckodriver/releases

wget https://github.com/mozilla/geckodriver/releases/download/v0.29.1/geckodriver-v0.29.1-linux64.tar.gz

tar -xzvf geckodriver-v0.29.1-linux64.tar.gz

chmod +x geckodriver

python下交互
切记 命令行下务必设置无头模式

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
options = Options()
options.add_argument("-headless") #设置无头模式
options.add_argument('window-size=1600x900') #设置分辨率
#options.add_argument('blink-settings=imagesEnabled=false')  # 设置不加载图片, 提升速度
d=webdriver.Firefox(executable_path='/usr/bin/geckodriver',firefox_options=options)
d.get("http://google.com")
d.get_screenshot_as_file("cc.png") #保存网页为图片cc.png

MINIO Nginx配置 负载均衡

  1. 参考配置
server {
 listen 80;
 server_name example.com;
 location / {
   proxy_set_header Host $http_host;
   proxy_pass http://localhost:9000;
 }
}
  1. 添加存储处理
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m
use_temp_path=off;
server {
    # ...
    location / {
        proxy_cache      my_cache;
        proxy_set_header Host $http_host;
        proxy_pass       http://localhost:9000;
    }
}
  1. loadbalance 配置
 upstream minio {
       server 127.0.0.1:9001 weight=20 max_fails=2 fail_timeout=30s;
       server 127.0.0.1:9002 weight=10 max_fails=2 fail_timeout=30s;
       server 127.0.0.1:9003 weight=10 max_fails=2 fail_timeout=30s;
       server 127.0.0.1:9004 weight=10 max_fails=2 fail_timeout=30s;
    }
location / {
           # proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $http_host;
                client_body_buffer_size 10M;
                client_max_body_size 10G;
                proxy_buffers 1024 4k;
                proxy_read_timeout 300;
                proxy_next_upstream error timeout http_404;
                proxy_pass http://minio;
        }

可以拷贝配置

upstream minio_server {
    #以下4种均衡策略选一个
      # 1、默认轮询负载均衡least_conn;  
    # 2、最少连接负载均衡ip_hash;  
    # 3、会话持久化负载均衡
      # 4、带权重的负载均衡 
    server 192.168.8.110:9000 weight=3;
    server 192.168.8.110:9000;
    server 192.168.8.111:9000;
    server 192.168.8.112:9000;
    server 192.168.8.113:9000;
    }

server {
    listen 80;
    server_name example.com;
    #注意所有类型的location仅仅检验请求行(HTTP中的request line)中的URL部分,不带参数。这是因为请求字符串中的参数可以以多种方式给出
    location / {
        proxy_set_header Host $http_host;
        proxy_pass http://minio_server;
    }
}

Minio部署

Minio部署

单机多节点部署docker(Docker Compose部署):

下载文件 https://github.com/minio/minio/blob/master/docs/orchestration/docker-compose/docker-compose.yaml?raw=true
到你的目录,然后在该目录下运行:
docker-compose pull
docker-compose up

即可启动,默认启动4个节点,127.0.0.1:9000到9003
每个都可以访问,账户minio,密码都是minio123,在每一个操作都是一样的。

Minio多节点部署必须时(时间戳)差在3秒内,记得使用NTP同步时间,而且在摧毁一半的节点的情况下任能保持读取,如果是要保证读写,摧毁节点必须小于1/2

Docker部署二:

https://docs.min.io/cn/deploy-minio-on-docker-swarm.html

部署三:

Minio启动设置,首先下载minio的可执行文件,具体步骤:http://el.psy.congroo.com/2020/05/03/minio%e5%ae%89%e8%a3%85/
export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
minio server http://192.168.1.11/export1 http://192.168.1.12/export2 \
http://192.168.1.13/export3 http://192.168.1.14/export4 \
http://192.168.1.15/export5 http://192.168.1.16/export6 \
http://192.168.1.17/export7 http://192.168.1.18/export8

前面设置环境变量用于设置密码和账号,然后把每个节点加入:
前面脚本中IP后面的为硬盘地址(存储地址,绝对路径,比如第一个IP新建一个mkdir /export1即可 )
可以参考该部署脚本(minio.sh):
minio二进制文件下载地址: https://dl.minio.io/server/minio/release/linux-amd64/minio

服务器资源:
172.16.1.101
/minio/data1 /minio/data2
172.16.1.102
/minio/data1 /minio/data2
本集群由2台服务器构成(官方推荐集群最小4台服务器),每个服务器上挂载两个磁盘目录,最小数据挂载点为4个
#!/bin/bash
export MINIO_ACCESS_KEY=Minio
export MINIO_SECRET_KEY=Test123456
/opt/minio/minio server --config-dir /etc/minio \
http://172.16.1.101/minio/data1 http://172.16.1.101/minio/data2 \
http://172.16.1.102/minio/data1 http://172.16.1.102/minio/data2 \

Minio安装

X86
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server /data
ARM

wget https://dl.minio.io/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server /data
注意启动显示的 appkey secretkey是默认登录账户,密码

docker X86
docker pull minio/minio
docker run -i -t -p 9000:9000 -e MINIO_ACCESS_KEY=admin -e MINIO_SECRET_KEY=123123123 -v /data:/data minio/minio server /data

docker arm jessestuart/minio
docker run -i -t -p 9000:9000 -e MINIO_ACCESS_KEY=admin -e MINIO_SECRET_KEY=123123123 -v /data:/data jessestuart/minio server /data

-p 80:9000 设置80外部访问端口

API文档:https://docs.min.io/docs/python-client-api-reference

from minio import Minio
from minio.error import ResponseError

mc = Minio('127.0.0.1:9000',
                  access_key='admin',
                  secret_key='123123123',
                  secure=False)
注意带上端口
mc.list_buckets()  列出所有bucket  
mc.make_bucket('lcl')  创建lcl的bucket;如果是多节点还可以考虑这个location="us-east-1"  

 mc.fput_object('loli','x.png','X_80.png') 第一个参数是bucket名,第二个为上传后的文件名,第三个为文件位置,返回一个etag的串码'f7b865265606c41b0e07779d3317e0a8'  

mc.remove_bucket('lcl')删除bucket  
列出说有bucket的文件对像:
c=mc.list_objects('lcl') 第一个参数为bucket名,第二为前前缀prefix='asda'可以省,第三个为recursive(True(递归列表)/False(目录列表 默认)),
c为迭代对象,c中每一个都含有:
bucket_name
object_name  (记得UTF8,object_name.encode('utf8'))
is_dir
size
etag
last_modified(修改时间戳)


z=mc.get_object('bucket名称','object_name文件保存名','request_headers','sse服务器端
返回:object   urllib3.response.HTTPResponse
加密标头(可选,默认为无)')
    with open('my-testfile', 'wb') as file_data:
        for d in z.stream(32*1024):
            file_data.write(d)

直接保持文件
z=mc.fget_object('lcl','x.png','本地文件路径',,'request_headers','sse服务器端加密标头(可选,默认为无)')
返回:szie etag content_type metadata last_miodified

reomve_object('bucketname','object_name') 单
reomve_objects('bucketname','object_name的列表') 多

生成url GET
from datetime import timedelta
#timedelta 最长7天,days,seconds,minutes,hours
presigned_get_object('bucketname','object_name',expires=timedelta(days=1))
生成一个一天时间的链接

PUT使用presigned_put_object  
from minio import Minio
from datetime import timedelta
mc = Minio('192.168.0.102:9000',access_key='admin',secret_key='a123xds456',secure=False)
c=mc.presigned_get_object('loli','ua.pdf',expires=timedelta(days=1),response_headers={"response-content-disposition":"attachment; filename=z.pdf"})
print(c)