Schema库的简单学习

Python Python Module Schema 库的简单学习 Schema 是一个简单易用的 python 数据校检三方库,Schema on Github. 在 web app 中,经常需要接收用户传过来的数据,然后做处理。但是用户由于各种原因,输入的数据并不如人意。前端发送 json 形式数据到后端 api,以往的解决方案甚是暴力,对 json 的 key 的值进行各种 if 检验,甚至要去做正则匹配。使用 schema 库能够非常优雅的解决这个问题。 Schema 和 marshmallow 的取舍。之前学习过 marshmallow,它有一个方法Schema.validate,同样可以完成数据校检,但是需要先生成一个独特的 Schema 类,用起来更适合序列化/反序列化的场景。而 Schema 库只做一件事,那就是数据校检。 核心类 Schema 数据检验最重要的类 Regex 正则匹配检验用到的类 Use And Or 一个类、一个方法 这是 schema 库里最重要的概念。 一个类是 Schema 类,可以理解为 schema 库的入口,什么都可以往里面传。 一个方法是 validate 方法,它接入一个数据或者一个 obj。 执行校检就是处理 validate 接收的数据和 Schema 类接收的 schema 之间的关系。 Schema 类传入基础类型 str,int,float,object >>> from schema import Schema >>> Schema(str).validate('abc') 'abc' >>> Schema(int).validate(123) 123 >>> Schema(float).validate(1.23) 1.23 >>> Schema(object).validate('abcd') 'abcd' >>> Schema(str).validate(123) schema.SchemaUnexpectedTypeError: 123 should be instance of 'str' 基础类型没什么好说的,只能检验最简单的数据。注意 object 是基类,也就是 validate 里的数据符合语法就会原样输出,但我们可以基于此做些类的判断 ...

scrapy框架初使用及爬取LOL信息

Python [[Web Crawler]] scrapy 框架初使用及爬取 LOL 信息 零、真前言 这篇文章是由 2018 年 4 月 16 日首次发布于 csdn,后来由于 “逃离csdn” 的想法中,将之前发布的文章重新排版,发表在个站中。 一、前言 了解到爬虫技术大概有 18 个月了,这期间自己写过几个爬虫,也 fork 过几个流行的爬虫 repo,包括 bilibili-user、iquery、WechatSogou 等,但一直没系统的写过爬虫,上一次心血来潮(17 年 10 月),想要爬下关于英雄联盟的数据,主要想获得皮肤原画数据。 当时决定的目标网站是英雄联盟中文官网,数据准确且更新快。LOL 数据库,但苦于该网页全篇使用 js 载入数据,无法直接读取,就退而求其次,改变目标网址多玩-英雄联盟-英雄数据库。 技术使用混杂,主要利用 requests+bs4 完成爬取,部分内容使用 scrapy 抓取,逻辑结构混乱,代码可见 spider-on-lol/v1.0/,功能基本实现,但不够美。七天之前,看到了这些代码,决定用 scrapy 重新实现功能,完成整个逻辑设计,这中间遇到了很多问题,从中得到了学习,完整代码可见 spider-on-lol。 二、爬虫设计全思路 目标网站:LOL 数据库 爬取内容: 英雄姓名 英雄头像 物品名称、id 物品图片 英雄皮肤原画 英雄背景故事 技术:scrapy,splash,docker 难点 图片获取 js 页面数据的获取 中文编码 三、环境搭建 工欲善其事,必先利其器。 1、 开发语言:python v3.6.5 2、开发语言环境:anaconda v1.6.9 (非必须,但隔离环境是一个好习惯) 3、docker 安装 deepin 下安装 docker 其他系统安装 docker 4、splash 安装方法 5、一些第三方库: scrapy:conda install Scrapy scrapy_splash: conda install scrapy_splash 四、什么是 Scrapy?什么是 Splash? 1、Scrapy Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。 ...

scrapy框架初使用及爬取LOL信息

