# spider_TAB
**Repository Path**: gitDux/spider_TAB
## Basic Information
- **Project Name**: spider_TAB
- **Description**: No description available
- **Primary Language**: Python
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-12-20
- **Last Updated**: 2022-04-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# spider
#### 介绍
- 使用 **python - scrapy** 框架搭建 **TAB** 三个网站的实例规格爬虫
- 并输出各实例的属性为 **excel** 文件。
- 最终以邮件形式发送到用户
为了实现各个页面信息的爬取,一共开发了如下几个爬虫文件:
| 云服务商 | 爬虫名 | 功能 | 目标链接 |
| -------- | ------------------- | --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 阿里 | ali-family | 爬取CPU信息、配比信息、应用场景等 | https://help.aliyun.com/document_detail/25378.html |
| 阿里 | ali-family-details | 爬取实例软硬件细节信息 | https://help.aliyun.com/document_detail/25378.html |
| 百度 | bai-family | ~ | https://cloud.baidu.com/doc/BCC/s/wjwvynogv |
| 百度 | bai-family-details | ~ | https://cloud.baidu.com/doc/BCC/s/wjwvynogv |
| 百度 | bai-price | 爬取实例价格表 | https://cloud.baidu.com/product-price/bcc.html |
| 腾讯 | tcnt-family | ~ | https://cloud.tencent.com/document/product/213/11518
https://cloud.tencent.com/document/product/560/19700
https://cloud.tencent.com/document/product/560/63854
https://cloud.tencent.com/document/product/386/63404 |
| 腾讯 | tcnt-family-details | ~ | https://cloud.tencent.com/document/product/213/11518 |
| 华为 | hua-family | ~ | 见config.json**hua-family** `./testPro/testPro/conf/config.json` |
| 华为 | hua-family-details | ~ | https://support.huaweicloud.com/productdesc-ecs/zh-cn_topic_0159822360.html |
| 华为 | hua-price | ~ | 见config.json**hua-price** `./testPro/testPro/conf/config.json` |
### **python 环境说明**
本项目使用轻量级 **python** 虚拟环境工具 virtualenv
环境配置步骤如下:
```shell
$ pip install virtualenv # 安装虚拟环境工具
$ virtualenv -p python3 spider # 创建spider独立环境
$ echo alias spider='source PATH_OF_ENV_ACTIVATE_FILE' >> ~/.bashrc (or ~/.zshrc) # 配置启动虚拟环境的命令
$ spider #启动环境
```
#### 安装方法
```shell
pip install -r requirements.txt
# wait for a while
```
### 使用方法
#### level 0
简单实用:run.sh脚本运行所有流程
```shell
>>> bash run.sh
```
```mermaid
graph TD
A[抓取表格]
A1([config.json:爬虫参数])
A2([data.json:CPU参数])
B[实例年度价格计算]
B1([config.json:价格计算参数])
C[vCPU:内存 配比计算]
D[应用场景翻译]
D1([config.json:翻译API参数])
E[差异对比&&压缩打包]
F[邮件发送]
F1[config.json:目标邮箱]
subgraph 依赖1
A1---A
A2---A
end
A--->B
A--->C
A--->D
B1--->E
D1--->E
C--->E
E--->F
subgraph 依赖2
D---D1
end
subgraph 依赖3
B---B1
end
subgraph 依赖4
F---F1
end
```
#### level 1
##### 单独抓取文件
工作目录:`spider_TAB/testPro`
```bash
spider
cd ./testPro
# 配置表获取
echo 阿里云基础配置表获取中...
scrapy crawl ali-family
echo 阿里云详细配置表获取中...
scrapy crawl ali-family-details
echo 百度云基础配置表获取中...
scrapy crawl bai-family
echo 百度云详细配置表获取中...
scrapy crawl bai-family-details
echo 腾讯云基础配置表获取中...
scrapy crawl tcnt-family
echo 腾讯云详细配置表获取中...
scrapy crawl tcnt-family-details
echo 华为云基础配置表获取中...
scrapy crawl hua-family
echo 华为云详细配置表获取中...
scrapy crawl hua-family-details
```
##### 价格计算
工作目录:`spider_TAB/testPro`
```bash
echo "年费价格计算中..."
python ./testPro/CalculatePrice.py bai-price
python ./testPro/CalculatePrice.py ali-price
python ./testPro/CalculatePrice.py tcnt-price
```
##### 应用场景翻译
工作目录:`spider_TAB/testPro`
```bash
python ./testPro/Translator.py ali-family
python ./testPro/Translator.py bai-family
python ./testPro/Translator.py tcnt-family
python ./testPro/Translator.py hua-family
```
##### vCPU:内存配比计算
工作目录:`spider_TAB/testPro`
```bash
python ./testPro/TableUnion.py
```
##### 差异对比&&压缩打包
工作目录:`spider_TAB`
```bash
source ./spider/bin/activate
cd ./outputs
diffino ./$1/ali-family.xlsx ./$2/ali-family.xlsx --output ../difference/ali-family.csv
diffino ./$1/ali-family-details.xlsx ./$2/ali-family-details.xlsx --output ../difference/ali-family-details.csv
diffino ./$1/ali-price.xlsx ./$2/ali-price.xlsx --output ../difference/ali-price.csv
diffino ./$1/bai-family.xlsx ./$2/bai-family.xlsx --output ../difference/bai-family.csv
diffino ./$1/bai-family-details.xlsx ./$2/bai-family-details.xlsx --output ../difference/bai-family-details.csv
diffino ./$1/bai-price.xlsx ./$2/bai-price.xlsx --output ../difference/bai-price.csv
diffino ./$1/tcnt-family.xlsx ./$2/tcnt-family.xlsx --output ../difference/tcnt-family.csv
diffino ./$1/tcnt-family-details.xlsx ./$2/tcnt-family-details.xlsx --output ../difference/tcnt-family-details.csv
diffino ./$1/tcnt-price.xlsx ./$2/tcnt-price.xlsx --output ../difference/tcnt-price.csv
cd ..
# 打包
cd ./testPro
cp -r ./testPro/output/* ../outputs/$path
cd ..
ls ./outputs|grep output > ./history.txt
sort ./history.txt -o ./history.txt
python ./utils/cache.py
rm -rf ./result.zip
zip -r result.zip difference ./outputs/$path
```
##### 邮件发送
工作目录:`spider_TAB`
```bash
python ./utils/AutoMail.py
```
### 价格表说明
[阿里](https://cn.aliyun.com/price/product#/ecs/detail/vm)和[腾讯](https://buy.cloud.tencent.com/price/cvm)的价格表需要手动下载,然后拖动到 output 文件夹下
阿里链接:https://cn.aliyun.com/price/product#/ecs/detail/vm
腾讯链接:https://buy.cloud.tencent.com/price/cvm
### 配置文件描述
#### 目标地址及爬虫参数配置
每个爬虫对于config.json中的一个字段,以典型的ali-family为例解释配置项目
xpath文档:https://www.runoob.com/xpath/xpath-tutorial.html
RE 文档:https://www.runoob.com/regexp/regexp-tutorial.html
```json
"ali-family":{
//目标链接列表
"urlList":["https://help.aliyun.com/document_detail/25378.html"],
//XPATH 页面内容匹配表达式
"XPATH-section":"//div[@class=\"body conbody\"]/section",
"XPATH-title":"h3/text()",
//RE 字符串匹配正则表达式
"RE-CPU":"处理器:(.*?) ",
"RE-pair":"((.*?))",
"RE-ClockSpeed":"(.*?)GHz",
"RE-memory": ["计算: (.*?)处理器:","存储: (.*?) 网络:","内存配比(.*?)[ ]"],
"RE-network": "网络: (.*?) 适用场景:",
"RE-usescenes": " 适用场景:(.*?)包括的实例规格及指标数据如下表所示"
},
```
#### 价格换算公式配置
| CSP | Instance Name | Full name | 公式 | 爬虫获取数据-x | 系统盘费用-y | 折扣-% | 带宽费用-z |
| -------- | ------------- | --------------------- | --------- | -------------- | ------------ | ------ | ---------- |
| Ali | ECS | Elastic Cloud Service | (x+y+z)*% | From Crawler | 255 | 0.85 | 234.6 |
| Tencnent | CVM | Cloud Virtual Machine | x+y*%+z | From Crawler | 210 | 0.83 | 199.2 |
| Baidu | bcc | Baidu Cloud Compute | x+y+z | From Crawler | 448.2 | - | |
```json
"ali-calculate":{
"y":255,
"z":234.6,
"c":0.85
},
"bai-calculate":{
"y":448.2,
"z":229.08,
"c":1
},
"tcnt-calculate":{
"y":210,
"z":199.2,
"c":0.83
}
```
#### 翻译API配置
```json
"translateAPI":{
//百度翻译url地址
"url":"/api/trans/vip/translate",
//注册后得到的appid
"appid":"20220120001060635",
//用户密钥
"secretKey":"AjChatNyXwEOiiSFFebr"
}
```
#### 收件邮箱配置
```json
"MailRecivers":["xiang.sun@intel.com","ted.ye@intel.com","kunye.zhu@intel.com"]
```
#### CPU信息配置
每个family爬虫在 `data.json`中对应一个cpu信息配置字段
```json
"ali-family":{
"ebmc7a":{"Family":"ebmc7a","CPU":"Milan 7T83","ClockSpeed":"2.55/3.5 GHz"},
"ebmc6a":{"Family":"ebmc6a","CPU":"Rome 7H12","ClockSpeed":"2.6/3.3 GHz"},
"ebmg7a":{"Family":"ebmg7a","CPU":"Milan 7T83","ClockSpeed":"2.55/3.5 GHz"},
"ebmr7a":{"Family":"ebmr7a","CPU":"Milan 7T83","ClockSpeed":"2.55/3.5 GHz"},
.
.
.
}
```
### ToDo
* 维护一个配置文件 `./conf/data.json` 包含TAB三家的CPU细节信息(网站未披露)。✔️
* ali.CPUMap:人为维护的CPU表,(方便程序中查询existence);
* ali.Data:具体的数据信息(目前包含有 `"Family", "CPU", "ClockSpeed"`三个属性)。
* 维护一个配置文件 `./conf/config.json` 包含基本配置和爬取规则。✔️
* memory、network、usescenes三个表项的优化✔️
* memory内存占比用大表来统计
* network的细节描述格式需要优化,还有很多乱点
* usescenes需要调用 translate API 来 进行 机器翻译
* 02/28
* family E列 去掉尾巴 ✔️
* D 列 ; 隔开✔️
* 删除B列中的 时钟频率 EPYCTM -> EPYCTM角标 ✔️
* 先确认网页没有CPU信息,再查找data.json ✔️
* "Skylake":"SLX" SKX -> SLX ✔️
* 配比 出现 no 修复 ✔️
* details 表 汉字替换 为 英文✔️
* 删除多余描述 Intel Xeon 、AMD EPYC™、AMPERE✔️
* Skylake 替换缩写✔️
* 3/7/2022
* 撰写说明文档✔️
### Modify Log
* 2022/07/01
* 增加了 `trash`文件夹 用来存放历史文件
* 将 ali 两层爬虫转移到 `trash` 文件夹中
* 将 `output`文件夹中的文件 `mv` 到 `trash` 中
* 增加 `conf`文件夹
* 增加 `config.json` 和 `data.json`
* 规范 json 配置文件内变量命名
* 2022/19/01
* 增加 `./utils/ExcelPrase.py` 来进行Excel解析和修改
* 读取大表的信息,最终确定每个family的内存配比情况
* 修改小表的信息,将family的内存配比情况添加进去
* 增加 `./utils/translateAPI.py` 用于应用场景的英文翻译
* 优化爬虫代码tenc,baidu中的解析过程,便于代码的维护
* 2022/20/01
* 实现百度翻译 API 的调用,并将相关配置文件加入到 `config.json`中
* 优化了 `tenc.py` 的代码框架
* 百度云的实例规格族是以长度38的Xpath列表给出
* 2022/20/02
* 爬取三朵云的附加数据表
* 对于有些实例有多个列而有些实例列相对较少的问题,采用贪婪爬取。