python实现固定尺寸图像拼接

python实现固定尺寸图像拼接

python实现固定尺寸图像拼接
讲解
1、代码效果:固定尺寸图像拼接
代码

import os
import cv2
import numpy as np

def joint(or_path, tar_path, size):
determination = tar_path
if not os.path.exists(determination):
os.makedirs(determination)

path = or_path
folders = os.listdir(path)
folders_name = []
folders.sort(key = lambda x: int(x.split(‘.’)[0]))
for folder in folders:
folders_name.append(path + “\\” + str(folder))
foldler_len = len(folders_name)
joint = []
for i in range(size):
joint.append(cv2.imread(folders_name[i]))
index = 0
for i in range(len(folders_name)):
if i < size:
continue
image = cv2.imread(folders_name[i])
joint[index] = np.hstack((joint[index], image))
index += 1
if index > size – 1:
index = 0
for i in range(1, len(joint)):
joint[0] = np.vstack((joint[0], joint[i]))
cv2.imwrite(tar_path + “/all.jpg”, joint[0])
print(joint[0].shape)

if __name__ == “__main__”:
joint(r””, r””, size)#原图像文件夹路径、新图像存放路径、单方向图像数

运行结果
运行前%title插图%num

运行后

%title插图%num

ArcPy基础之字典(二)

ArcPy基础之字典(二)

文章目录
一、编译环境和编译器
二、字典
1.定义字典,获取字典关键字、值、对象
2.字典的操作:增、删、改、查、复制和创建
一、编译环境和编译器
ArcGIS10.6:Python2.7.14 32-bit
编译器:Visual Studio Code

二、字典
1.定义字典,获取字典关键字、值、对象
代码如下(示例):

# encoding=utf-8

#定义字典{key:value}
dicA={“name”:”Xiao Ming”,”age”:14,”high”:167,”other”:””}
print(dicA)
print(len(dicA))#打印字典长度
#获取关键字、值、对象
print(dicA.keys())#打印字典关键字
print(type(dicA.keys()))#字典关键字类型,list

print(dicA.values())#打印值
print(type(dicA.values()))#字典值类型,list

print(dicA.items())#打印对象
print(type(dicA.items()))#字典对象类型,list
print(“———-0”)

#通过循环获取,以获取对象为例
for item in dicA.items():
print(item)

print(“———-1”)

#根据关键字获取值
print(dicA.get(“name”))#根据关键字”name”获取值Xiao Ming
dicA.get(“name”)#当获取的关键字在原字典中不存在时,get()会返回默认值,但不改变原字典。
print(dicA)

print(dicA.setdefault(‘name’))#根据关键字”name”获取名字Xiao Ming
dicA.setdefault(‘grades’)#当获取的关键字在原字典中不存在时,setdefaul()t会返回默认值None并更新字典
print(dicA)

打印结果:

{‘high’: 167, ‘age’: 14, ‘other’: ”, ‘name’: ‘Xiao Ming’}
4

[‘high’, ‘age’, ‘other’, ‘name’]
<type ‘list’>
[167, 14, ”, ‘Xiao Ming’]
<type ‘list’>
[(‘high’, 167), (‘age’, 14), (‘other’, ”), (‘name’, ‘Xiao Ming’)]
<type ‘list’>
———-0
(‘high’, 167)
(‘age’, 14)
(‘other’, ”)
(‘name’, ‘Xiao Ming’)
———-1
Xiao Ming
{‘high’: 167, ‘age’: 14, ‘other’: ”, ‘name’: ‘Xiao Ming’}
Xiao Ming
{‘high’: 167, ‘age’: 14, ‘other’: ”, ‘grades’: None, ‘name’: ‘Xiao Ming’}

2.字典的操作:增、删、改、查、复制和创建
dicA={‘high’: 167, ‘age’: 14, ‘other’: ”, ‘grades’: None, ‘name’: ‘Xiao Ming’}
#字典的操作
#增
dicA[“sex”]=”boy”#用[]直接添加字典关键字和值,且增加在字典尾部
print(dicA)#打印增加后字典