Python Web Crawler Scrapy with bilibili 一、前言 在一个月前,我写了一篇scrapy 框架初使用及爬取 LOL 信息记录了爬取 lol.qq.com 获取英雄联盟数据及英雄皮肤原画的过程。第一次使用 scrapy 后,了解了大致的爬取流程,但在细节上(例如防 ban 策略,奇怪数据处理)没太在意,处于编码第一阶段(能跑就行)。 中间学了半个月的 Qt5 和 pygame,(没学出个什么样子,了解了大致概念,翻指南能上手了),之后,看到 github 中早期 fork 了一个库,airingursb 写的bilibili-user,深有所悟,在此先感谢他的源码及他的开源精神。 但最近一段时间,BiliBili 的网站结构有了些许的变化,我就尝试着用 scrapy 重写这个功能,以只修改 item 的方式保证这个爬虫的生命(理论上,更换 item 对应的 xpath 位置就可以应对页面元素更改)。并在此基础上增加一些防 ban 策略,深化对爬虫的编写能力,以及应对可能过大的数据处理任务(单纯的构造 url,截止 5 月 3 日,b 站已经有了 323000449 账号详情界面,之前的 lol 爬虫上千条数据就把路由器撑爆了,这次可能要应付 3 亿条数据)。完整代码可见bilibili-user-scrapy 二、爬虫设计全思路 1、目标网站 账户详情页 2、爬取内容: uid 用户id,int mid 用户id,str name 用户姓名,str sex 用户性别,str regtime 用户注册时间,str birthday 用户生日,str place 用户住址,str fans 用户粉丝数,int attention 用户关注数,int level 用户等级,int 3、技术:scrapy,splash,docker,mysql 4、难点 数据库设计及数据插入 js 页面数据的获取 特殊数据的处理 防 ban 策略 三、环境搭建 1、开发语言:python v3.6.5 2、开发语言环境:anaconda v1.6.9 (非必须,但这是一个好习惯) 3、docker 安装 deepin 下安装 docker 其他系统安装 docker ...

sed 匹配内容的前一行和后一行添加内容

Linux sed 匹配内容的前一行和后一行添加内容 在某行的前一行或后一行添加内容 具休操作如下: # 匹配行前加 sed -i '/allow 361way.com/iallow www.361way.com' the.conf.file # 匹配行前后 sed -i '/allow 361way.com/aallow www.361way.com' the.conf.file 而在书写的时候为便与区分,往往会在i和a前面加一个反加一个反斜扛。代码就变成了: sed -i '/2222222222/a\3333333333' test.txt sed -i '/2222222222/i\3333333333' test.txt a 是 append,行后加;i 是 insert,行前加。 配合find查找的内容处理,如下: find . -name server.xml|xargs sed -i '/directory/i <!--' find . -name server.xml|xargs sed -i '/pattern="%h/a -->' 在某行(指具体行号)前或后加一行内容 sed -i 'N;4addpdf' a.txt sed -i 'N;4ieepdf' a.txt 这里指定的行号是第四行 。 删除指定行的上一行或下一行 # 删除指定文件的上一行 sed -i -e :a -e '$!N;s/.*n(.*directory)/1/;ta' -e 'P;D' server.xml # 删除指定文件的下一行 sed -i '/pattern="%/{n;d}' server.xml 转载说明 sed 匹配内容的前一行和后一行 添加内容

ssh 服务的原理

Linux SSH ssh 服务的原理 读者大可以直接就自己的问题去 Google 解决方案,但是不理解这个过程,那么每次遇到都要去 search,自己只是‘工具人’,遇到了问题也不知道如何是好。这时候需要看下原理,有原理做基础,才能理解做配置的每一步的意义。 两种安全验证 SSH(即 Secure Shell),是一项创建在应用层和传输层基础上的安全协议,为计算机 Shell 提供安全的传输和使用环境。 所以为了安全,SSH 提供了两种级别的安全认证,基于密码的安全认证和基于密钥的安全认证。 基于密码的安全认证 基于密码的安全认证,登录的时候需要提供账号和密码;远程主机将自己的公钥分发给登录客户端,客户端访问主机使用该公钥加密;远程主机使用自己的私钥解密数据。 登录的流程如下: 远程主机收到用户登录请求,将自己的公钥发给用户 用户通过远程主机公钥的指纹确认主机的真实性,然后使用远程主机公钥将登录密码加密后,发送回远程主机 远程主机使用自己的私钥解码登录密码,验证密码正确后,允许用户登录 这种就是最常用的直接登录,需要输入密码,而传入过程中,明文密码会被加密,所以很安全。 基于密钥文件的安全认证 基于密钥的安全认证,客户端将将公钥上传到服务器。登录的时候,客户端向服务器发送登录请求;服务器收到请求后,向用户发送一段随机字符串;用户用自己的私钥加密后,再发送回服务器;服务器使用事先存储的公钥进行解密,如果解密成功,证明用户可信,允许登录。 这种方式,在登录服务器的过程中,不需要上传密码,增加了安全性。 known_hosts 文件 当第一次登陆远程主机时,不管是用密码还是密钥,都会有个提示: $ ssh user@host The authenticity of host 'host (***.***.***.***)' can't be established. RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d. Are you sure you want to continue connecting (yes/no)? 这段话提示用户无法确认远程主机的真实性,只知道 RSA 公钥的指纹,询问用户是否继续。 我们使用 ssh-keygen 工具可以生成 SSH 密钥对,其中公钥的长度可以很长,对用户来说不方便直接对比验证,因此对其进行了 MD5 计算,生成了一个128的指纹,这样再进行比较就比较容易了。 那么这里就要求我们事先知道远程主机的公钥指纹,才可以确认主机的真实性。 用户确认主机的真实性,输入 yes 继续连接: Warning: Permanently added 'host,***.***.***.***' (RSA) to the list of known hosts. 然后输入密码: ...

