1.python解释器类型
1.cpython:c语言开发的
2.jpython:java语言开发的
3.Ironpython:.net语言开发
2.python中程序的组成
程序是有模块组成
模块中包含语句,函数,类等
语句包含表达式
表达式建立并处理数据对象并返回对象的引用关系
3.python中的数据类型
int float complex(1+2j相当于复数)布尔类型
4.python算术运算符和表达式
表达式:由数学和运算符组成
作用:让计算机做一些事并返回值
运算符:+ - * //地板除(除法取整) %取余 幂运算
5.数值类型函数
1.abs()返回一个数的绝对值
2.round(number,【ndigits】)
number:将要处理的数据
ndigits:保留小数点后几位小数
在python中如果一个函数的参数带有【】。代表这个参数可有可无,可以传参数也可以不传参数
3.pow(x,y,z=None)
xy%z
6.变量
1.概念
变量是关联一个对象的标识符
2.作用
用来绑定一个对象,并返回对象的引用关系,以便于以后重复使用
3.变量的命名规则
以字母或下划线开头,后接字母下划线或者数字
不能用python中的关键字作为变量名(大约有33个)
7.赋值语句
1.语法
变量名=表达式
2.类型
变量本身没有类型,他的类型是由绑定的对象决定的
3.说明
1.当变量不存在时,创建此变量,并与对象建立起关系联系
2.当变量存在时,改变变量于对象的绑定关系
4.注意
1.一个变量只能绑定一个变量
2.一个对象可以绑定多个变量
8.python中的小整数对象池
在cpython中,-5~256这个范围内的数字会永远的存在于内存地址当中,永远不会被释放
9.pycharm中的大整数对象池
pycharm的开发者为了节省内存,把同一个文件下的相同对象默认为是同一个对象
10.基本输出函数【print】
1.作用
将一系列的值按照字符的形式输出到标准输出设备上
2.语法
print(value,sep="",end="/n")
value 输出的内容
;sep代表输出内容之间的分隔符 默认
11,标准输入函数 [input]
1.作用:从标准输入设备上获取一系列的字符
2.语法:input(“提示字符串”)
3.返回类型:str字符串
注释用#。
12,类型转换函数
1.float():将字符串或数字转换为浮点型数
2.int():将字符串或数字转换为十进制整数型数
int([obj],base=10)
obj:将要处理的数据,base:代表obj数据的进制
比如:int(“11”,base=2),则返回3,
13,比较运算
1、语句 statement@H_502_1653@1、概念语句是python程序执行的最小单位2、说明多条语句写在一行内需要用(;)分隔,但是不建议这样写3、折行符【\】1、显示换行折行符【\】是告诉解释执行器,下一行的代码也是此语句的内容2、隐式换行所有括号内的内容换行时,解释执行器会自动去下一行找到相对应的括号,直到找到为止,>=,<,<=,==,!=
s=100+300+56+2345+10s1=100+300+56+\ 2345+10s2=(100+300+56+ 2345+10)print(s)print(s1)print(s2)
2、if条件判断语句@H_502_1653@1、作用让程序根据条件选择性的执行某条或者某些语句2、语法if 真值表达式1: 语句块1elif 真值表达式2: 语句块2elif 真值表达式3: 语句块3else: 语句块4
3、说明1、真值判断会自上而下进行,如果有一条真值表达式的值为True,则执行其中的语句,然后结束if语句的执行,如果所有的真值表达式的值都为False,那么则执行else语句中的语句块2、elif子句可以有1个,0个或者多个3、else子句只能有1个或者0个# n=int(input("请输入一个数字:"))# if n%2==0:# print(n,"是偶数!")# else:# print(n,"是奇数!")# n=int(input("请输入一个数字:"))# if n>0:# print(n,"是正数!")# if n<0:# print(n,"是负数!")# else:# print("n为0!")month=int(input("请输入月份数:"))if 1<=month<=12: # pass #占位符 if month<=3: print("春季!") elif month<=6: print("夏季!") elif month<=9: print("秋季!") else: print("冬季!")else: print("您输入的月份有误,请重新输入!")
if与elif的区别:如果程序中判断事件很多,全部用if的话,会遍历整个程序,如果用elif程序运行时,只要if或后续某个elif之一满足条件后,则程序执行完对应输入语句后就会结束程序(即不再去冗余的执行后续elif和else语句)提高效率练习分别写一个程序,输入学生的三科成绩,判断出最高成绩和最低成绩a=int(input("请输入第一科成绩:"))b=int(input("请输入第二科成绩:"))c = int(input("请输入第三科成绩:"))# 方法一# if c < a > b:# print(a,"是最高成绩!")# elif a<b>c:# print(b,"是最高成绩!")# else:# print(c,"是最高成绩!")# 方法二m=a # 假设a就是最高成绩if b>m: m=b #因为b比最高成绩还高,所以把b赋值给最高成绩的变量if c>m: m=cprint(m,"是最高成绩!")
3、字符串【str】@H_502_1653@1、作用用来记录文本信息2、表示方式用引号引起来的部分都叫做字符串@L_403_459@‘’ 单引号“” 双引号‘’’’’’ 三单引号“”"""" 三双引号3、引号说明单引号内的双引号不算结束符双引号内的单引号不算结束符>>> s='hello world'>>> type(s)<class 'str'>>>> s'hello world'>>> s="hello world">>> s'hello world'>>> s='I'm a student' file "<stdin>", line 1 s='I'm a student' ^SyntaxError: invalID Syntax>>> s="I'm a student">>> s"I'm a student"
三引号的作用:三引号内可以包含单引号和双引号三引号字符串中的换行符会自动转换为\n三引号一般用来表示函数或者类的文档字符串>>> s="""hello world... my name is xx... """>>> s'hello world\nmy name is xx\n'>>> print(s)hello worldmy name is xx
4、转义字符用转义字符代表特殊的字符字符串字面值中 用字符串\后接一些字符代表一个特殊的字符串s='I\'m a student' #用\'代表一个‘
常见转义字符符号 | 描述 | 符号 | 描述 |
---|---|---|---|
\’ | 代表一个单引号 | \" | 代表一个双引号 |
\n | 代表一个换行符 | \ | 代表一个\ |
\r | 返回光标至行首 | \t | 水平制表符(Tab) |
>>> s="C:\newfile\test.py">>> print(s)C:ewfile est.py>>> s=r"C:\newfile\test.py">>> print(s)C:\newfile\test.py>>>
6、字符串的运算1、符号+ 加号运算用于拼接字符串+= 运算符用于原字符串与右侧字符串进行拼接生成新的字符串* 用于生成重复的字符串*= 生成重复的字符串并让原变量绑定生成后的字符串7、字符串的比较运算1、符号> >= < <= == !=2、比较规则根据字符对应的Unicode编码值进行比较Unicode编码叫做万国码 655353、函数chr() 返回Unicode编码所对应的字符ord() 返回一个字符所对应的Unicode编码>>> ord("徐")24464>>> ord("a")97>>> ord("A")65>>>>>> chr(24464)'徐'>>> chr(55555)'\ud903'>>> chr(46783)'뚿'>>>>>> "a">"A"True>>> "ABC">"abc"False>>> "ABC" > "Abc"False>>> "ABC" >"ABCD"False>>>
8、字符串的索引【index】1、作用序列都可以通过索引来访问序列中的元素或对象2、语法字符串[整数表达式]3、说明正向索引是从0开始,第二个索引为1,以此类推,最后一个元素的索引为字符串的长度-1反向索引是从-1开始,最后一个元素的索引为-1,倒数第二个为-1,以此类推,第一个元素的索引为字符串长度的相反数@L_227_502@A B C D E F G0 1 2 3 4 5 6-7 -6 -5 -4 -3 -2 -1练习:输入任意一段字符串,打印出这个字符串的第一个字符,最后一个字符如果这个字符串的长度为偶数,打印出一个@符号,如果这个字符串的长度为奇数,打印出中间的字符len() 返回一个序列的长度s=input("请输入一段字符串:")print(s[0])print(s[-1])if len(s)%2==0: print("@")else: mID_index=len(s)//2 #求出中间字符所对应的索引 print(s[mID_index])
9、字符串的切片【slice】1、作用从字符串中取出连续或具有一定间隔的元素2、语法字符串[开始索引:终止索引:步长]3、参数1、开始索引:切片切下的位置,0代表第一个元素,1代表第二个元素2、结束索引:切片的终止点,但不包含终止点3、步长:切片每次获取完当前元素后移动的方向和偏移量,没有步长相当于取值完成后,向右移动一个索引的位置(默认为1)当步长为正数时,取正向切片当步长为负数时,取反向切片当一个字符串的切片含有步长时,等于切完当前元素后,用当前元素的索引加上步长,得到一个新的索引,获取新的索引所对应的元素当一个字符串切片的步长为负数时,起始索引所对应的元素必须在终止索引所对应元素的右边,才可以进行反向切片A B C D E F G0 1 2 3 4 5 6-7 -6 -5 -4 -3 -2 -1>>> s[0:3]'ABC'>>> s[1:5]'BCDE'>>> s[1:-1]'BCDEF'>>> s[0:-1:2]'ACE'>>> s[-1:0:-2]'GEC'>>>>>> s[0:-1:-2]
练习:输入一段字符串,判断这个字符串是不是回文ABCBA上海自来水来自海上4、格式化字符串@H_502_1653@1、作用生成一定格式的字符串2、语法格式化字符串%参数值格式化字符串%(参数值1,参数值2)fmt="姓名:%s,年龄:%d"name="小明"age=20print(fmt%(name,age))
符号 | 描述 |
---|---|
%s | 字符串占位符 |
%d | 十进制整数占位符 |
%f | 十进制浮点数占位符 |
>>> a123>>> "%d"%123'123'>>> "%10d"%123' 123'>>> "%-10d"%123'123 '>>> "%-+10d"%123'+123 '>>> "%0+10d"%123'+000000123'>>> "%f"%123.456'123.456000'>>> "%.2f"%123.456'123.46'>>> "%2f"%123.456'123.456000'>>> "%f"%123.4567891'123.456789'>>> "%.7f"%123.4567891'123.4567891'>>>
5、while循环@H_502_1653@1、作用让程序根据条件重复的执行一条语句或者多条语句2、语法初始条件while 真值表达式: 语句块1 条件变化量else: 语句块2
3、流程1、先定义一个初始条件2、先判断真值表达式,测试布尔值为True还是False3、如果真值表达式为True,则执行语句块1,再回到第二步,判断真值表达式4、如果真值表达式为False,则执行语句块2,然后结束while语句的执行i=1 #用来记录循环次数的变量while i<=10: print("hello world") i+=1
4、注意1、要控制循环的真值表达式的值来防止死循环2、通常用真值表达式中的循环变量来控制循环条件3、通常在循环语句块内部需要改变循环变量来控制循环的次数和变量的走向6、while循环的嵌套@H_502_1653@while语句本身就是复合语句,他可以嵌套到另一个语句当中1、语法while 真值表达式1: 语句块1 while 真值表达式2: 语句块2 else: 语句块3else: 语句块4
打1~20范围内的所有整数,显示在一行内,每个整数用一个空格分隔打印10行这个数据j=1while j<=10: i=1 while i<=20: print(i,end=" ") i+=1 else: print() #打印一个换行符 j+=1
7、break语句@H_502_1653@1、作用用于循环语句while for循环中,用来终止当前循环语句的执行2、说明1、当break语句执行后,此循环语句break语句之后的所有语句都将不再执行2、break语句通常和if语句组合使用3、break语句终止循环时,循环语句的else子句将不会执行4、break语句只能终止当前循环的执行,如果有循环嵌套时,不会跳出嵌套的外层循环5、break语句只能在循环语句内部使用i=1while i<10: print("循环开始时的i=",i) if i==5: break print("循环结束时的i=",i) i+=1else: print("else语句被执行!")print("程序退出时的i=",i)
练习:输入一个正整数,打印这个数是不是素数n=int(input("请输入一个正整数:"))if n<=1: print("不是素数!")elif n==2: print(n,"是素数!")else: i=2 while i<n: if n%i==0: print("不是素数") break i+=1 else: print("是素数!")
8、for循环@H_502_1653@1、作用用来遍历可迭代对象中的数据元素2、语法for 变量 in 可迭代对象: 语句块1else: 语句块2
3、可迭代对象是指能够依次获取数据的对象,包括非空字符串,非空列表,非空字典、元组等4、说明1、变量依次用可迭代对象每次给出的元素依次赋值,然后执行语句块12、可迭代对象不能提供数据元素后,执行else子句中的语句部分,然后退出循环3、else子句部分可以省略s="ABCDEF"for i in s: print(i,end=" ") print()else: print("循环因迭代结束而终止!")
练习:写一个程序,输入一段字符串,打印出这个字符串中有多少个空格s=input("请输入一个字符串:")count=0 #用来统计空格个数的变量# i=0# lenth=len(s)# while i<lenth:# if s[i]==" ":# count+=1# i+=1# print("输入的空格个数为%d个"%count)for i in s: if i==" ": count+=1print("输入的空格个数为%d个"%count)
9、for循环的嵌套@H_502_1653@for x in "ABC": for y in "123": print(x+y)
10、range函数@H_502_1653@1、作用用来创建一个生成一系列整数的可迭代对象(也叫作整数序列生成器)range(stop)从0开始,每次生成一个整数后加1 *** 作,直到stop为止range(start,stop,step)从start开始,每次生成一个整数后移动step,直到stop为止for i in range(10): print(i,end=" ")print()for i in range(1,20,2): print(i,end=" ")
11、continue语句@H_502_1653@1、作用用于循环语句中,不再执行本次循环内continue之后的语句,重新开始一次新的循环2、说明1、在while循环中执行continue语句,将会直接跳转到while语句的真值表达式处重新判断循环条件2、在for循环中执行continue语句,将会从可迭代对象中取下一个元素,绑定变量后再次进行循环for i in range(5): if i==2: continue print(i)
12、random随机模块@H_502_1653@1、random.random()用于生成一个0到1范围内的随机浮点数2、random.randint(a,b)用于生成一个指定范围内的整数,其中a是下限,b是上限3、random.randrange(start,stop,step)从指定范围内,按照指定基数递增的集合中获取一个随机数import randoma=random.random()print(a)b=random.randint(1,100)print(b)c=random.randrange(1,100,2)print(c)
13、列表【@R_403_6818@】@H_502_1653@1、作用用来存储任意类型数据的容器2、概念1、列表是一种容器,可以存储任意类型的数据2、列表是可变序列3、元素与元素之间没有任何的关联关系,他们之间具有先后顺序关系3、表示方式[]4、列表的运算+ 用于拼接列表,生成新的列表,内存地址会发生变化+= 用于原列表与右侧列表进行拼接,并用该变量重新绑定新列表,内存地址不会改变* 生成重复列表,生成新的列表,内存地址会发生变化*= 用于生成重复列表,并用该变量重新绑定新列表,内存地址不会变化>>> L=[100,200,300,400]>>> ID(L)1883498866184>>> L=L+[500,600]>>> L[100, 200, 300, 400, 500, 600]>>> ID(L)1883498866824>>> L=[100,200,300,400]>>> ID(L)1883498866184>>> L+=[500,500]>>> L[100, 200, 300, 400, 500, 500]>>> ID(L)1883498866184>>>>>> s="abc">>> ID(s)1883497905432>>> s=s+"de">>> s'abcde'>>> ID(s)1883498848184>>> s="abc">>> ID(s)1883497905432>>> s+="de">>> s'abcde'>>> ID(s)1883498848128>>>
5、列表的比较运算1、符号> >= < <= == !=2、规则根据列表对应位置上字符(数据类型必须相同)的Unicode编码值比较大小3、in not in运算符判断一个对象是否存在于序列当中6、列表的索引与切片列表的索引与切片规则同字符串中的规则完全相同7、列表的索引赋值列表是可变序列,可以通过索引赋值来改变列表中的元素>>> L=[100,200,300]>>> L[0]="hello">>> L['hello', 200, 300]>>>
8、列表的切片赋值1、作用可以改变原列表的排序,可以插入和修改数据可以用切片来改变列表对应元素的值2、语法列表[切片]=可迭代对象>>> L=[100,200,300,400,500,600]>>> L[0:1][100]>>> L[0:1]=["A"]>>> L['A', 200, 300, 400, 500, 600]>>> L[0:1]=["A","B"]>>> L['A', 'B', 200, 300, 400, 500, 600]>>>>>> L[0:3]['A', 'B', 200]>>> L[0:5:2]['A', 200, 400]>>> L[0:5:2]=["hello","world","name"]>>> L['hello', 'B', 'world', 300, 'name', 500, 600]>>> L[0:5:2]=["hello","world","name",100]Traceback (most recent call last): file "<stdin>", line 1, in <module>ValueError: attempt to assign sequence of size 4 to extended slice of size 3>>> L[0:5:2]=["hello","world","name",]>>> L['hello', 'B', 'world', 300, 'name', 500, 600]>>>>>> L[0:0][]>>> L[0:0]=[1000]>>> L[1000, 'hello', 'B', 'world', 300, 'name', 500, 600]
append()方法向列表末尾追加一个元素L.append()@L_502_635@14、字典【dict】@H_502_1653@1、概念1、字典是一种可变的容器,可以存储任意类型的数据2、字典中每个数据都用键(key)值(value)对进行映射存储3、字典中的每个数据都是用键进行索引,而不是用下标进行索引4、字典中的键不能重复,且只可以用不可变类型作为字典的键5、字典的数据没有先后顺序关系,字典的存储是无序的2、作用可以提高数据的检索速度3、表示方式用{}括起来,以逗号分隔每个键值对,键和值之间:分隔>>> d={}>>> d{}>>> type(d)<class 'dict'>>>> d={"name":"小明","age":20}>>> d{'name': '小明', 'age': 20}>>>
4、字典的索引1、语法dict[key]>>> d["name"]'小明'>>> d["age"]20>>>
5、字典的基本 *** 作1、增加键值对dict[key]=value2、修改键值对dict[key]=value3、删除键值对del dict[key]6、in not 运算符判断一个键是否存在于字典当中15、元组【tuple】@H_502_1653@1、概念元组是不可变的序列元组是可以存放任意数据类型的容器,他们之间具有先后顺序关系2、表示方式用()括起来,单个元素括起来后加逗号,区分是单个对象还是元组>>> t=(100,200)>>> t(100, 200)>>> type(t)<class 'tuple'>>>> t=(100)>>> t100>>> type(t)<class 'int'>>>> t=(100,)>>> t(100,)>>> type(t)<class 'tuple'>
3、元组的运算+ += * *= < <= > >= == != in not in规则同列表的运算规则 (数据类型相同才可以进行运算)4、元组的索引与切片元组的索引与切片规则等同于字符串的索引与切片规则,不具备切片和索引赋值功能16、字符串文本解析函数@H_502_1653@1、split()拆分字符串,通过制定的分隔符对字符串进行切片,返回分割后的字符串列表S.split()>>> s="www.baIDu.com">>> s.split(".")['www', 'baIDu', 'com']>>>
2、join()S.join(iterable)用可迭代对象中的字符串,返回一个中间用S分隔的字符串>>> L="hello">>> "-".join(L)'h-e-l-l-o'>>> " ".join(L)'h e l l o'>>>
17、函数@H_502_1653@1、概念函数是可以重复的语句块函数可以视为一段程序语句的集合,并且给予一个名称来代替2、作用可以重复使用,提高代码的重用性3、语法def 函数名(参数列表[形参]): 语句块
4、说明1、函数名必须是标识符,符合变量的命名规则2、函数有自己的名字空间,要让函数处理外部数据,通过参数列表对次函数传入一些数据,如果不需要传入参数,则参数列表可以为空,但是语句部分不能为空,需要用pass语句填充3、函数名是一个变量,不能轻易对其赋值def say_demo(): print("hello world") print("wlecome to Hangzhou") print("xxx")say_demo() #函数的调用
5、函数的调用1、函数的调用是一个表达式2、如果没有return语句,此函数执行完毕后返回None对象3、如果函数需要返回其他的对象则要使用return语句6、return语句1、语法return [表达式]2、作用用于函数中,结束当前函数的执行,返回到调用该函数的地方,同时返回一个指对象的引用关系3、说明1、return语句后的表达式可以省略,省略后相当于return None2、如果函数内没有return语句,则函数执行完最后一条语句后返回None,相当于在最后加了一条 return None语句day3
1,函数的实参传递方式
1.位置传参
实参和形参的对应关系是按照位置来依次对应的
def func(a,b,c):
print(“a”,a)
print(“b”,b)
print(“c”,c)
func(100,200,300) 2.序列传参 序列传参是指函数调用过程中,用*将序列拆解后,按照位置传参的方式进行参数传递 def func(a,b,c): print("a",a) print("b",b) print("c",c) L【100,200,300】 func(*L) 3.关键字传参 传参时,形参和实参按照名称进行匹配 def func(a,b,c): print("a",a) print("b",b) print("c",c) func(a=100,b=200,c=300) 4.字典关键字传参 是指当实参为字典时,用**将字典拆解后,按照关键字传参的方式进行传参 def func(a,b,c): print("a",a) print("b",b) print("c",c) d=("a":100,"b":200,"c":300) func(**d)2,函数的缺省参数 1.语法 def 函数名(形参名1=默认值,。。。): pass 缺省参数必须自右至左依次存在,如果有一个参数为缺省参数,那么其右侧的所有参数都必须为缺省参数3,函数的形参的定义方式 1.位置形参 按照形参的位置接受实参 2.星号元组形参 def 函数名(*args): print("实参个数为",len(args)) print("args",args) 3.命名关键字形参 1.语法 def func(*,命名关键字形参) pass def func(*args,命名关键字形参) pass 2.作用 所有的命名关键字形参必须用关键字传参或者字典关键字进行传参 def func(**kwargs): print("关键字参数个数为:",len(kwar gs)) print("kwar gs=",kwar gs) func(a=100,b=200,c="300") 函数参数自左向右的顺序: 位置形参 星号元组形参 命名关键字形参 双星号关键字形参 4.双星号字典形参 1.语法 def func(**kwargs) pass 2.作用 收集多余的关键字传参 def func(**kwargs): print("关键字参数个数为:",len(kwar gs)) print("kwar gs=",kwar gs) func(a=100,b=200,c="300") 函数参数自左向右的顺序: 位置形参 星号元组形参 命名关键字形参 双星号关键字形参 4,函数变量问题 1.局部变量 定义在函数内部的变量称为局部变量(函数的形参也是局部变量) 局部变量只能在函数的内部使用 局部变量在函数调用时被创建,在函数调用之后自动销毁 2.全局变量 定义在函数外部,模块内部(当前.py)的变量称为全局变量 全局变量,所有函数都可以直接访问(但函数内部不能将其直接赋值) 局部变量的说明 1.在函数内首次对变量赋值时创建局部变量,再次为变量赋值时修改局部变量的绑定关系 2.在函数内部的赋值语句不会对全局变量造成影响 3.局部变量只能在被声明的函数内部访问,而全局变量可以在整个模块(当前文件)范围内访问 注意:cpython中解释执行器会把运算符左侧的变量默认为局部变量 5,面向对象编程 1.对象 现实生活中的物体或者实例 2.面向对象编程 把一切看成对象,对象和对象之间用行为建立起关系联系 对象可以有属性【名词】 对象可以有行为【动词】 3.类【class】 拥有相同属性和行为的对象分为一组,即为一个类型 类是用来描述对象的工具,类可以创建此类的对象(实例) 类定义了该集合中每个对象所共有的属性和方法 4.语法 class 类名(继承列表): """类的文档字符串""" 实例方法 类变量 类方法 静态方法 5.作用 1.可以创建一个或多个对象(实例) 2.类内定义的变量和方法都能被此类创建的实例所拥有 6.说明 1.类名必须是标识符(和变量的命名规则相同)建议首字母大写 2.类名实质上就是变量,它绑定一个类实例 class Car(): """此类是个汽车类""" print("汽车工厂创建完成!") def __init__(self,color) self.colro=color def run(self,speed): //self代表类产生的实例 """用来给实例添加行驶的行为的方法""" self.speed = speed //给实例添加上速度的属性 print("汽车正在以",self.speed,"的速度行驶!")
def Loge(self,loge ):
self.loge=loge
print(“汽车的品牌”,self.loge)
car=Car()
car.run(100)
car.Loge(奔驰)
7.类的实例化(类的调用)
1.语法
变量=类名([创建参数列表])
2.作用
创建这个类的实例对象,并返回此实例对象的引用关系
3.说明
实例用自己的作用域和名字空间,可以为该实例田间实例变量(属性),实例可以调用类中的方法,访问类中的类变量
添加属性:car.color=黑色
8.类的实例方法 1.语法 class 类名(): def 实例方法名(self,参数1,参数2.。。): pass 2.作用 用于描述一个对象的行为,让此类的全部对象都可以拥有此行为 3.说明 1.实例方法本质是函数,定义在类内的函数 2.实例方法的第一个参数代表调用这个方法的实例,一般用self表示 3.实例方法属性类的属性 9.实例方法的调用 实例.实例方法名(参数列表) 类名.实例方法名(实例,调用参数) 10.类的构造函数(初始化函数) 1.语法 class 类名(): def __init__(self,参数列表): pass 2.作用 1.init方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建这个类的实例时会自动的调用该方法 2.self代表类的实例,在定义时是必须存在的,虽然不必传入相应的参数 3.如果像个自己创建的类添加形参,就需要用到构造函数 4.作用:对新创建的对象添加属性等必须的资源 11.继承 1.概念 1.继承:继承是延续旧类的功能 2.派生:在旧类的基础上添加新的功能 2.作用 1.用继承与派生机制,可以将一些共有功能加在基类 2.在不改变父类代码的基础上改变原有类的功能,实现代码共享 12.python中的文件 *** 作 文件是用来数据存储的基本单位,通常用于长期存储数据 1.文件的 *** 作步骤 1.打开文件 2.读写文件 3.关闭文件 2. *** 作格式 1,语法 open(filename,mod,[enCoding]) filename文件的路径或者名称 mod文件的 *** 作模式 enCoding文件的编码格式 2.说明 打开一个文件,返回文件流对象,如果打开失败则触发ioError错误 3.关闭文件的方法 f.close() 1-1.mod参数设置 r:以只读方式打开 w:.........覆盖写入//写是具备自己创造文件的功能 a:以只写方式打开,如果源文件有内容,则追加写入 b:以二进制模式打开文件 wb:以二进制写模式打开文件 rb:以二进制读模式打开文件 t:以文本模式打开文件 4.文本的读取和写入(要自己写换行符) 1.文本的写入 1.f.write(字符串):写字符串到一个已经打开的文件 2.fwritelines(字符串列表):写多个字符串到一个已经打开的文件 2.文本的读取 1.f.readline() 读取一行文字 2.f.readlines() 读取多行文字 3.f.read(n) 读取N个字符 5.with语句 1.语法 with 表达式 as 变量 pass7,Python爬虫 1.web回顾 url:统一资源定位符 http:80 https:443 get获取显示在url里 post获取比较安全8,爬虫请求模块 1.分类 1.python2中:urllib2 urllib3 2.python3中:urllib.request requests 2.常用方法 1.urllib.request.urlopen(url) 作用:向网站发起请求并获取响应 格式:字节流=res.read()//获取 字符串 res.read().decode("utf-8")//解码 2.req=urllib.request.Request(url,headers) 作用:创建一个请求对象,去向网站发起请求并获取响应 使用流程: 1.req=urllib.request.Request(url,headers) 创建请求对象 2.res=urllib.request.urlopen(req) 向网站发起请求 3.HTML=res.read().decode("utf-8") 解码9,url编码模块 https://www.baIDu.com/s?wd=%E8%94%A1%E5%BE%90%E5%9D%A4 1.模块名 urllib.parse:url编码模块 2.编码方法 urlencode 1.语法 urllib.parse.urlencode({字典}) //import urllib.parse //key={"wd":"叶震源"} //data=urllib.parse.urlencode(key) #对数据进行编码 //print(data) 3.quote方法——编码 //import urllib.parse //data=urllib.parse.quote("源") //print(data) 4.unquote方法——解码 //import urllib.parse //data=urllib.parse.unquote("%E6%BA%90") //print(data) 1
项目一
写一个小型爬虫,当程序运行起来时,在终端输入任意一个关键词,通过百度查询函数,获取查询后网页的源代码。
1.先获取查询的信息
2.对查询信息进行url编码
3.对真是的url进行拼接
4.通过真实的url进行访问,得到相应的对象
5.对相应对象进行转码。并保存到本地
/*import urllib.request
import urllib.parse
headers={"User-Agent":"Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"} base_url="https://www.baIDu.com/s?" #网页的默认url key=input("请输入您要查询的信息:") key=urllib.parse.urlencode({"wd":key}) #对数据进行url编码 url=base_url+key #拼接得到真实的url req=urllib.request.Request(url,headers=headers) #创建请求对象 res=urllib.request.urlopen(req) #向网站发起请求 HTML=res.read().decode("utf-8") with open("百度.HTML","w",enCoding="utf-8") as f: f.write(HTML) print("文件写入成功!")*/
项目二
写一个爬虫程序,当程序运行时,输入指定的贴吧名称,可以进入任意一个贴吧内,爬取这个贴吧内指定范围页数的源代码(用面向对象编程)
import urllib.requestimport urllib.parseclass URL(): def __init__(self): self.base_url= "https://tIEba.baIDu.com/f?" self.headers= {"User-Agent": "Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"} def get_HTML(self,url,filename): #获取网页源代码的函数 req=urllib.request.Request(url,headers=self.headers) res=urllib.request.urlopen(req) HTML=res.read().decode("utf-8") self.save_HTML(HTML,filename) def get_page(self): name=input("请输入查询的贴吧名称:") begin=int(input("请输入爬取初始页码:")) end=int(input("请输入爬取终止页码:")) for i in range(begin,end): key= urllib.parse.urlencode({"kw":name})#对输入的贴吧名称编码 pn=(i-1)*50 #得出控制页码数的参数 url=self.base_url+key+"&pn"+str(pn) #拼接得到的真实url filename="第"+str(i)+"页.HTML"#给文件创建名称 self.get_HTML(url,filename) #调用上层函数获取源代码 def save_HTML(self,HTML,filename): with open(filename,"w",enCoding="utf-8") as f: f.write(HTML) print("数据保存成功")tIEba=URL()tIEba.get_page()
1、解析模块@H_502_1653@1、数据的分类1、结构化数据特点:固定格式 HTML Json xml2、非结构化数据图片 视频 音频 一般存储为二进制2、正则表达式模块 re@H_502_1653@1、正则表达式中的元字符元字符 | 作用 |
---|---|
. | 匹配任意一个字符(不包括换行\n) |
\d | 匹配任意数字 |
\s | 匹配任意空白字符 |
\S | 匹配任意非空白字符 |
\n | 匹配一个换行符 |
\w | 匹配字母、数字以及下划线 |
\W | 匹配不是字母、数字、下划线 |
* | 匹配0个或多个表达式 |
+ | 匹配出现一次或n次 |
? | 匹配1个或0个前面的正则表达式定义的片段(非贪婪) |
{m} | 精确匹配m个前面的表达式 |
^ | 匹配一行字符串的开头 |
$ | 匹配一行字符串的结尾 |
() | 匹配括号里的表达式,也表示一个组 |
import recontent="Hello 123 4567 cxk_ji ni tai mei"result=re.match("^Hello\s\d\d\d\s\d{4}\s\w{3}",content)print(result.group())print(result.span())
3、匹配目标想从字符串中获取一部分指定的内容,可以用括号将想提取的数据用括号括起来。括号实际上标记了一个子表达式的开始和结束索引,被标记的每个子表达式会依次对应一个分组,调用group方法传入分组的索引即可提取结果import recontent="Hello 123 4567 cxk_ji ni tai mei"result=re.match("^Hello\s(\d\d\d\s\d{4})\s(\w{3})",content)print(result.group(1))print(result.group(2))print(result.span())
4、通用匹配有一个万能匹配可以使用就是.*,其中(.)可以匹配任意字符串(除换行符外),星号代表匹配前面的字符无限次,所以他们组合在一起就是匹配任意字符import recontent="Hello 123 4567 cxk_ji ni tai mei"result=re.match("^Hello.*$",content)print(result.group())print(result.span())
5、贪婪匹配与非贪婪匹配1、贪婪匹配(.*):在整个表达式匹配成功的前提下,尽可能多的匹配import recontent="Hello 1234567 cxk_ji ni tai mei"result=re.match("^Hello.*(\d+).*$",content) #贪婪匹配 得到的结果只有7print(result.group(1))print(result.span())
2、非贪婪匹配(.*?):在整个表达式匹配成功的前提下,尽可能少的匹配import recontent="Hello 1234567 cxk_ji ni tai mei"result=re.match("^Hello.*?(\d+).*$",content) #非贪婪匹配 得到的结果只有1234567print(result.group(1))print(result.span())
6、修饰符正则表达式可以包含一些可选标志修饰符来控制匹配的模式,修饰符被指定为一个可选标志import recontent="""Hello 1234567 cxk_ji ni tai mei"""result=re.match("^Hello.*$",content,re.S) #贪婪匹配 得到的结果只有7 re.S代表可以匹配换行符print(result.group())print(result.span())
常见修饰符修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别匹配 |
re.M | 多行匹配 |
re.S | 可以匹配换行符 |
re.U | 根据Unicode字符集解析字符 |
re.X | 该标志通过给予你更灵活的格式以便于你正则表达式写的更易于理解 |
import recontent="""Hello 1234567 cxk_ji ni tai mei"""result=re.search("cxk.*$",content,re.S) print(result.group())print(result.span())
8、findall()如果想要获取匹配正则表达式的所有文本内容,就需要用到findall(),该方法会搜索整个字符串,然后返回匹配正则表达式的所有内容sub()可以使用正则表达式来修改文本string="12dskjdskj34kdslkds56lkds78"content=re.sub("\d+","",string) #去掉所有的数字,第二个参数为替换的字符串print(content)
9、compile()可以将正则表达式字符串变异成正则表达式对象,以便于在后面的匹配中重复使用string1="2019-7-7 10:48"string2="2019-7-8 11:48"string3="2019-7-9 12:48"pattern=re.compile("\d{2}:\d{2}") #把正则表达式编译为一个对象result1=re.sub(pattern,"",string1)result2=re.sub(pattern,"",string2)result3=re.sub(pattern,"",string3)print(result1)print(result2)print(result3)
@L_502_735@3、csv模块@H_502_1653@1、导入模块import csv2、打开csv文件with open(“xx.csv”,“w”,newline="",enCoding=“utf-8”) as f:newline=""必须添加,否则会多出空行3、初始化写入对象witer=csv.writer(f)4、写入数据writer.writerow([列表])import csvwith open("demo.csv","w",newline="",enCoding="utf-8") as f: writer=csv.writer(f) #初始化写入对象 L=["小明",20,"男"] L1=["小红",30,"女"] writer.writerow(L) #写入数据 writer.writerow(L1)
4、猫眼电影项目@H_502_1653@提取电影信息的正则表达式:'<div >.*?title="(.*?)".*?>(.*?)</p>.*?>(.*?)</p>',re.S
编写一个爬虫程序,可以爬取所有排行榜电影的名称,主演,上映时间,并且存储到excel表格当中,存储到本地1、拼接每页的url信息2、编写获取网页源代码的函数3、编写从网页源代码中解析有用数据的函数4、编写将数据写入到本地csv文件的函数5、模块安装@H_502_1653@python -m pip install requestspython -m pip install bs4python -m pip install lxml6、requests模块@H_502_1653@1、常用方法1、res=requests.get(url,headers=)向网站发起请求并获取响应对象2、响应对应的属性(res)1、res.text 从字节流变为字符串2、res.enCoding=“utf-8”3、res.content 二进制字节流(下载图片音频视频时需要使用)4、res.status_code 返回http响应码5、res.url 返回实际数据的urlimport requestsurl="https://www.baIDu.com/"headers={"User-Agent":"Mozilla/5.0 (windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"}res=requests.get(url,headers=headers)res.enCoding="utf-8"print(res.text)print(res.url) #返回实际数据的URL地址print(res.status_code) #返回http响应码print(res.content) #获取内容 bytes
6、url编码参数(params)params:字典res=requests.get(url,params={},headers=)自动对params进行url编码,然后和url进行拼接{"Accept": "text/HTML,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3","Accept-EnCoding": "gzip, deflate","Accept-Language": "zh-CN,zh;q=0.9","Cache-Control": "max-age=0","Connection": "keep-alive","cookie": "anonymID=jxsj5fy78nj65k; depovince=ZJ; _r01_=1; jebe_key=dacc7a51-8acd-46aa-ac34-9b0dcd0bf180%7C712e620fada2a7904696ec0f971e40cd%7C1562478178258%7C1%7C1562478176757; JsESSIONID=abcU3TNteZ-K-7OYbFlVw; ick_login=0feb451a-fdc7-4f21-9739-70aa6b149596; loginfrom=null; wp_fold=0; jebe_key=dacc7a51-8acd-46aa-ac34-9b0dcd0bf180%7C20431d0d28353673afdf82da213cc1fa%7C1562487391831%7C1%7C1562487390408; t=60525e04b0d5fb0611a37d12e64779fe7; socIEtyguester=60525e04b0d5fb0611a37d12e64779fe7; ID=964833547; xnsID=347dad61; jebecookies=5da84bdc-7000-4f30-8e5c-10fcff9ae57a|||||","Host": "www.renren.com","upgrade-insecure-requests":"1" ,"User-Agent": "Mozilla/5.0 (windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"}
7、BeautifulSoup解析器@H_502_1653@1、节点选择器HTML = """<HTML><head><Title>The Dormouse's story</Title></head><body><p name="dromouse"><b>The Dormouse's story</b></p><p >Once upon a time there were three little sisters; and their names were<a href="http://example.com/elsIE" ID="link1"><!-- ElsIE --></a>,<a href="http://example.com/lacIE" ID="link2">LacIE</a> and<a href="http://example.com/tillIE" ID="link3">TillIE</a>;and they lived at the bottom of a well.</p><p >...</p>"""from bs4 import BeautifulSoupsoup=BeautifulSoup(HTML,"lxml")print(soup.Title)print(soup.head)print(soup.p.string)print(type(soup.p))
2、获取属性print(soup.p.attrs["name"])print(soup.p.attrs)print(soup.p["name"])
3、嵌套选择print(soup.head.Title.string)
4、方法选择器1、find_all()查询所有符合条件的元素,给他传入一些属性或文本,就可以得到所有符合条件的元素HTML="""<div > <div > <h4>Hello</h4> </div> <div > <ul ID="@R_403_6818@-1"> <li >Foo</li> <li >bar</li> <li >Jay</li> </ul> <ul ID="@R_403_6818@-2"> <li >Foo</li> <li >bar</li> </ul> </div></div>"""from bs4 import BeautifulSoupsoup=BeautifulSoup(HTML,"lxml")# print(soup.find_all(name="ul")) #按照节点名称进行查找# print(type(soup.find_all(name="ul")[1])) #返回类型都是bs4.element.Tag 都是可迭代对象for i in soup.find_all(name="ul"): for li in i.find_all(name="li"): print(li.string)
5、attrs除了根据节点名称查询外,我们也可以出入一些属性来查询print(soup.find_all(attrs={"ID":"@R_403_6818@-1"}))print(soup.find_all(ID="@R_403_6818@-1"))print(soup.find_all(class_="element"))print(soup.find_all("ul",class_="@R_403_6818@ @R_403_6818@-small"))
6、texttext可以匹配节点的文本,传入的形式可以是字符串,也可以是正则表达式print(soup.find_all(text=re.compile("Hello")))print(soup.find_all(text="Hello"))
7、find()返回匹配到的第一个元素print(soup.find(name="ul"))
8、css选择器使用css选择器时,需要调用select()方法,传入相应的css选择器css选择器中ID名前用 #表示CSS选择其中类名前用 . 表示print(soup.select(".panel .panel-heading"))print(soup.select("ul li")) #查找 ul下 li的节点信息print(soup.select("#@R_403_6818@-2 .element"))#查找ID为@R_403_6818@-2下的class=element的节点信息print(soup.select("div > ul > li"))#查找 div下面的ul标签下面的li的节点信息
嵌套选择for ul in soup.select("ul"): print(ul["ID"]) print(ul.attrs["ID"])
获取文本for li in soup.select("li"): print("get_text:",li.get_text()) print("string:",li.string) print("text:",li.text)
需要安装的模块python -m pip install jIEbapython -m pip install wordcloudpython -m pip install matplotlibpython -m pip install imageio我想等 等等 等过的那辆车项目3、爬取豆瓣网任意一部电影的短评存入到本的txt文本中@H_502_1653@import requestsfrom bs4 import BeautifulSoupclass Douban(): def __init__(self): self.baseurl="https://movIE.douban.com/subject/30171425/comments?start=" self.headers ={"User-Agent": "Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"} self.star=0 def get_HTML(self,url): HTML=requests.get(url,headers=self.headers).text self.get_comment(HTML) def get_comment(self,HTML): comment_@R_403_6818@=[]#保存处理之后的评论列表 soup=BeautifulSoup(HTML,"lxml") comment=soup.select(".comment p") # comment=soup.find_all("span",class_="short") for i in comment: comment_@[email protected](i.text) self.save_comment(comment_@R_403_6818@) def save_comment(self,comment_@R_403_6818@): with open("comment.txt","w",enCoding="utf-8") as f: f.writelines(comment_@R_403_6818@) print("信息存储完成!") def get_page(self): begin=int(input("输入爬取起始页")) end=int(input("输入爬取终止页")) for page in range(begin,end+1): self.star=(page-1)*10 url=self.baseurl+str(self.star) self.get_HTML(url)#调用上层函数获取网页源代码douban=Douban()douban.get_page()
项目4、爬取www.gushiwen.org中的第一页的古诗词信息,并保存到本地@H_502_1653@import requestsfrom bs4 import BeautifulSoupimport osclass Gushi(): def __init__(self): self.url = "https://so.gushiwen.org/shiwen/default_0AA2.aspx" self.headers = { "User-Agent": "Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"} def get_HTML(self): HTML=requests.get(self.url,headers=self.headers).text self.get_info(HTML) def get_info(self,HTML): soup=BeautifulSoup(HTML,"lxml") Title=soup.select("div > p > a > b") content=soup.find_all("div",class_="contson") self.save_info(Title,content)#调用保存函数 def save_info(self,Title,content): files=os.getcwd()+"\古诗词"#创建一个文件夹路径 if not os.path.exists(files): os.mkdir(files)#创建一个文件夹 L=[] for i in range(len(Title)): L.append(content[i].text)#把处理后的内容存入到列表当中 with open(files+"\%s.txt"%Title[i].text,"w",enCoding="utf-8")as f: f.write(Title[i].text)#写入标题 for j in L[i]: if j!=" ": f.write(j)#写入内容 if j=="。": f.write("\n")gushi=Gushi()gushi.get_HTML()
day5@H_502_1653@1,jIEba分词@H_502_1653@1,分词模式1,精确分词,试图将句子最精确的分开,适合文本分析2,全模式:将句子中所有可以成词的词语都扫秒出来,速度非常快,但是不能解决歧义问题3,搜索引擎模式:在精确模式的基础上对长词进行切分,提高召回率,适用于搜索引擎2,分词方法对于一段长文字,分词原理大致分为三部分:1,首先用正则表达式将中文段落粗略分为一个个的句子2,将每个句子构造成有向无环图,之后寻找最佳切割方案3,最后对于连续的词语,采用HMM模型再次划分2,codecs@H_502_1653@这种方法可以指定一个编码打开文件,使用这个方法打开的文件读取返回的是Unicode编码,写入时编码也是Unicode使用open()时时指定Unicode编码写入,如果str,则根据源代码文件声明的字符编码解码成Unicode之后再进行 *** 作,相对于open(),这个不容易出现问题3,xpath解析模块@H_502_1653@1,概念全程为XML path language,即XML路径语言,他是一门再XML文档中查找信息的语言2,使用流程from lxml import etreeparseHTML=etree.HTML(HTML)result=parseHTML.xpath("xpath表达式")
3,xpath常用规则nodename | 选择此节点的所有节点 |
---|---|
/ | 从当前节点选取直接子节点 |
// | 从当前节点选择子孙节点 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
from lxml import etreeHTML=etree.HTML(text)#将数据转换为xpath对象print(HTML.xpath('//*'))#获取所有的节点信息
1,返回类型是一个列表,每个元素是Element类型,后面跟了很多节点名2,也可以指定节点名称,获取数据from lxml import etreeHTML=etree.HTML(text)#将数据转换为xpath对象print(HTML.xpath('//li'))#获取指定名称的节点信息
5,子节点可以通过/或者//查找字节点或者子孙节点print(HTML.xpath('//li/a'))#查找li下的子节点
print(HTML.xpath('//ul//a'))#查找ul下的子孙节点a
6,父节点通过(…)可以查询当前节点的父节点信息print(HTML.xpath('//a[@href="http://domestic.firefox.sina.com/"]/../@class'))#查询当前节点的父节点的class属性print(HTML.xpath('//a[@href="http://domestic.firefox.sina.com/"]/../../@ID'))#查询当前节点的爷爷节点的ID属性
7,属性匹配print(HTML.xpath('//li[@]'))print(HTML.xpath('//a[@ID="channel"]'))
8,文本获取用xpath中的text()方法可以获取节点print(HTML.xpath('//li[@]/a/text()'))#提取li节点下a节点的文字信息print(HTML.xpath('//li[@]/a/@href'))#提取li节点下a节点的href信息
9,属性多值匹配(contains)有时候某些节点的属性不止一个,此时我们就需要用到多值匹配text="""<li ><a href="link.HTML">hello world</a></li><li ><a href="link.HTML">hello</a></li>"""from lxml import etreeHTML=etree.HTML(text)#将数据转换为xpath对象print(HTML.xpath('//li[@]/a/text()'))print(HTML.xpath('//li[contains(@class,"li")]/a/text()'))
通过contains方法,第一个参数传入属性名称,第二个参数传入属性值,只要此属性包含所传入的属性值,就可以完成匹配10,按序选择有时候,在选择的时候某些属性同时匹配了多个节点,但是只想要其中的某个节点,就要text="""<div> <ul> <li ><a href="link1.HTML">cxk song</a></li> <li ><a href="link2.HTML">cxk dance</a></li> <li ><a href="link3.HTML">cxk rap</a></li> <li ><a href="link4.HTML">cxk basketball</a></li> </ul></div>"""from lxml import etreeHTML=etree.HTML(text)#将数据转换为xpath对象# print(HTML.xpath('//li[@]/a/text()'))# print(HTML.xpath('//li[contains(@class,"li")]/a/text()'))print(HTML.xpath('//li[last()]/a/text()'))print(HTML.xpath('//li[1]/a/text()'))#获取第一个li标签中a标签内的文本信息print(HTML.xpath('//li[position()<3]/a/text()'))print(HTML.xpath('//li[last()-2]/a/text()'))#倒数第三个print(HTML.xpath('//li[@][2]/a/text()'))
1、答辩的内容@H_502_1653@1、PPT 介绍小组 组员 分工 项目的内容2、实训总结3、平时上课的源代码 笔记 (答辩项目的源代码)2、答辩项目@H_502_1653@任意选取网站,爬取网站的数据(文本信息 图片信息 音频信息)3、Json模块@H_502_1653@1、概念JavaScript中的对象和数字对象:{“key”:“value”} Json中的数据必须用双引号来表示数组:[x1,x2,x3]2、Json模块的作用Json格式的字符串和python数据类型之间的转换3、读取JsonJson.loads() :作用:Json格式 ————>python数据类型Json python对象 字典数组 列表import Jsonstr="""[{"name":"小明"},{"age":"20"},{"sex":"男"}]"""print(type(str))data=Json.loads(str) #将Json信息转换为python的数据类型print(data)print(type(data))print(data[0]["name"])print(data[1].get("age"))print(data[0].get("address","北京")) #如果信息不存在返回默认值
4、输出JsonJson.dumps()作用:python数据类型------>Json格式python Json字典 对象列表 数组元组 数组注意:@L_419_858@1、Json.dumpa() 默认使用ascii编码2、添加 ensure_ascii=False,禁用ascii编码with open("data.Json","w",enCoding="utf-8") as f: f.write(Json.dumps(data,indent=2,ensure_ascii=False)) #indent参数表示缩进字符个数
如果存在中文,需要先指定编码,然后将ensure_ascii参数设置为False4、抓取动态AJAX请求网页的过程@H_502_1653@1、分析网页的请求规则,打开审查元素,选择xhr选项,通过滚动滑轮,查看网页请求的变化规律,找到Js的请求信息2、找到请求信息后,选择请求,进入到请求体中,选择prevIEw选项,查看返回信息中是否有我们想要的数据3、如果返回信息中存在想要的数据,选择headers选项,查看RequestURL参数,找到网页的真实的url,然后查询其中的参数,一般url的参数都在headers选项中的query Sring Parameters中存在4、通过真实url的公有部分和参数进行拼接,得到可以获取更多信息的url,然后获取Js中Json信息获取下载地址Json["data"]["items"]然后 遍历 for i in Json["data"]["items"]: i["item"]["vIDeo_playurl"]
import requestsimport Jsonimport stringimport timeimport randomclass BilibiliVIDeo(): def __init__(self): self.url="http://API.vc.bilibili.com/board/v1/ranking/top?" #动态请求的公有url部分 self.headers={"User-Agent":"Mozilla/5.0 (windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"} self.all_str=string.punctuation+string.whitespace #将所有的特殊字符以及空白字符绑定 def get_Json(self): for offset in range(1,52,10): #通过循环更改offset的值来实现多次抓取 params={"page_size":"10", "next_offset":str(offset), "tag":"小视频", "type":"tag_general_week", "platform":"pc"} HTML=requests.post(self.url,data=params,headers=self.headers).text #返回网页数据(Json) HTML=Json.loads(HTML) #把Json信息变成python中的数据类型 self.get_vIDeo_url(HTML) #调用获取视频链接的函数 def get_vIDeo_url(self,HTML): #获取小视频下载地址的函数 for vIDeo in HTML["data"]["items"]: vIDeo_url=vIDeo["item"]["vIDeo_playurl"] #获取视频的下载地址 vIDeo_name=vIDeo["item"]["description"] #获取视频的名称 for char in vIDeo_name: #对视频名称中的字符进行遍历 if char in self.all_str: #如果存在特殊字符 vIDeo_name=vIDeo_name.replace(char,"") #如果存在,用空替换掉特殊字符 if len(vIDeo_name)>=50: vIDeo_name=vIDeo_name[:51] #如果视频名称长度大于50,对名称进行切片,只保留前50位 filename=vIDeo_name+".mp4" #将文件保存文mp4格式 vIDeo_content=requests.get(vIDeo_url,headers=self.headers).content #对视频地址发起请求并获取二进制信息 with open(filename,"wb") as f: f.write(vIDeo_content) print("%s下载成功"%filename) time.sleep(random.randint(1,5))bilibili=BilibiliVIDeo()bilibili.get_Json()
总结 以上是内存溢出为你收集整理的Python的基本语法全部内容,希望文章能够帮你解决Python的基本语法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)