[TOC]

0x00 快速入门

(1)外置模块一览表
描述:Python外置模块可以说是Python的强大之处的存在,使得Python语言扩展性高,使用方法众多并且使用也非常简单,在我们日常的运维开发学习中尤为重要;

#>>>dir(random)  #查看与使用模块里的函数,前提必须引入模块,高阶用法 import 引入模块 as 模块别名;
#>>>help(random) #模块帮助
import urllib #网站请求模块
import lxml #xpath解析库模块 from lxml import etree

#表格Excel处理
import cvs #cvs表格模块
import xlwt #excel表格模块
import xlsxwriter #excel文件模块


#其他文章中介绍
import psutil #系统性能信息模块
import exifread #图片exif信息模块
import ruamel.yaml #YAML解析模块
import dnspython #DNS解析信息模块
import pycurl #web探测模块


0x01 外置模块详解

urllib 模块

urllib是一个包,下面有4个modules,主要进行网页请求;
文档地址
urllib.request 用于打开和读取url
urllib.error 包含由urllib.request引发的异常 (URLERROR(请求异常) -> HTTPERROR(网页响应码异常300~599))
urllib.parse 解析url
urllib.robotparser 用于解析robots.txt文件

案例:

#语法
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) #返回request配置请求的对象
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) #进行网站的请求

urllib.request.ProxyHandler(proxies=None) # 设置代理地址创建Proxyhandler 参数是一个字典 {'类型':'代理IP:端口'} 返回handler
urllib.request.build_opener([handler, ...]) # 创建Opener绑定代理资源,返回安装 opener开启工具对象
urllib.request.install_opener(opener) #安装Opener

#POST requestThe data argument must be a bytes object in standard application/x-www-form-urlencoded format;
urllib.parse.urlencode(data, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus)

urllib.parse.quote("网络安全") #解析中文URL

#案例
import urllib.request
import urllib.error

url = "http://weiyigeek.github.io"

data = {'action':'postValue'} #设置post请求参数
data = urllib.parse.urlencode(data).encode('utf-8') #等同于:application/x-www-form-urlencoded; charset=UTF-8

req = urllib.request.Request(url, data)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0') #设置请求头

#-----------------------------------------------------#
try
res = urllib.request.urlopen("https://weiyigeek.github.io",context=ssl._create_unverified_context()) #支持SSL请求
print("请求URL:\n",res.geturl())
print("状态码:",res.getcode())
print("返回消息头:\n",res.info())
print("请求头信息:",req.headers) #注意这里是 Request() 类方法返回的对象
except HTTPError as e: #【注意】HTTPError 必须在URLError之上
print("服务器响应出错:",e.code)
print("打印出具体的错误页面",e.read().encode('utf-8'))
except URLError as e: # 包含了HTTPError
print("服务器链接失败:",e.reason)
else:
print("请求成功!")

############ 执行结果 ########################
# 请求URL:http://weiyigeek.github.io
# 状态码: 200
# 返回消息头:
# Server: nginx/1.15.9
# Date: Fri, 12 Apr 2019 10:57:51 GMT
# Content-Type: text/html; charset=utf-8
# Content-Length: 15278
# Last-Modified: Wed, 10 Apr 2019 01:12:59 GMT
# Connection: close
# ETag: "5cad431b-3bae"
# Accept-Ranges: bytes

# 请求头信息: {'User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0'}


lxml 模块

使用xpath 必须首先下载lxml 库,xpath 只是一个元素选择器在python 的另外一个库lxml 中;
参考:https://cuiqingcai.com/2621.html

#使用pip进行下载lxml库
pip install lxml
from lxml import etree
##省略若干代码,dom_tree为我们解析之后的etree对象、
dom_tree = etree.HTML(html)
##语句一:
dom_tree.xpath('/html/body/div/a/@href')
##语句二:
dom_tree.xpath('//div/a/@href')
##语句二:
dom_tree.xpath('//div[@class="info-co"]/a/@href') 利用class属性
dom_tree.xpath('//div/a/@href') #将返回所有的链接网址
dom_tree.xpath('//div/a/text()') #将获取所有链接的名称