ssh 服务的配置

Linux SSH ssh 服务的配置 有了 ssh 服务的介绍以及原理之后,我们就可以做到 可以用很短的指令就登陆,并且不用输密码,最重要的就是要学会修改 ssh_config 文件。我们先介绍配置文件的一些可配置项,再针对免密登陆做操作。 配置文件 ssh程序可以从以下途径获取配置参数: 命令行选项 用户配置文件 (~/.ssh/config) 系统配置文件 (/etc/ssh/ssh_config) 配置文件可分为多个配置区段,每个配置区段使用 Host 来区分。我们可以在命令行中输入不同的host 来加载不同的配置段。 对每一个配置项来说,首次获取的参数值将被采用,因此通用的设置应该放到文件的后面,特定host相关的配置项应放到文件的前面。 常用配置项 下面介绍一些常用的SSH配置项: Host Host 配置项标识了一个配置区段。 ssh 配置项参数值可以使用通配符:* 代表0~n个非空白字符,? 代表一个非空白字符,! 表示例外通配。 我们可以在系统配置文件中看到一个匹配所有 host 的默认配置区段: $ cat /etc/ssh/ssh_config | grep '^Host' Host * 这里有一些默认配置项,我们可以在用户配置文件中覆盖这些默认配置。 GlobalKnownHostsFile 指定一个或多个全局认证主机缓存文件,用来缓存通过认证的远程主机的密钥,多个文件用空格分隔。默认缓存文件为:/etc/ssh/ssh_known_hosts, /etc/ssh/ssh_known_hosts2. HostName 指定远程主机名,可以直接使用数字IP地址。如果主机名中包含 %h ,则实际使用时会被命令行中的主机名替换。 IdentityFile 指定密钥认证使用的私钥文件路径。默认为 ~/.ssh/id_dsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ed25519 或 ~/.ssh/id_rsa 中的一个。文件名称可以使用以下转义符: '%d' 本地用户目录 '%u' 本地用户名称 '%l' 本地主机名 '%h' 远程主机名 '%r' 远程用户名 可以指定多个密钥文件,在连接的过程中会依次尝试这些密钥文件。 Port 指定远程主机端口号,默认为 22 。 ...

ssh-keygen 基本用法

Linux SSH ssh-keygen 基本用法 ssh 公钥认证是 ssh 认证的方式之一。通过公钥认证可实现 ssh 免密码登陆,git 的 ssh 方式也是通过公钥进行认证的。 在用户目录的 home 目录下,有一个 .ssh 的目录,和当前用户 ssh 配置认证相关的文件,几乎都在这个目录下。 ssh-keygen 可用来生成 ssh 公钥认证所需的公钥和私钥文件。 使用 ssh-keygen 时,请先进入到 ~/.ssh 目录,不存在的话,请先创建。并且保证 ~/.ssh 以及所有父目录的权限不能大于 711。 生成的文件名和文件位置 使用 ssh-kengen 会在 ~/.ssh/ 目录下生成两个文件,不指定文件名和密钥类型的时候,默认生成的两个文件是: id_rsa id_rsa.pub 第一个是私钥文件,第二个是公钥文件。 生成 ssh key 的时候,可以通过 -f 选项指定生成文件的文件名,如下: [huqiu@101 .ssh]$ ssh-keygen -f test -C "test key" ~~文件名 ~~~~ 备注 如果没有指定文件名,会询问你输入文件名: [huqiu@101 .ssh]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/huqiu/.ssh/id_rsa): /home/huqiu/.ssh/test 你可以输入你想要的文件名,这里我们输入test。 ...

SSHPASS 的使用

