(一)、Pillow
Pycharm 安装:打开Terminal、python -m pip install pip
python -m pip install Pillow
官网Pillow
from PIL import Image, ImageFilter
im = Image.open('D:\code\PycharmProjects\PythonStudy\966760155050624.jpg')
# 获得尺寸
w, h = im.size
print('长-宽:%s-%s' % (w, h))
# 缩放50%
im.thumbnail((w // 2, h // 2))
print('长-宽:%s-%s' % (w // 2, h // 2))
# 缩放保存
im.save('demo.jpg', 'jpeg')
# 模糊滤镜
im2 = im.filter(ImageFilter.BLUR)
im2.save('demo2.jpg', 'jpeg')
PIL的ImageDraw
提供了一系列绘图方法,可以直接绘图。比如要生成字母验证码图片:
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random
# 随机字母
def rdChar():
return chr(random.randint(65, 90))
# 随机颜色2
def rdColor():
return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))
# 随机颜色2
def rdColor2():
return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))
# 250 * 65
width = 50 * 5
height = 65
image = Image.new('RGB', (width, height), (255, 255, 255))
# Font对象
font = ImageFont.truetype('C:/Windows/Fonts/Arial.ttf', 36)
# Draw对象
draw = ImageDraw.Draw(image)
# 填充每个像素
for x in range(width):
for y in range(height):
draw.point((x, y), fill=rdColor())
# 输出文字
for t in range(5):
draw.text((60 * t + 9, 9), rdChar(), font=font, fill=rdColor2())
# 模糊
image = image.filter(ImageFilter.BLUR)
image.save('code.jpg', 'jpeg')
(二)、requests
requests
。它是一个Python第三方库,处理URL资源特别方便。
通过GET访问一个页面:
import requests
r = requests.get('https://new.qq.com/omn/20200310/20200310A0RYZA00.html')
print(r.status_code)
# print(r.text)
# 带参数URL,传入dict做params参数
r1 = requests.get('https://www.douban.com/search', params={'q': 'python', 'cat': '1001'})
print(r1.url)
# requests自动检测编码,可以使用encoding属性查看
print(r1.encoding)
无论响应是文本还是二进制内容,我们都可以用content
属性获得bytes
对象
print(r.content)
可以直接获取JSON
,需要传入HTTP Header
时,我们传入一个dict
作为headers
参数。
r2 = requests.get('https://www.douban.com/', headers={'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit'})
print(r2.text)
发送POST
请求,只需要把get()
方法变成post()
,然后传入data
参数作为POST
请求的数据:
r3 = requests.post('https://accounts.douban.com/login',
data={'form_email': 'abc@example.com', 'form_password': '123456'})
params = {'key': 'value'}
r = requests.post(url, json=params) # 内部自动序列化为JSON
上传文件,requests
把它简化成files
参数
upload_file = {'file': open('xxx.xls', 'rb')}
r = requests.post(url, files=upload_file)
将post()
方法替换为put()
,delete()
等,就可以以PUT
或DELETE
方式请求资源,requests
对Cookie
做了特殊处理,不必解析Cookie
就可以轻松获取指定的Cookie
。
c = {'token': '123456', 'status': 'working'}
r = requests.get(url, cookies=c)
(三)、chardet
检测编码,简单易用。
拿到一个bytes
时,就可以对其检测编码。用chardet
检测编码,只需要一行代码:
import chardet
c = chardet.detect(b'Hello,Python')
print(c)
'''
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
'''
datas = '天王盖地虎,小鸡炖蘑菇'.encode('gbk')
d = chardet.detect(datas)
print(d)
'''
{'encoding': 'GB2312', 'confidence': 0.7407407407407407, 'language': 'Chinese'}
'''
datas = '天王盖地虎,小鸡炖蘑菇'.encode('utf-8')
d = chardet.detect(datas)
print(d)
'''
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
'''
datas = '主要ニュース'.encode('euc-jp')
d = chardet.detect(datas)
print(d)
'''
{'encoding': 'EUC-JP', 'confidence': 0.99, 'language': 'Japanese'}
'''
(四)、psutil
Python中获取系统信息,跨平台使用,支持Linux/UNIX/OSX/Windows等psutil
- 获取CPU信息
import psutil
# cpu数量
c_num = psutil.cpu_count()
print(c_num)
# cpu物理核心
c_hx = psutil.cpu_count(logical=False)
print(c_hx)
# 统计CPU的用户/系统/空闲时间
c_time = psutil.cpu_times()
print(c_time)
# 类似top命令的CPU使用率,每秒刷新一次,累计10次
for x in range(10):
p = psutil.cpu_percent(interval=1, percpu=True)
print(p)
6
6
scputimes(user=4970.815864, system=1706.5417392999952, idle=59512.0570851, interrupt=77.3920961, dpc=37.752241999999995)
[4.7, 9.4, 15.6, 7.8, 15.6, 17.2]
[7.7, 15.6, 0.0, 6.2, 10.9, 6.3]
[9.4, 9.4, 4.7, 6.3, 7.8, 9.4]
[9.1, 4.6, 3.1, 6.2, 10.8, 9.2]
[7.8, 9.4, 6.2, 9.4, 12.5, 9.4]
[9.4, 10.9, 0.0, 3.1, 17.2, 21.9]
[9.4, 9.4, 1.6, 6.3, 25.0, 17.2]
[6.2, 14.1, 3.1, 6.3, 12.5, 9.4]
[10.8, 9.4, 6.3, 4.7, 9.4, 14.1]
[20.9, 7.8, 10.9, 3.1, 14.1, 14.1]
- 获取内存信息
使用psutil
获取物理内存和交换内存信息,分别使用:
import psutil
p = psutil.virtual_memory()
print(p)
s = psutil.swap_memory()
print(s)
svmem(total=8467001344, available=4706975744, percent=44.4, used=3760025600, free=4706975744)
sswap(total=16932057088, used=6075719680, free=10856337408, percent=35.9, sin=0, sout=0)
- 获取磁盘信息
# 磁盘分区信息
ds = psutil.disk_partitions()
print(ds)
# 磁盘使用情况
dsu = psutil.disk_usage('/')
print(dsu)
# 磁盘IO
dsio = psutil.disk_io_counters()
print(dsio)
[sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='E:\\', mountpoint='E:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='F:\\', mountpoint='F:\\', fstype='', opts='cdrom')]
sdiskusage(total=503314378752, used=118400143360, free=384914235392, percent=23.5)
sdiskio(read_count=276350, write_count=246640, read_bytes=7565211648, write_bytes=8022806528, read_time=3129, write_time=589)
- 获取网络接口
# 获取网络信息
n = psutil.net_io_counters() # 获取网络读写字节/包个数
print(n)
ntf = psutil.net_if_addrs() # 获取网络接口信息
print(ntf)
ntfs = psutil.net_if_stats() # 获取网络接口状态
print(ntfs)
nifo = psutil.net_connections() # 获取当前网络连接信息
print(nifo)
snetio(bytes_sent=25643627, bytes_recv=292889108, packets_sent=214689, packets_recv=255583, errin=0, errout=0, dropin=0, dropout=0)
{'本地连接': [snicaddr(fa...), snicaddr(...), snicaddr(...), snicaddr(...), snicaddr(...)]}
{'本地连接': snicstats(...), 'Loopback Pseudo-Interface 1': snicstats(...), 'isatap.DHCP HOST': snicstats...)}
[sconn(fd=-1, family=<AddressFamily.AF_INET6: 23>, ......... pid=2784)]
- 获取进程信息
# 获取进程信息
print(psutil.pids()) # 获取所有进程ID
p = psutil.Process(408) # 获取指定线程
print(p.name(), p.exe(), p.cwd(), p.cmdline(), p.ppid(), p.parent(), p.children(), p.status(), p.username(),p.create_time(), p.cpu_times, p.memory_info(), p.open_files(), p.connections(), p.num_threads(), p.threads(), p.environ())
>>> p.name() # 进程名称
>>> p.exe() # 进程exe路径
>>> p.cwd() # 进程工作目录
>>> p.cmdline() # 进程启动的命令行
>>> p.ppid() # 父进程ID
>>> p.parent() # 父进程
>>> p.children() # 子进程列表
>>> p.status() # 进程状态
>>> p.username() # 进程用户名
>>> p.create_time() # 进程创建时间
>>> p.terminal() # 进程终端
>>> p.cpu_times() # 进程使用的CPU时间
>>> p.memory_info() # 进程使用的内存
>>> p.open_files() # 进程打开的文件
>>> p.connections() # 进程相关网络连接
>>> p.num_threads() # 进程的线程数量
>>> p.threads() # 所有线程信息
>>> p.environ() # 进程环境变量
>>>p.terminate() # 结束进程