实际案例:

#获取到request请求网站的html
dom_tree = etree.HTML(html)
links = dom_tree.xpath("//div/span[@class='info-col row2-text']/a") #返回一个xpath对象

for i in links:
print(i.text)

for index in range(len(links_yaoshi)):
print(index)
print(links[index].text)
print(links_yaoshi[index].text)
print(links_danjia[index].text)


# 一定注意 xpath 查找提取结果是可以用“|”来提取多个results, 所以最终的code 如下:
data = dom_tree.xpath("//div[@class='info-table']/li")
info = data[0].xpath('string(.)').extract()[0]
print(data[0].xpath('string(.)').strip()) # 只是打印第一行的结果

#值得学习
dataRes = dom_tree.xpath("//div/span[@class='info-col row2-text']/a | //div/span[@class='c-prop-tag2'] | //span[@class='info-col price-item minor']")


0x02 表格数据处理

csv 模块

(1) csv.reader : 读取csv文件,返回的是迭代类型
(2) csv.writer(IO,dialect,delimiter):设置写入csv文件的模板
(3) DictReader:也是读取CSV文件,返回字典类型
(4) DictWriter:写入字典到CSV文件
(5) writerow:csv文件插入一行数据,把下面列表中的每一项放入一个单元格

案例:

#!/usr/bin/python3
#python3使用csv模块读写csv文件

import csv

#案例1:输出数据写入CSV文件
data = [
("Mike", "male", 24),
("Lee", "male", 26),
("Joy", "female", 22)
]
data1 = [[x] for x in range(10) if x % 2 == 0]
data2 = ['测试','w','我是中文'] #字符间以,分割

#打开文件并设置模式用with打开可以不用去特意关闭file了
#Python3.4以后的新方式,解决空行问题
with open('demo.csv','w+',newline='',encoding='utf-8') as csvfile:
# dialect为打开csv文件的方式,默认是excel,delimiter="\t"参数指写入的时候的分隔符
csvwriter = csv.writer(csvfile,dialect=("excel"),delimiter=',')
for each in data:
print(">>>",each)
csvwriter.writerow(each)

csvwriter.writerow(data2) #写入一行之中

4#csv文件插入一行数据,把下面列表中的每一项放入一个单元格(可以用循环插入多行)
csvwriter.writerow(["A","B","C","D"])

#案例2:打开csv文件读取数据
with open('demo.csv','r+',encoding='utf-8') as f:
res = csv.reader(f)
for x in res:
print(x[0])

#csv中有三列数据,遍历读取时使用三个变量分别对应
for title, year, director in reader:
list.append(year)
print(title, "; ", year , "; ", director)

with open("test.csv", "r", encoding = "utf-8") as f:
reader = csv.DictReader(f) #读取字典对象
column = [row for row in reader]

>python demo6.1.py
>>> ('Mike', 'male', 24)
>>> ('Lee', 'male', 26)
>>> ('Joy', 'female', 22)
Mike
Lee
Joy
测试


xlwt 模块

描述:对于execl表格数据的读取和写入插入删除等等,支丰富的计函数以及图表;
官网下载:http://pypi.python.org/pypi/xlwt

基础方法:

xlwt.Workbook(encoding = '编码格式')
workbook.add_sheet('表名称')
worksheet.write(0, 0, "写数据")
workbook.save('存储文件名称')

实际案例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import xlwt
def main():
workbook = xlwt.Workbook(encoding='utf-8') #创建workbook
worksheet = workbook.add_sheet('sheet名称') #创建workbook

#从0开始插入
worksheet.write(0, 0, 'Hello') # write_string()
worksheet.write(1, 0, 'World') # write_string()
worksheet.write(2, 0, 2) # write_number()
worksheet.write(3, 0, 3.00001) # write_number()
worksheet.write(4, 0, '=SIN(PI()/4)') # write_formula()
worksheet.write(5, 0, '') # write_blank()
worksheet.write(6, 0, None) # write_blank()