dicB={“class”:1,34:”ge”}
dicA.update(dicB)#将dicB更新到dicA中
print(dicA)#打印更新后结果
print(“———-2”)

#删
del dicA[“other”]#通过del删除关键词和值
print(dicA)#打印删除后字典

dicA.pop(“age”)#索引并删除关键字为“age”的键值对
print(dicA)#打印pop后字典

dicA.popitem()#索引并删除字典*新加入的键值对
print(dicA)#打印popitem后结果
print(“———-3”)

#改
dicA[“sex”]=”girl”#通过关键字将性别改为girl,它会覆盖原来值
print(dicA)#打印改后字典
print(“———-4”)

#查
print dicA.has_key(“sex”)#查询字典中是否存在关键字sex
print(“———-5”)

#字典的复制
print(dicA.copy())#打印复制后字典
print(“———-6”)

#创建新字典
dic1={}#新建一个空的字典
dic2=dic1.fromkeys((“hair”,”leg”),”long”)#对空的字典添加”hair”和“leg”两个关键值,并将值都赋为long
print(dic2)#打印新建字典

#清除
dic2.clear()#清除dic2
print(dic2)

打印结果:

{‘name’: ‘Xiao Ming’, ‘age’: 14, ‘sex’: ‘boy’, ‘high’: 167, ‘grades’: None, ‘other’: ”}
{34: ‘ge’, ‘name’: ‘Xiao Ming’, ‘age’: 14, ‘sex’: ‘boy’, ‘high’: 167, ‘grades’: None, ‘other’: ”, ‘class’: 1}
———-2
{34: ‘ge’, ‘name’: ‘Xiao Ming’, ‘age’: 14, ‘sex’: ‘boy’, ‘high’: 167, ‘grades’: None, ‘class’: 1}
{34: ‘ge’, ‘name’: ‘Xiao Ming’, ‘sex’: ‘boy’, ‘high’: 167, ‘grades’: None, ‘class’: 1}
{‘name’: ‘Xiao Ming’, ‘sex’: ‘boy’, ‘high’: 167, ‘grades’: None, ‘class’: 1}
———-3
{‘name’: ‘Xiao Ming’, ‘sex’: ‘girl’, ‘high’: 167, ‘grades’: None, ‘class’: 1}
———-4
True
———-5
{‘high’: 167, ‘class’: 1, ‘grades’: None, ‘name’: ‘Xiao Ming’, ‘sex’: ‘girl’}
———-6
{‘hair’: ‘long’, ‘leg’: ‘long’}
{}

ArcGIS开发arcpy教程
07-25
<p> arcgis数据处理过程中使用到的arcpy脚本,基础教程。有助于gis从业人员开发arcpy脚本便捷处理数据。提供基础与案例应用结合方式,讲解arcpy知识。 </p> <p> 1.python基础 </p> <p> 2.基本图形创建 </p> <p> 3.shapefile数据操作 </p> <p> 4.常见数据txt.csv,json,excel数据操作 </p> <p> 5.工具打包 </p> <p> (1)添加脚本方式 </p> <p> (2)ArcCatalog添加代码方式 </p> <p> 6.arcpy案例应用 </p> <p> (1)几何图形面polygon,点point之间关系应用 </p> <p> (2)面四至坐标提取应用 </p> <p> (3)面求交,找出*大相交面应用 </p> <p> (4)逐条记录导出应用 </p> <p> (5)批量裁剪影像应用 </p> <p> (6)栅格数据批量定义投影以及工具打包应用 </p> <p> <br /></p>
arcgis二次开发arcpy视频教程(持续更新中……)
yGIS
3253
https://edu.csdn.net/course/detail/25535 01. 课程概况 02. ArcPy开发-1-python基础–环境搭建、*个程序、练习 03. ArcPy开发-2-python基础–表达式,数据类型、语句、变量 04. ArcPy开发-3-python基础–字符串 05. ArcPy开发-4-python基础–列表 06. ArcPy…

