【图片下载※】
import urllib.request as req
if __name__ == '__main__':
# **********begin********* #
webpage = req.urlopen('http://www.gotonudt.cn/site/gfkdbkzsxxw/resources/img/logo.png')
webdata = webpage.read()
img = open('img/logo.png', 'wb')
img.write(webdata)
img.close()
# **********end********** #
【图片链接提取※】
import urllib.request as req
def getHTML(url):
# *********begin********* #
webpage = req.urlopen(url)
webdata = webpage.read()
html = webdata.decode('utf-8')
return html
# *********end********* #
def getImgUrls(html):
# *********begin********* #
# 图片的网址在<img>标签中定义,如:<img src="/site/gfkdbkzsxxw/resources/img/down2.png" width="10" height="8">
# 所以,利用img标签可找到所有图片的网址
imgUrls = [] # 存放网址
pos = 0
while True: # 每循环一次,找一个网址,为避免找重复的,每次从html第pos个字符开始查找,pos是上一次找到的网址的最后位置
start = html.find('<img src="/', pos) # 从html的pos处开始查找'<img src="/'的开始位置start
if start == -1: # 如果没找到
break # 则表示找完了,循环结束
end = html.find('"',
start + 11) # 若找到了,则从'<img src="/'的最后开始,查找'"'的位置end,start~end就是一个<img src="......",省略号就是要提取的网址
url = html[start + 10: end] # 提取网址
if len(url) == 0: # 可能有空网址
continue # 如果是空网址,则不再处理,继续查找下一个网址
url = 'http://www.gotonudt.cn' + url # 图片的网址也是相对网址,在前面加上域名
if url not in imgUrls: # 可能有重复的网址,此处是为了保证每个网址只记录一次
imgUrls.append(url)
pos = end # 将pos改为end,下次循环从pos处开始查找
return imgUrls
# *********end********* #
if __name__ == '__main__':
url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/index.html'
html = getHTML(url)
imgUrls = getImgUrls(html)
for url in imgUrls:
print(url)
【正则表达式※】
import urllib.request as req
import re
def getHTML(url):
# *********begin********** #
webpage = req.urlopen(url)
webdata = webpage.read()
html = webdata.decode('utf-8')
return html
# *********end********** #
def getImgUrls(html):
# *********begin********** #
relatedUrls = re.findall(r'<img src="(.*?)"', html, re.S) # 提取相对网址
imgUrls = []
for url in relatedUrls:
if len(url) == 0: # 可能有空网址
continue # 如果是空网址,则不再处理,继续查找下一个网址
url = 'http://www.gotonudt.cn' + url # 图片的网址是相对网址,在前面加上域名
if url not in imgUrls: # 可能有重复的网址,此处是为了保证每个网址只记录一次
imgUrls.append(url)
return imgUrls
# *********end********** #
if __name__ == '__main__':
url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/index.html'
html = getHTML(url)
imgUrls = getImgUrls(html)
for url in imgUrls:
print(url)
【文本内容分析※】
if __name__ == '__main__':
# **********begin**********#
# 先读取所有省份和对应的一本线分数,分别存入列表prov和grades
prov, grades = [], []
f = open('/root/score.txt', 'r')
while True:
line = f.readline()
if line == '':
break
flds = line.split()
prov.append(flds[0])
grades.append(int(flds[1]))
f.close()
# 对prov和grades中的数据进行排序
tmp = list(zip(grades, prov)) # 把grades、prov压缩为一个列表tmp
tmp.sort() # 对tmp排序,当列表元素是元组时,根据元组的第一个元素进行排序,即根据一本线分数排序
tmp.reverse() # 排序时是升序排列,改为降序排列
for x in range(3):
prov = str(tmp[x][1])
grades = str(tmp[x][0])
print(prov+"**********"+grades)
# **********end**********#
【网页图片批量获取 ※】
import urllib.request as req
import re
import os
# 获取网页的HTML源码,返回HTML源码
def getHTML(url):
# **********begin********** #
webpage = req.urlopen(url)
webdata = webpage.read()
html = webdata.decode('utf-8')
return html
# **********end********** #
# 从HTML代码中提取图片的网址,返回图片链接列表
def getImgUrls(html):
# **********begin********** #
relatedUrls = re.findall(r'<img src="(.*?)"', html, re.S)
imgUrls = []
for url in relatedUrls:
if len(url) == 0:
continue
url = 'http://www.gotonudt.cn' + url
if url not in imgUrls:
imgUrls.append(url)
return imgUrls
# **********end********** #
# 下载一幅图片,图片的链接为url,下载后的图片名字为name
def downloadImg(url, name):
# **********begin********** #
webpage = req.urlopen(url)
webdata = webpage.read()
img = open(name, 'wb')
img.write(webdata)
img.close()
# **********end********** #
# 将url对应网页上所有图片下载到dirPath文件夹
def downloadAllImg(url, dirPath):
# **********begin********** #
# 若文件夹不存在,则创建
if not os.path.exists(dirPath):
os.mkdir(dirPath)
# 获取网页上所有图片的网址
html = getHTML(url)
imgUrls = getImgUrls(html)
# 下载图片
for imgUrl in imgUrls:
imgName = os.path.split(imgUrl)[1] # 获取图片名字
imgName = os.path.join(dirPath, imgName) # 存入对应文件夹
try:
downloadImg(imgUrl, imgName) # 下载图片
except:
continue
# **********end********** #
if __name__ == '__main__':
url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/index.html'
dirPath = 'step5_img'
downloadAllImg(url, dirPath)
【网页数据分析(二)※】
# 函数 analysis 传入参数`path`表示文件路径
def analysis(path):
#*********** Begin **********#
#先读取所有省份和对应的一本线分数,分别存入列表prov和grades
prov, grades=[],[]
f = open(path, 'r',encoding='utf-8')
while True:
line = f.readline()
if line=='':
break
flds = line.split()
prov.append(flds[0])
grades.append(int(flds[1]))
f.close()
#对prov和grades中的数据进行排序
tmp = list(zip(grades, prov)) #把grades、prov压缩为一个列表tmp
tmp.sort() #对tmp排序,当列表元素是元组时,根据元组的第一个元素进行排序,即根据一本线分数排序
tmp.reverse() #排序时是升序排列,改为降序排列
# 直接打印输出答案即可
print(tmp[:3])
#*********** End **********#
analysis("/root/2016.txt")
【柱状图显示※】
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
# 函数 drawing 传入参数`path`表示文件路径
def drawing(path):
#*********** Begin **********#
N = 3
with open(path,'r',encoding='utf-8') as f:
tmp = list(map(lambda x:tuple(x.split(" ")),f.readlines()))
grades, prov = zip(*tmp) #将排序后的数据重新解压到grades和prov
grades = list(map(eval,grades))
#显示结果
N = 3 #显示一本线分数最高的N个数据,N的值可以修改
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
for i in range(N):
plt.text(i, grades[i]-50, grades[i], ha='center', fontsize=16)
plt.bar(range(N), grades[0:N],
color='rgy', tick_label=prov[0:N])
# 将图片文件保存至 `./结果/a.png`
plt.savefig("./结果/a.png")
#*********** End **********#
【第1关:创建连接套接字】
from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM) #此步已经完成socket对象的创建,无需重新创建
serverSocket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
#********* Begin *********#
# 将TCP套接字绑定到指定端口
serverSocket.bind(('', 6789))
#********* End *********#
#********* Begin *********#
# 进行端口监听,客户端最大连接数为1
serverSocket.listen(1)
#********* End *********#
print("start...")
#********* Begin *********#
# 服务器端和客户端建立连接
conn,address = serverSocket.accept()
#********* End *********#
print("连接成功")
#********* Begin *********#
# 得到客户端的数据,并打印出来
recv_data = conn.recv(1024).decode()
print(recv_data)
#********* End *********#
serverSocket.close()
【第2关:socket传输加密图片※】
from socket import *
import rsa
PUB = b'-----BEGIN RSA PUBLIC KEY-----\nMIIECgKCBAEA0clXVz1AWzgNSm7F6phzkXMoHrMywLrYKuDhh4wwnTt/08CFFN/V\nQbNk7wioAHC04D/iAe8XAH26T+i8y8zErxTTxitRN38Lrf0S1y3q+XBvQfm9z5X7\n8o6dHx/u8PMMQzwpqQZeICupLZe0+h9dP2Y05wKwnP9xRDJYelzc1VvdlNJS9x0l\nrb41+x2851ULq0z5iLUpUb4cBA2vVZ60BHKr22IhysQQ0MhUX8JnNAcQacQXJI+j\n7ROoo0dySQiHGrUKsELfUIl3XSMPBF+vF2shZnldip+uOyyMfUz35YHtlHIbyAKD\nfXWx2nkf3lMd0Fq/YfdUUcJWm6qxgvVoeCInpT2xDC4QnPQFantHEJinupajFupF\n0GBZp+/KFbgNYWqRbJzqywKA0epdMvlQsHbNfG4AkdOE4jP/WHBq73xdutajtCbd\nlFGd/VISconfpx8E0Ouj2fvoOcNIk9ed3zPF1sRJ5WsYAP7Cp1aSa98Lg9phb68E\nzsaQBMt4+bZbuJ0TC9e73P36f9j9+Cj+kFS6rVRbVbPn+oI/HWPn2BJ5W0pR5Buh\niXWhlGV+KHII63SqVx7jSmKmuTJk87FWg2q7+/joLidXvUnZbUj1eroIRtDkNA9e\n3VwCdkzUvQaBvYIEzqxE7Ej5ZL0gQHa3honCSl4aFDq7QcBnO6kti98fJIY1K0Fh\n6J94WHs80J00paSkZK77leE410Lq7ImVpq3mNwjEvp0x8K4eRMllOUWaoUcqo8tW\nS8OT5mUuP604hdK6ZAtjN5yJz9ro2ii1SkGjcx0YDVpGdK5LjKgKtWBj4ZrFMLHE\nMEquwHDpRsWZRWILrIy9gYooav43kovGMaUdRLAzlkvC2oa66aCehugvvvoW9kmE\nzihIfFuLH7W8suj69XI8v//QLQATqTc+0bBgdNlASJVk7z1m5mlNUIBX33W5V6qe\nToexbo1w1+/7Bjo80ketY1avVVWbZVIEgu1bkT+Z+DVqoU4zw6JMopu2bzlQSGbG\nF+4A3w1CK7U4dCXV/Vh7nbGSgJXjpO+EM0Hk3VcBoGReTsq5AVVOYu2I6Xrjds3b\n/Dek81JRHKCcdto4ZSpuL+73NrQwhu09EByH63cOYoSAz6mWbsUev5B12bkIheaL\nYKfCud06McA0pq5VvqEpFZDjgyszHtuVbwDcQQaXzF0Jq6X1jojjfxIakI3xUvlA\nmNk8JkFX6VdZ1NI9KbFcIBqZxbmgXQbWM6K4bJ+GXEcFZkaVZuInEMI8ak6VjmCy\nPt7Ty4WPKeDNzPSNSBi3HPPPB/yfOiMATdGXsm/jKp97RILiDi72ccdHrfzYYeei\niH7d6Dne6nKGIyXZJeFrfB1hSBvlXmIGXQIDAQAB\n-----END RSA PUBLIC KEY-----\n'
PRI = b'-----BEGIN RSA PRIVATE KEY-----\n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\nwui+fB+tk56BUG9c6c0LjkQb7+Xb5Qtdf5QDtKM=\n-----END RSA PRIVATE KEY-----\n'
pubkey = rsa.PublicKey.load_pkcs1(PUB)
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
serverSocket.bind(('', 6900)) # 将TCP欢迎套接字绑定到指定端口
serverSocket.listen(1) # 最大连接数为1
print('start...')
conn, address = serverSocket.accept()
print("连接成功")
try:
########### begin ##########
# 接受客户传来的请求,并打印消息
message = conn.recv(1024).decode() # 获取客户发送的报文
print(message)
######### end ##################
with open('./src/step2/python.jpg', 'rb') as f:
read_info = f.read()
########## beigin #############
# 对图片信息进行加密,并发送出去
crypto = rsa.encrypt(read_info, pubkey)
conn.send(crypto)
############# end ##############
conn.close()
except IOError:
conn.close()
【第1关:获取图像文件相关信息】
from PIL import Image ##调用库
def Basic_Information(path):
#*********** Begin **********#
# 读取文件所在的路径,转换成Image对象 文件路径为:./Image_digital_training/a.jpg
im = Image.open(path,"r")
lj = im.filename.rsplit("/",1)
# 将读取到的图像信息 以指定格式返回 格式形式:{'a.jpg': ['RGB', (500, 313), 'JPEG']}
return ({lj[1]:[im.mode,im.size,im.format]})
#*********** End **********#
【第2关:制作半透明图像】
from PIL import Image
def operating_image(path):
#*********** Begin **********#
img = Image.open(path)
img = img.convert('RGBA') # 修改颜色通道为RGBA
x, y = img.size # 获得长和宽
# 设置每个像素点颜色的透明度
for i in range(x):
for k in range(y):
color = img.getpixel((i, k)) # 获取单个像素点颜色,获取后的模型格式为RGB
color = color[:-1] + (100, ) # 将单个RGB像素点颜色设置为RGBA格式
img.putpixel((i, k), color) # 设置对应像素点的颜色。
img.save("./Picture_translucent/结果/a1.PNG") # 要保存为.PNG格式的图片才可以
return True
#*********** End **********#
【第3关:图像的剪辑】
from PIL import Image
def Image_clip(path):
#*********** Begin **********#
a = Image.open(path)
# 裁剪图片 (0,420,1729,1225)
d = a.crop((0,420,1729,1225))
# 将图像文件存储到 './Image_cropping/结果/d.jpg'
d.save('./Image_cropping/结果/d.jpg')
#*********** End **********#
return True
【第4关:图像的拼接】
from PIL import Image
def stitching_image(path):
#*********** Begin **********#
a = Image.open(path)
#裁剪以下像素坐标局部图
a1 = a.crop((825, 58, 1041, 274)) # 825, 58, 1041,274
a2 = a.crop((1120, 0, 1467, 347)) # 1120,0, 1467,347
a3 = a.crop((1550, 0, 1730, 180)) # 1550,0, 1730,180
a4 = a.crop((663, 607, 941, 885)) # 663,607,941,885
a5 = a.crop((1491, 209, 1703, 421)) # 1491,209,1703,421
a6 = a.crop((1027, 525, 1730, 1228)) # 1027,525,1730,1228
a7 = a.crop((180, 30, 370, 220)) # 180,30,370,220
a8 = a.crop((699, 871, 860, 1032)) # 699,871,860,1032
a9 = a.crop((867, 267, 1077, 477)) # 867,267,1077,477
#剪辑后的图像缩放
a1 = a1.resize((200, 200))
a2 = a2.resize((200, 200))
a3 = a3.resize((200, 200))
a4 = a4.resize((200, 200))
a5 = a5.resize((200, 200))
a6 = a6.resize((200, 200))
a7 = a7.resize((200, 200))
a8 = a8.resize((200, 200))
a9 = a9.resize((200, 200))
# 处理剪辑后的图像
a8 = a8.transpose(Image.FLIP_LEFT_RIGHT) # 水平翻转
# 拼接图像,黑色边框与图片间距为 10 像素
nineImg = Image.new('RGB', (640, 640) , 'black')
nineImg.paste(a1, ( 10, 10))
nineImg.paste(a2, (220, 10))
nineImg.paste(a3, (430, 10))
nineImg.paste(a4, ( 10, 220))
nineImg.paste(a5, (220, 220))
nineImg.paste(a6, (430, 220))
nineImg.paste(a7, ( 10, 430))
nineImg.paste(a8, (220, 430))
nineImg.paste(a9, (430, 430))
# 将图像文件存储到 './Image_stitching/结果/d.jpg'
nineImg.save('./Image_stitching/结果/d.jpg')
#*********** End **********#
return True
【第5关:图像的替换】
from PIL import Image
def trans(img):
#*********** Begin **********#
# 编写函数依次处理每个像素点
# 要求:若r、g、b、的均值大于230 则表示该像素的颜色接近白色,属于背景中的像素点,将其背景色设置为透明。否则将该像素的颜色替换为黑色。
transImg = img.convert('RGBA')
width, height = transImg.size
for x in range(0, width):
for y in range(0, height):
pix = list(transImg.getpixel((x, y)))
if pix[0]>230 and pix[1]>230 and pix[2]>230:
pix[3]=0
else:
pix = [0,0,0,255]
transImg.putpixel((x, y), tuple(pix))
return transImg
#*********** End **********#
def img_replace(path):
#*********** Begin **********#
img = Image.open(path)
# 根据如下像素点从图像img中提取所需物体并调用函数处理每个像素点。
back = img.crop((0, 0, 823, 633)) # 0, 0, 823, 633
front1 = img.crop((1134, 0, 1555, 331)) # 1134, 0, 1555, 331
front2 = img.crop((1543, 211, 1650, 428)) # 1543, 211, 1650, 428
front1 = trans(front1)
front2 = trans(front2)
# 根据如下像素点将原图中的物体替换成所需物体
back.paste(front1, (400, 0), mask=front1.split()[3]) # 400,0
back.paste(front2, (4, 95), mask=front2.split()[3]) # 4,95
# 将结果保存至 './Image_body_cold/结果/d.png'
back.save('./Image_body_cold/结果/d.png')
#*********** End **********#
return True
【第6关:图像处理综合训练※】
from PIL import Image
# 此函数用于调整图像比例,像素转化成对应字符。返回结果:每行像素转换后的字符集。
def charImg(img):
#*********** Begin **********#
#重新图像的调整大小
width = 150 #宽度设置为150,即每行的字符数,可根据需要调整
height = width*img.size[1]//img.size[0] #高度也按比例调整
height = int(height*0.5) #在txt中,行与行之间有间隔,所以进一步缩小高度才能得到较好的结果(缩小比例为:height * 0.5),可以去掉这行看看结果有何变化
img = img.resize((width, height)) #调整图片大小
#转化为灰度图
img = img.convert('L')
#定义字符集
charLib = '@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`\''
N = len(charLib) # 67
#转换
charImg = ''
for y in range(0, height):
for x in range(0, width):
gray = img.getpixel((x, y)) #获取像素的灰度值,gray为0~255间的整数,0表示黑色,255表示白色
idx = N*gray//255 - 1 #计算灰度值对应的字符
charImg = charImg+charLib[idx] #将灰度值转化成对应字符
charImg = charImg + '\n' #每行最后加上换行符
#*********** End **********#
return charImg
def read_file(path):
#*********** Begin **********#
# 此函数为读写函数,path参数为读取图像文件路径。
img = Image.open(path)
charImg1 = charImg(img)
# 直接打印结果即可
print(charImg1)
#*********** End **********#