linenum = 7
#采用二维数组确定为主,往单元格内写入内容
worksheet.write(linenum, 0, "ID")
worksheet.write(linenum, 1, "根域名")
worksheet.write(linenum, 2, "绑定邮箱")
worksheet.write(linenum, 3, "DNS服务器1")
worksheet.write(linenum, 4, "DNS服务器2")
worksheet.write(linenum, 5, "状态")

#保存excel文档
workbook.save('Excel_Workbook.xls')

print("写入完成!")

if __name__ == '__main__':
main()

WeiyiGeek.excel表格处理


xlsxwriter 模块

描述:操作EXCEL的xlsxwriterm模块,可以操作多个工作表的文字/数字/公式和图表等;

模块特点:

  • 兼容性Exce文件支持Excel2003/2007等版本,支持所有Excel单元格格式
  • 可以进行单元格合并/批注/自动筛选,丰富多格式字符串等等
  • 支持共组吧PNG/jpg图像,自定义图表
  • 内存优化模式支持写入大文件

模块安装:

pip3 install xlsxwriter

#使用流程
1.创建excel文件对象
2.创建工作表对象
3.创建图表对象
4.定义excel的format格式对象

模块方法:

#1.workbook类
obj=Class.Workbook(filename[,options]) #该类创建一个XlsxWriter的Workbook对象,options为dict类型是可选参数,一般作为初始化工作表内容格式
worksheet=obj.dd_worksheet([sheetname]) #方法用于添加一个新的工作表,sheetname为工作表名称,默认是sheet1
format=obj.add_format([properties]) #方法用于在工作表中创建一个新的格式对象来格式化单元格 bold/normal
format.set_border(1) #定义format对象单元格边框加粗(1像素)的格式
format.set_bg_color('#999999') #定义对象的背景演示
format.set_blod() #显示粗体
format.set_num_format('0.00') #定义单元格边框加粗1像素的格式;
format.set_align('center')

chart=obj.add_chart(options) #用于在工作表中创建一个图表对象,内部是通过insert_chart()方法来实现的,参数为dict类型是为图标指定一个字典属性
obj.close() #作用是关闭工作表文件


#2.Worksheet类:
#Worksheet对象不能直接实例化,而是通过Workbook对象调用add_worksheet()方法来创建,代表一个excel工作表,是比较核心的一个类

worksheet.write(row, col, *args) #是用来将普通数据写入单元格中。
#简化不同数据类型的写入过程,write方法已作为其他更加具体的数据类型方法的别名
write_row('A1',写入的数据(单个字符/数组),格式化类型) #从A1开始写入一行
write_cloumn('A2',写入的数据(单个字符/数组),格式化类型) #从A2开始写入一列)
write_string():写入字符串类型数据
wirte_number():写入数字型数据
write_blank():写入空类型数据
write_formula():写入公式型数据
write_datetime():写入日期型数据
wirte_boolean():写入逻辑型数据
write_url():写入超链接型数据


worksheet.set_row(row, height, cell_format, options) #用于设定行单元格的属性。
#options字典类型,设置行hidden(隐藏)、level(组合分级)、collpsed(折叠)

worksheet.set_column(first_col, last_col, width, cell_format, options) #用于设置一列或多列单元格的属性

worksheet.insert_image(row, col, image[, options]) #用于插入图片到指定的单元格,支持PNG,JPEG,BMP等多种格式以及指定图片位置/比例/连接URL信息。



#3.chart类实图表组件,支持包括面积、条形图、柱状图、折线图、散点图等
#一个图表对象是通过Workbook的add_chart方法创建,通过{type, ‘图表类型’}字典来制定图表类型
workbook.add_char({'type':"column"})
area:面积样式的图表
bar:条形图
column:柱状图
line:线条样式的图表
pie:饼形图
scatter:散点图
stock:股票样式的图表
radar:雷达样式的图表