爱码士看,月亮在跳舞:好文章2 小时前回复

爱码士LaoYuanPython:欢迎博主加入CSDN!欢迎博主到本人的Python专栏来交流!2 小时前回复

相关推荐
python笔记之ArcPy简介
baoqian1993的博客
2万+
第1章 ArcPy简介 1.1什么是 ArcPy? ArcPy 是一个以成功的 arcgisscripting 模块为基础并继承了 arcgisscripting 功能进而构建而成的站点包。目的是为以实用高效的方式通过 Python 执行地理数据分析、数据转换、数据管理和地图自动化创建基础。 该包提供了丰富纯正的 Python 体验,具有代码自动完成功能(输入关键字和点即可获得
ArcPy*章-Python基础
28
学习Arcpy,从零开始积累。1.代码注释: python中,说明部分通常使用注释来实现: 方式: # 或者 ## + 注释部分内容2. 模块导入: 方式: import Eg: import arcpy import os3.变量:(python中定义变量,不需要先声明变量类型,只需要直接命名和赋值即可) Eg: mapsize = “22 x 34″4.内置数据类型:…
python3使用arcpy_Python & ArcPy – 随笔分类 – McDelfino – 博客园
weixin_39622138的博客
109
随笔分类 – Python & ArcPyPython 学习,主要是 ArcGIS 里面有用到!摘要:利用 sklearn.feature_extraction.text 中的 CountVectorizer 来实现 首先获取所有的文本信息 然后将文本信息转化为从 0 开始的数字 获取转换后的字符向量 参见如下代码: >>> text_01 = “My name is A…
视频教程-ArcGIS开发arcpy教程-其他
weixin_33329105的博客
229
ArcGIS开发arcpy教程 从事数字城市、智慧城市、地质灾害、警务等国土…
从Python到空间分析Arcpy || 1.2.1 数据类型是什么,有哪些
jieyoudata的博客
66
今天开始介绍python中的数据类型,这是python中*基础也是*核心的内容,计划分为4-5个小节来介绍。 总的来说python中的数据类型可以分为 9大类(很容易记的数字)。 数值类型(Number) 数值类型又包括:int 整型 float 浮点型 complex复数类型,常用前2个 布尔型(Bool ) 布尔类型在python中是用关键字来定义的,False 和True ,请注意两个单词的*个字母都要大写,python 语言本身是对大小写敏感的语言,A和a在python中是两个不同的对象,bool
access数据放到list中_从Python到空间分析Arcpy || 1.2.1 数据类型

python实现滑动验证

做自动化测试的时候,需要自动登录QQ邮箱,在网上找的都是基于selenium的:参考链接,但是代码在本地运行并没有取得满意的效果:滑动不成功!
而且每个滑动解锁的网页不同,编码和格式就不同,复用率太低了!举个例子:

button = browser.find_element_by_id(‘tcaptcha_drag_button’)
x, y = button.location.get(‘x’), button.location.get(‘y’)
print(“location:”,x,y)
%title插图%num
这段代码是获取滑动解锁按钮坐标的,但是返回的是(33,193),而不是根据桌面像素(1920,1080)应该得到的坐标。

查看网页源码发现,这个验证框:width:300px,height:230px,因此坐标是根据这个iframe框架得到的,所以后面的拖动按钮并滑动就会出现问题,(比如拖动一点点就会报错:超出(300,230)边界错误),而且总是拖不到右边,搞了好久都不行(部分原因是我前端基础不牢固)
还有一些其他问题我就不再说了,反正就是心态爆炸:不想用selenium搞滑动了!
我就换了一个方法,按钮的图片定位,然后实现滑动验证:图片定位具体可以参考:ac.find_template识别图片并定位

直接上代码吧:

#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import paramiko
import pyautogui
import os
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from Auto_Test.base_action import match

def login_in():
browser = webdriver.Firefox()
browser.maximize_window()
browser.get(“https://mail.qq.com/”)
browser.switch_to.frame(“login_frame”)
browser.find_element_by_class_name(“inputstyle”).clear()
browser.find_element_by_class_name(“inputstyle”).send_keys(“xxxxx”)
browser.find_element_by_class_name(“inputstyle.password”).clear()
browser.find_element_by_class_name(“inputstyle.password”).send_keys(“xxxxx”)
browser.find_element_by_id(“login_button”).click()
browser.find_element_by_class_name(“login_button”).click()
time.sleep(2)
browser.switch_to.frame(“tcaptcha_iframe”)

time.sleep(3)
# 等待图片加载出来
WebDriverWait(browser, 5, 0.5).until(
EC.presence_of_element_located((By.ID, “tcaptcha_drag_button”)))
# button = browser.find_element_by_id(‘tcaptcha_drag_button’)
# x, y = button.location.get(‘x’), button.location.get(‘y’)
# print(“location:”,x,y)
lx,ly=match(“QQmail-slick”)
lz=[x for x in range(120,200,3)]
for i in lz:
pyautogui.moveTo(lx,ly)
pyautogui.dragRel(i,0,duration=2,button=’left’)
time.sleep(1)
pyautogui.moveRel(-i,0)

try:
alert = browser.find_element_by_id(‘guideText’).text
except Exception as e:
print(‘get alert error: %s’ % e)
alert = ”
if alert:
print(u’滑块位移需要调整: %s’ % alert)
sleep(3)
else:
print(‘滑块验证通过’)
browser.switch_to.parent_frame() # 验证成功后跳回*外层页面
break

from Auto_Test.base_action import match中的函数如下:

def match(target, show=True):
target_path = target.split(“-“)[0]
target_name = target.split(“-“)[1]
# 防止截全屏的页面没反应过来
time.sleep(1)
ttime_s = time.time()

global root_dir
appname = root_dir + ‘/APP_Action_Icons/’+target_path+”/”+target_name+’.png’
appname_2 = root_dir + ‘/APP_Action_Icons/’+target_path+”/”+target_name+’_2.png’
appname_3 = root_dir + ‘/APP_Action_Icons/’+target_path+”/”+target_name+’_3.png’
print(appname)
print(“root_dir =”, root_dir)

##根据桌面路径进行截屏
hwnd = win32gui.FindWindow(None, root_dir)
app = QApplication(sys.argv)
screen = QApplication.primaryScreen()
img = screen.grabWindow(hwnd).toImage()

##保存截屏
root_desk = root_dir + ‘/Screen_Shots/Test_Screen_shots/desktop.jpg’
img.save(root_desk)
##等待图片保存
time.sleep(0.5)
# 支持图片名为中英文名,也支持路径中英文
imsrc = cv2.imdecode(np.fromfile(root_desk, dtype=np.uint8), -1)
imobj = cv2.imdecode(np.fromfile(appname, dtype=np.uint8), -1)

##根踞名称匹配截图,只支持图片为英文名
# imsrc = ac.imread(root_desk)
# imobj = ac.imread(appname)

# 匹配图标位置
pos = ac.find_template(imsrc, imobj, 0.5,bgremove=True)
if pos == None and os.path.exists(appname_2):
print(“*张图标没匹配到,现匹配第二张:”, end=””)
print(appname_2)
imobj_2 = cv2.imdecode(np.fromfile(appname_2, dtype=np.uint8), -1)
# imobj_2 = ac.imread(appname_2)
pos = ac.find_template(imsrc, imobj_2, 0.5,bgremove=True)
if pos == None and os.path.exists(appname_3):
print(“第二张图标没匹配到,现匹配第三张:”, end=””)
print(appname_3)
imobj_3 = cv2.imdecode(np.fromfile(appname_3, dtype=np.uint8), -1)
# imobj_3 = ac.imread(appname_3)
pos = ac.find_template(imsrc, imobj_3, 0.5,bgremove=True)

# 如果第三张还未匹配到,用另一种方法重新截图
if pos == None:
print(“2秒后重新截全屏…”)
time.sleep(2)

##保存截屏
root_desk = root_dir + ‘/Screen_Shots/Test_Screen_shots/desktop_2.jpg’
img = ImageGrab.grab()
img.save(root_desk)
##等待图片保存
time.sleep(0.5)
# 支持图片名为中英文名,也支持路径中英文
imsrc = cv2.imdecode(np.fromfile(root_desk, dtype=np.uint8), -1)
imobj = cv2.imdecode(np.fromfile(appname, dtype=np.uint8), -1)

# 匹配图标位置
pos = ac.find_template(imsrc, imobj, 0.5,bgremove=True)
if pos == None and os.path.exists(appname_2):
print(“*张图标没匹配到,现匹配第二张:”, end=””)
print(appname_2)
imobj_2 = cv2.imdecode(np.fromfile(appname_2, dtype=np.uint8), -1)
pos = ac.find_template(imsrc, imobj_2, 0.5,bgremove=True)
if pos == None and os.path.exists(appname_3):
print(“第二张图标没匹配到,现匹配第三张:”, end=””)
print(appname_3)
imobj_3 = cv2.imdecode(np.fromfile(appname_3, dtype=np.uint8), -1)
pos = ac.find_template(imsrc, imobj_3, 0.5,bgremove=True)

if pos == None:
print(“*终没能匹配到:” + target)
else:
ttime_e = time.time()
__time = ttime_e – ttime_s

if show == True:
try:
show_and_save(root_desk, target, pos, __time)
except Exception as e:
print(“保存匹配结果show_and_save这里出错,错误原因为{}”.format(e))
print(pos)
point = pos[‘result’]
pyautogui.moveTo(point)
print(“匹配成功:{}”.format(target))
time.sleep(0.5)
print(pyautogui.position())
pyautogui.click(clicks=2)
return point

亲测有效,如果有问题,可以联系我,看到了就会*时间回复!
互相交流,互相学习,共同进步!

Python模块导入规范

Python模块导入规范

文章目录
模块导入的规范
import语句’
rom… import...语句
模块导入的规范
模块是类或函数的集合,用于实现某个功能。模块的导入和Java 中包的导入的概念很相似都使用import语句。在Python中,如果需要在程序中调用标准库或其他第三方库的类时,需要先使用import或from. … import. …语句导入相关的模块。

import语句’
使用import语句导入sys模块,并打印相关内容的方法
代码

# 规范导入方式
import sys
print(sys.path)
print(sys.argv)

第⒉行代码使用import语句导入了sys模块,sys模块是处理系统环境的函数的集合。
第3行代码输出Python 环境下的查找路径的集合,Python默认情况下会查找sys. path返回的目录列表。列表是Python内置的数据结构,定义了一组数据,通常用来作为参数或返回值。
第4行代码的sys. argv是存储输入参数的列表。默认情况下,argv自带的参数是文件名
运行结果

rom… import….语句
代码

# 不规范导入方式
from sys import path
from sys import argv
print(path)
print(argv)

第5行、第6行代码直接调用path、argv列表的内容,没有模块名的限定,这种写法不够规范。如果程序比较复杂,导入了很多模块,阅读程序的人并不了解path、argv来自哪个模块。而sys. path、sys. argv的写法可以清楚地知道path、argv来自sys模块。

手写NMS算法

手写NMS算法

在网上看了几个NMS算法的实现,要么照抄faster的,要么就写的乱七八糟的,还是自己按单步实现一下。也建议想认真学习的小伙伴都尽量手撕一遍,同时写博客也尽量严谨些,写之前尽量做一些测试,不要误导别人。
NMS原理:
NMS是非*大值抑制。在目标检测中,推理阶段会预测出很多框,而这些框很多是重叠的,毕竟网络看到图像上那个有目标的区域都差不多,它就认为是一个东西给你预测出来,特别是基于anchor的目标检测算法,大量的anchor会推送出巨多的目标框,这时候就需要用nms把一些置信度不是*高的Bbox滤去,这就是NMS。
算法步骤:
S1:以置信度排序(置信度高的自然认为*是需要的目标)
S2:置信度*高的框为基准,和剩下的所有框计算IoU
S3:如果IoU大于一定阈值则滤去(两个框有交叠)
S4:重复S2,S3
代码:

import numpy as np

### 模拟参数 ###
boxes = np.array([[100,100,210,210,0.72],
[250,250,420,420,0.8],
[220,220,320,330,0.92],
[100,100,210,210,0.72],
[230,240,325,330,0.81],
[220,230,315,340,0.9]],dtype = np.float)

### 定义函数 ###
def nms(dets, threshold):
### 用切片取出x1, y1, x2, y2及置信度 ###
x1 = dets[:,0]
y1 = dets[:,1]
x2 = dets[:,2]
y2 = dets[:,3]
scores = dets[:,4]
keep = [] ### 需要保留框的索引 ###
index = scores.argsort()[::-1] ### 按置信度排序,index为一维列表,保留原始的索引 ###
while len(index) > 0: ### 直到索引列表长度为0时停止 ###
id = index[0] ### 置信度*大的总在indexp[0]处 ###
keep.append(id) ### 把置信度*大的保留 ###
index = np.delete(index,0,axis=0) ### 已经保留了 就从index列表中删除 ###
delete = [] ### 保留要从index里删除的索引 ###
### 剩余的Bbox和置信度*大的逐个计算IoU ###
for i in range(len(index)):
j = index[i]
xx1=max(x1[id],x1[j])
yy1=max(y1[id],y1[j])
xx2=min(x2[id],x2[j])
yy2=min(y2[id],y2[j])
w=max(0,xx2-xx1+1)
h=max(0,yy2-yy1+1)
interface=w*h
area = (x2[id] – x1[id]) * (y2[id] – y1[id]) + (x2[j] – x1[j]) * (y2[j] – y1[j]) – interface
overlap=interface/area
if overlap>=threshold: ### 记录IoU大于阈值的Bbox的位置 ###
delete.append(i)
### 如果IoU大于阈值就从index列表里删除 ###
index = np.delete(index,delete,axis=0)
return keep
keep = nms(boxes, 0.7)
print(keep)

Python编程—操作文件

Python编程—操作文件

操作文件
1、open API介绍
Help on built-in function open in module __builtin__:

open(…)
open(name[, mode[, buffering]]) -> file object

Open a file using the file() type, returns a file object.  This is the
preferred way to open a file.  See file.__doc__ for further information.
(END)
2、打开文件
andy@andy-virtual-machine:~/python_test$ cat example.py
#! /usr/bin/python
#coding:utf-8
#test open api to open a file

fd=open(“1.txt”)
print type(fd)
andy@andy-virtual-machine:~/python_test$ ./example.py
<type ‘file’>
andy@andy-virtual-machine:~/python_test$

Python语言打开文件模式
模式 描述
r 以读方式打开文件,可读取文件信息。
w 以写方式打开文件,可向文件写入信息。若文件存在,则清空该文件,再写入新内容。
a 以追加模式打开文件(即一打开文件,文件指针自动移到文件末尾),如果文件不存在则创建。
r+ 以读写方式打开文件,可对文件进行读和写操作。
w+ 消除文件内容,然后以读写方式打开文件。
a+ 以读写方式打开文件,并把文件指针移到文件尾。
b 以二进制模式打开文件,而不是以文本模式。
%title插图%num3、读文件中内容
Help on method_descriptor:

read(…)
read([size]) -> read at most size bytes, returned as a string.

If the size argument is negative or omitted, read until EOF is reached.
Notice that when in non-blocking mode, less data than what was requested
may be returned, even if no size parameter was given.

andy@andy-virtual-machine:~/python_test$ cat example.py
#! /usr/bin/python
#coding:utf-8
#test open api to open a file

fd=open(“1.txt”)
print type(fd)
content=fd.read()
print content
andy@andy-virtual-machine:~/python_test$

4、查看文件状态%title插图%num
Help on built-in function localtime in module time:

localtime(…)
localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,
tm_sec,tm_wday,tm_yday,tm_isdst)

Convert seconds since the Epoch to a time tuple expressing local time.
When ‘seconds’ is not passed in, convert the current time instead.
(END)
andy@andy-virtual-machine:~/python_test$ cat example.py
#! /usr/bin/python
#coding:utf-8
#test open api to open a file
import os
import time

fd=os.stat(“1.txt”)
print type(fd)
print fd
print fd.st_ctime
print fd.st_ctime
print time.localtime(fd.st_ctime)%title插图%num

 

python之类的封装、多态、继承

python之类的封装、多态、继承

类方法包括:实例方法、静态方法、类方法

变量包括:类变量和实例变量

子类可以继承多个父类

#-*- coding:utf-8 -*-

class User:
#类变量
city=”shanxi”
schole=”cddx”
def __init__(self,name,age):
#实例变量
self.name=name
self.age=age
#实例方法
def speak(self):
print(“我是一个人”)

def eat(self):
print(“调用方式:u=User(“”,15)u.speak()”)

#静态方法
@staticmethod
def man():
print(“调用方式:User.man()”)

#类方法
@classmethod
def classUser(cls):
print(“调用方式:User.classUser()”)

#继承关系(可以继承多个父类)
class student(User):
def __init__(self,name,age,grade):
#调用父类方法
User.__init__(self,name,age)
#或者
#super(student, self).__init__(name=name,age=age)
self.grade=grade

#重写父类的方法
def speak(self):
print(“我要吃水果”)

class empleey(User):
def speak(self):
print(“我是北方佬”)

#多态
def killMan(uu):
uu.speak()

#测试结果
s=student(“huitao”,17,5)
s.speak()
killMan(s)

e=empleey(“huiju”,13)
killMan(e)
亲测,知识总结

python表情包爬虫

python表情包爬虫

 

 

文章目录

一、需要用到的模块

二、开始写代码

1.创建保存图片的文件夹

2.创建请求头

3.代码主体

4.创建循环

完整代码

一、需要用到的模块

import requests

import os

from bs4 import BeautifulSoup

 

还需要有一个 lxml库 但不需要导入

BeautifulSoup 在 beautifulsoup4 的包下

 

二、开始写代码

1.创建保存图片的文件夹

if not os.path.isdir(“./img/”): #如果当前目录下没有img文件夹

os.mkdir(“./img/”) #创建img文件夹

1

2

2.创建请求头

headers={

‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0′

}

 

那么为什么要创建请求头呢,因为在网站访问的过程中,有大部分网站会对当前请求做验证,来判断当前的请求是否合法(不是使用浏览器来获取网站数据的话会被认为非法请求)。如果不添加请求头的话,可能会出现当前网站没有访问权限。

 

提示:请求头的内容可用Burpsuite来抓取%title插图%num

 

 

3.代码主体

def pa(num):

url = ‘https://fabiaoqing.com/biaoqing/lists/page/’+str(num)+’.html’ #构造url

rp = requests.get(url,headers).text #请求url 用文本返回

soup = BeautifulSoup(rp,’lxml’) #构建soup

img_list = soup.find_all(‘img’,class_=’ui image lazy’) #筛选所有img标签 条件为class=xxx

for img in img_list:

img_url = img[‘data-original’] #获取这个属性的内容

img_title = img[‘title’]

print(img_url,img_title)

try:

with open(‘img/’+img_title + os.path.splitext(img_url)[-1],’wb’) as f: #图片文件

image = requests.get(img_url).content #请求img_url 以二进制返回

f.write(image)

except:

pass

 

4.创建循环

for i in range(1,201): #网站有多少页就设置多少

pa(i)

# 将每一页的图片都抓下来

 

 

%title插图%num

完整代码

import requests #请求模块

import os

from bs4 import BeautifulSoup #抓取网站内容

if not os.path.isdir(“./img/”):

os.mkdir(“./img/”)

headers={‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0′}

#创造头

def pa(num):

url = ‘https://fabiaoqing.com/biaoqing/lists/page/’+str(num)+’.html’ #构造url

rp = requests.get(url,headers).text #请求url 用文本返回

soup = BeautifulSoup(rp,’lxml’) #构建soup

img_list = soup.find_all(‘img’,class_=’ui image lazy’) #筛选所有img标签 条件为class=xxx

for img in img_list:

img_url = img[‘data-original’] #获取这个属性的内容

img_title = img[‘title’]

print(img_url,img_title)

try:

with open(‘img/’+img_title + os.path.splitext(img_url)[-1],’wb’) as f:

image = requests.get(img_url).content #请求img_url 以二进制返回

f.write(image)

except:

pass

for i in range(1,201):

pa(i)

 

 

多线程

多线程

多线程的简单应用–可用于网络爬虫爬取分段的视频文件

阻塞进程:等待子进程全部结束在运行主进程

__Author__ = ‘Jiudan’
import random
import threading
import time

# 模拟执行任务的函数
def run(n):
print(‘task {} 开始’.format(n))
time.sleep(2 + random.randint(1, 3)) # 模拟线程运行
print(‘task {} done 线程编号:{} 线程数量: {}’.format(n, threading.current_thread(), threading.active_count()))

t_ob = []
for i in range(1, 6): # 开启五个进程
t = threading.Thread(target=run, args=(‘a{}’.format(i),)) # 注意这里的函数运行方式及传参(元组形式)
t_ob.append(t) # 将线程加入到列表
t.start() # 启动线程

for t in t_ob:
t.join() # 阻塞进程,等待子进程全部结束才继续进行主进程

# 主线程
print(‘主线程: {} 结束 数量: {}’.format(threading.current_thread(), threading.active_count()))

守护进程:主线程结束即结束所有子进程

__Author__ = ‘Jiudan’
import random
import threading
import time

# 模拟执行任务的函数
def run(n):
print(‘task {} 开始’.format(n))
time.sleep(2 + random.randint(1, 3)) # 模拟线程运行
print(‘task {} done 线程编号:{} 线程数量: {}’.format(n, threading.current_thread(), threading.active_count()))

for i in range(1, 6): # 开启五个进程
t = threading.Thread(target=run, args=(‘a{}’.format(i),)) # 注意这里的函数运行方式及传参(元组形式)
t.setDaemon(True) # 守护线程,主进程结束即结束所有字进程
t.start() # 启动线程

# 主线程

GIL锁:防止数据同时被多个线程修改

__Author__ = ‘Jiudan’
import threading
import time
import random
num = 0

def run(n):
global num
# 模拟时长
time.sleep(random.randint(1, 3))
# 获取锁
Lock.acquire()
# 修改 num 的数据(意为未修改完成则不释放锁,在获取锁的同时,其他线程不能启动修改数据,以防止数据被两个线程同时修改)
num += 1
if num <= 50:
print(‘当前已修改为:{}’.format(num))
# 释放锁
Lock.release()
else:
print(‘当前进程 {} 未释放锁–其他线程不得执行–线程数量:{}’.format(threading.current_thread(), threading.active_count()))

# 创建锁的实例
Lock = threading.Lock()

for i in range(1, 101): # 开启100个进程
t = threading.Thread(target=run, args=(‘a{}’.format(i),))
t.start()

设置信号量

__Author__ = ‘Jiudan’

import random
import threading
import time

def run(n):
semaphore.acquire() # 获取锁
time.sleep(random.uniform(2, 4))
print(‘task {}’.format(n))
if n <= 50:
semaphore.release()

semaphore = threading.BoundedSemaphore(5) # 信号量,同时开启5个线程(线程结束即开启新的线程,保证时刻有五个线程在运行)
for i in range(1, 100): # 开启100个进程
t = threading.Thread(target=run, args=(i,))
t.start()