Linux SSH SSHPASS 的使用 如果是常规使用 ssh 登陆到服务器上,要么是通过密码,要么是通过配置公密钥的适配来做到免密登陆。现在有个新的场景,你想通过 ssh 登陆到某台节点并执行一条指令,但不想因为这么简单的事而将公钥上传过去,同时也不想通过 expect 或者 EOF 的方式来模拟操作(我们假定在一个脚本中),这时候就需要 sshpass 的帮助了。 sshpass 是一个简单、轻量级的命令行工具,通过它我们能够向命令提示符本身提供密码(非交互式密码验证),它直接使用 TTY 访问,以确保密码是用户键盘输入的。 sshpass 在专门的 tty 中运行 ssh,以误导 ssh 相信它是从用户接收到的密码。 重要:使用 sshpass 是不安全的,但新版本的 sshpass 做得足够好了。 安装 RedHat/CentOS 安装 $ yum install sshpass $ dnf install sshpass [Fedora 22 及以上版本] Debian/Ubuntu 和它的衍生版 $ sudo apt-get install sshpass MacOSX 安装 截止 2019.8.13 日,最新版是 1.06,未来可能更新,下面的指令,Cellar位置可能不确定。 $ brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb $ cd /usr/local/bin $ ln -s sshpass ../Cellar/sshpass/1.06/bin/sshpass 源码安装 $ wget http://sourceforge.net/projects/sshpass/files/latest/download -O sshpass.tar.gz $ tar -xvf sshpass.tar.gz $ cd sshpass-1.06 $ ./configure $ sudo make install 使用 sshpass 与 ssh 一起使用。先通过 -h 参数看下 sshpass 能做什么。 ...

StorCLI 的使用

Linux [[RAID]] StorCLI 的使用 目前 LSI RAID 卡使用的配置工作主要有:Megaraid Storage Manager(MSM,图形环境)、MegaCLI(字符界面)、StorCLI(字符界面)。其中 StorCLI 整合了 LSI 和原来 3ware 的产品支持,相对 MegaCLI 命令更加简洁,并且兼容 MegaCLI 的命令,估计不久的将来两者会统一。 StorCLI 在命令行的直接输出更直观,适合直接观看,不适合解析,好在有个特性,在结尾加上 J 可以获得 json 格式输出。 安装 登录BROADCOM网站上RAID卡的页面。 在 “DOWNLOADS” 页签中单击 “Management Software and Tools”。 打开管理软件和工具列表。 下载最新版本的 “MegaRAID Storcli” 工具。 解压后得到适用于不同操作系统的工具包。 rpm -ivh StorCLIxxx.rpm 使用 rpm 命令安装完成后,64 位系统命令的绝对路径为:/opt/MegaRAID/storcli/storcli64,32 位系统命令的绝对路径为:/opt/MegaRAID/storcli/storcli。 在测试的机器 xxx.x 上和 xxx.y 上都已经有了该工具,且版本为 Ver 1.23.02 Mar 28, 2017。 测试过程及基础说明 ip raid卡型号 芯片组 StorCLI能否使用 megacli能否使用 xx.xx.xxx.x PERC H730P Adapter SAS 3108 不能 可以 xx.xx.xxx.y AVAGO MR9361-8i UNKNOWN 可以 可以 有上述表格内容,可以看出,StorCLI 虽然是后起之秀,但在某些卡上,megacli 却能够输出结果。(通过对 Dell PowerEdge RAID Controller H730P的查看,简单的猜测 dell 定制的卡,无法被 storcli 管理)。在该文章中提到「Dell的产品 用PERC Cli」。即How to use the PowerEdge RAID Controller (PERC) Command Line Interface (CLI) utility to manage your RAID controller。 ...

storcli 的进阶使用

Linux RAID storcli 的进阶使用 基础信息 查看磁盘管理基础信息 $ storcli64 show Status Code = 0 Status = Success Description = None Number of Controllers = 1 Host Name = amd7302asus Operating System = Linux4.15.0-55-generic System Overview : =============== ------------------------------------------------------------------------------------- Ctl Model Ports PDs DGs DNOpt VDs VNOpt BBU sPR DS EHS ASOs Hlth ------------------------------------------------------------------------------------- 0 LSIMegaRAIDSAS9270CV-8i 8 24 1 0 1 0 Msng On 1&2 Y 4 Opt ------------------------------------------------------------------------------------- 从上述结果分析,有一块型号为 LSIMegaRAIDSAS9270CV-8i 的 RAID 卡。它是 8 通道的,挂载了 24 块物理盘,有 1 个磁盘组(DG),有 1 个虚拟磁盘(VD),没有电池。 ...