#插入到指定位置
chart.add_series(options) #用于添加一个数据系列的图表参数options为字典类型,用于设置图表系列选项的字典
#常用方法:
categories:设置图表类别标签范围;
values:设置图表数据范围;
line:设置图表线条属性,包括宽度、颜色等;
name: "引用为图例表-即右方的柱形说明图"


#其他常用方法展示
chart.set_y_axis(options) #设置图表y轴小标题
chart.set_x_axis(options) #设置图表X轴小标题
# name:设置x轴名称
# name_font:设置x轴字体
# num_font:设置x轴数字字体属性;

chart.set_size(options) #设置图标大小{'width':'1024','height':768}
chart.set_title(options)#设置图表上方标题,参数options为字典类型,、用于设置图表系列选项的字典
chart.set_style(style_id)#用于设置图表样式,style_id为不同数字代表不同样式
chart.set_table(options) #设置x轴为数据表格式形式
worksheet.insert_chart(row,col,chartObj) #将设置的图表插入到工作簿中

简单示例

workbook = xlsxwriter.Workbook('Chart.xlsx') 
worksheet =workbook.add_worksheet()
chart = workbook.add_chart({'type':'cloumn'})

format1 = workbook.add_format()
format1.set_border(1)

format2 = workbook.add_format()
format2.set_align('center')

worksheet.write_row('A1',写入的数据(单个字符/数组),format1) #从A1开始写入一行
worksheet.write_cloumn('A2',写入的数据(单个字符/数组),format2) #从A2开始写入一列)

for i in range(2,7)
worksheet.write_formula('I'+i,'=AVERAGE(B'+i+':H'+i+')'.format1) #从B2:H2的平均数
#对于图表添加数据也是一样的(重点之处)
chart.add_series({
'categories': '=Sheet1!B1:H1', #将作为图表x轴柱形下方说明
'values': '=Sheet1!$B$'+i+':$H$'+1, #图表数据区域赋值
'line': {'color': 'black'},
'name': u'引用为图例表-即右方的柱形说明图', #默认为系列1
})

chart.set_x_axis({'name':u' 星期数 '})
chart.set_y_axis({'name':u' Mb/s '})

worksheet.insert_chart('AB', chart)
workbook.close() #关闭文档

模块示例:

#!/usr/bin/env python
# coding=utf-8
import xlsxwriter

#创建一个新的Excel文件并添加工作表
workbook = xlsxwriter.Workbook('demo.xlsx') #创建工作簿

#创建一个新的工作簿
worksheet1 = workbook.add_worksheet() #创建工作表 sheet1(默认表名称)
worksheet2 = workbook.add_worksheet('testSheet2') #创建工作表 testsheet2

#在工作表中创建一个新的格式对象来格式化单元格,实现加粗
bold = workbook.add_format({'bold': True}) #方式1
bold = workbook.add_format();bold.set_bold() #方式2


#数据写入到工作簿之中,注意:两种方式实际是一种只是别名而已可以采用 A1 和 (0,0) 方式定位
worksheet.write('A1', 'Hello') #总表写入简单文本
worksheet.write_string(0,1, 'World') #总表写入简单文本字符串类型数据

worksheet.write('A2', 123.456) #写入数字类型数据
worksheet.write_number(1, 1, 123456) #按照坐标写入

worksheet.write('A3', None) #写入空数据类型
worksheet.write_blank(2,1, '') #写入空数据类型

worksheet.write('A4', '=SUM(A1:B2)') #写入公式型数据
worksheet.write_formula(3,1, '=SIN(PI()/4)')

worksheet.write('A5', datetime.datetime.strftime('2019-08-09','y%-m%-d%'),workbook.add_format({'num_format': 'yyyy-mm-dd'})) #写入日期型数据
worksheet.write_datatime(4,1,datetime.datetime.strftime('2019-08-09','y%-m%-d%'),workbook.add_format({'num_format': 'yyyy-mm-dd'}))

worksheet.write('A6', True) #写入逻辑类型数据
worksheet.write_boolean(5,1, False)

