Python零基础到精通-高级篇

【图片下载※】

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 **********#  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值