worksheet.write('A7', 'http://baidu.com') #写入超链接数据类型
worksheet.write_url(6,1, 'http://www.python.org')


#设置一列或者多列单元属性
worksheet1.set_column(0, 1, 10, bold) #设定列A到B单元格宽度10像素加粗
worksheet1.set_column('C:D', 20) # 设置C到D单元格宽度20像素
worksheet1.set_column('E:G', None, None, {'hidden': 1}) #隐藏E到G单元格


#设置一行或者多行单元属性
worksheet1.set_row(0, 30,bold) #设置都1行单元个高度30像素定义加粗
worksheet1.set_row(1, 30,workbook,add_format({'italic':True})) #设置都1行单元个高度30像素定义斜体
worksheet1.set_row(6, None, None, {'hidden': 1}) #隐藏第6行


#在第二个单元簿地单元格插入python-logo.png图片超链接为http://python.org
worksheet2.insert_image('A1', 'python-logo.jpg', {'url': 'http://python.org'})
worksheet2.insert_image('A3', 'python-logo.jpg') #插入图片


#Char类图表示例
chart = workbook.addchart({type,'column'}) #创建一个column(柱形)图标

#为图表添加数据
chart.add_series({
'categories': '=testSheet2!$A$1:$A$5',
'values': '=testSheet2!$B$1:$B3',
'line': {'color': 'red'},
'name'
})

#设置图表X轴显示
chart.set_x_axis({
'name': 'x name',
'name_font': {'size': 14, 'bold': True}
'num_font': {'italic': True}
})

#设置x轴为数据表格式
chart.set_table()

#图表大小
chart.set_size({'width': 720, 'height': 576})
#图表标题
chart.set_title({'name':"Table Title Demo"})

#图表样式
chart.set_style(37)

#插入图表到工作簿中
worksheet2.insert_chart('A7', chart)

workbook.close() #关闭工作薄

WeiyiGeek.


0x04 文件转换

1.PDFMiner模块

PDFMiner是一个专注于从PDF文档中提取、分析文本信息的工具。它不仅可以获取特定页码特定位置处的信息,也能获得字体等信息。

安装模块说明:

#首先安装PDFMiner,注意Python3要安装pdfminer3k
#Windows下面安装pdfminer3k
pip install pdfminer3k

#Linux下面安装pdfminer
pip install pdfminer

工作原理图:
WeiyiGeek.

解析pdf文件用到的类:

  • PDFParser:从一个文件中获取数据
  • PDFDocument:保存获取的数据,和PDFParser是相互关联的
  • PDFPageInterpreter: 处理页面内容
  • PDFDevice : 将其翻译成你需要的格式
  • PDFResourceManager : 用于存储共享资源,如字体或图像。

Layout布局分析返回的PDF文档中的每个页面LTPage对象。这个对象和页内包含的子对象形成一个树结构。
如图所示:
WeiyiGeek.

LTPage :表示整个页可能会含有LTTextBox,LTFigure,LTImage,LTRect,LTCurve和LTLine子对象。

  • LTTextBox:表示一组文本块可能包含在一个矩形区域。注意此box是由几何分析中创建,并且不一定表示该文本的一个逻辑边界。它包含LTTextLine对象的列表。使用 get_text()方法返回文本内容。
  • LTTextLine :包含表示单个文本行LTChar对象的列表。字符对齐要么水平或垂直,取决于文本的写入模式。使用get_text()方法返回文本内容。
  • LTAnno:在文本中字母实际上被表示为Unicode字符串。需要注意的是,虽然一个LTChar对象具有实际边界,LTAnno对象没有,因为这些是“虚拟”的字符,根据两个字符间的关系(例如,一个空格)由布局分析后插入。
  • LTImage:表示一个图像对象。嵌入式图像可以是JPEG或其它格式,但是目前PDFMiner没有放置太多精力在图形对象。
  • LTLine:代表一条直线。可用于分离文本或附图。
  • LTRect:表示矩形。可用于框架的另一图片或数字。
  • LTCurve:表示一个通用的Bezier曲线