视频:https://www.bilibili.com/video/BV12E411A7ZQ的笔记

Linux安装python环境

建议安装桌面linux组件

  1. 到官网下载linux的tar安装包

tar -zxf Python-3.7.3.tar.xz

  1. 安装需要的环境附属

yum install -y gcc zlib zlib-devel openssl-devel readline readline-develide

  1. 进入解压的安装包中进行编译

./configure --prefix=/usr/local/python --with-ssl

  1. 编译安装

make && make install

  1. 配置环境变量

export PYTHON_HOME=/usr/local/python3.10
export PATH=${PYTHON_HOME}/bin:$PATH

此时使用命令:pyhthon3 就可以进入python3环境了。

Linux下IDE的安装

  1. 到pycharm下载安装包,要是.tar结尾的!

tar -zxf pycharm

  1. 进入解压的文件夹中的bin目录,执行./pycharm.sh

cd pycharm

cd bin && ./pycharm.sh

Linxu创建虚拟环境

  1. python3 -m venv ~/mypy
  2. source ~/mypy /bin/activate

Python语法基础

print 输出

输出

  1. age = 18 #创建变量
  2. print("我的名字是%s,我的国籍是%s" %("里奥","中国")) #输出占位符
  3. print("我的年龄是:%d岁" %age) #输出变量
  • %s 字符占位符
  • %d 数字占位符

sep 设置输出时连接符号

  1. print("aaa","bbb","ccc") #python会默认用 空格 连接
  2. print("www","baidu","com",sep=".") #sep 设置连接符号

Python基础 爬虫脚本 - 图1

end 设置末尾操作

因为print是默认换行的,所以可以在末尾添加 end="" 进行操作和限制

  1. print("www",end="") #取消换行
  2. print("wuhu",end="\t") #多一段距离
  3. print("world",end="\n")#换行
  • \t 如同按一下Tab键
  • \n 进行换行

input 输入

获取用户在键盘上的输入信息

  1. password = input("请输入密码") #获取键盘的输入,并转为string
  2. print("您输入的密码为:%s" %password)

type() 查看数据类型

type(a) 查看变量a的数据类型

  1. a,b,c,d = 20 , 5.5 , True , 4+3a
  2. print(type(a),type(b),type(c),type(d))
  3. #运行:
  4. <class 'int'> <class 'float'> <class 'bool'> <class 'complex'>

类型转换

函数 说明
int(X) 转换为整数
float(x) 转换为浮点数
str(x) 转换为字符串
bool(x) 转换为布尔型

注意:布尔型转换时,true为1flase为0。

运算符

算数运算符

  1. 两个比较特殊的
  2. >>> 2 // 4 # 除法,得到一个整数
  3. 0
  4. >>> 2 ** 5 # 乘方
  5. 32

成员运算符

  1. in 如果在指定的序列中找到值,返回true,否则返回false
  2. not in 如果在指定的序列中没有找到值,返回false,否则返回true

身份运算符

  1. is 判断两个标识符是否引用同一个对象 x is y 类似 id(x) == id(y)
  2. is not 判断两个标识符是否引用不同对象 x is not y 类似 id(a) != id(b)

id(x) 是取对象的内存地址

逻辑运算符

  1. and or not 非。

逻辑运算符的特殊用法:

  1. a = 36
  2. a < 10 and print("hello world")
  3. #当and前面的结果是false的情况下,后面的结果不会执行。
  4. a = 50
  5. a > 10 or print("hello world")
  6. #因为前面的等式成立了,所以后面的代码并不会执行

判断语句和循环语句

循环时不需要使用{} 大括号,只需使用缩进,对其即可。

: 不能缺少代表着 条件 的结束 语句 的开始。

  1. if True:
  2. print("true")
  3. else:
  4. print("false")

如果出现没有对齐的情况,要么报错,要么执行位置不对:

  1. if True:
  2. print("qwq")
  3. print("qwq")
  4. print("false") #第四行出现错误
  5. else:
  6. print("false")
  7. print("false")#此行少了一格,如果没有第四行
  8. #则会直接输出,不会进行if中的判断

多重条件判断

python的if语句中的多重判断,不是else if : 而是 elif :

  1. score = 70
  2. if score <=100 and score >=90:
  3. print("考试成绩优秀")
  4. elif score < 90 and score >=80:
  5. print("还可以")
  6. else:
  7. print("及格")

只有在最后时,才是else,其余的多重条件判断都用elif

if嵌套

因为没了{} 所以嵌套时要注意缩进各个代码之间的位置。

并且为了方便写代码,部分编辑器在嵌套时会有提示线

  1. xingbie = 1
  2. danshen = 1
  3. if xingbie == 1:
  4. print("男生") #执行语句和条件语句位置一样
  5. if danshen == 1:
  6. print("我现在单身,帅哥一枚")
  7. else:
  8. print("我不是单身")
  9. else :
  10. print("女生")
  11. if danshen == 1:
  12. print("我是单身,求撩啊!")
  13. else:
  14. print("我不是单身!")

随机数

import random 导入随机数库,可以使用其中的函数了!

  1. import random #导入库
  2. x = random.randint(0,10) #设置x为int类型的0-10的随机数
  3. print(x)

循环语句

for循环

  1. for i in range(5): #从0开始到4,每次加1
  2. print(i)
  3. #range():范围
  4. for i in range(0,10,3): #从0开始每次加3,峰值为10
  5. print(i)
  6. for i in range(-10,-100,-30): #哪怕是负数都可以
  7. print(i)
  8. name = 'liao'
  9. for x in name:
  10. print(x,end='\t') #是字符的话,会逐个打印字符串内容
  11. a = ["aa","bb","cc"] #列表也可以自动遍历
  12. for i in a: #遍历列表的字符
  13. print(i)
  14. for i in range(len(a)): #遍历列表的数量+字符
  15. print(i,a[i])

while循环

  1. i = 0
  2. while i<5:
  3. print("当前是第%d次循环"%(i+1))
  4. print("i=%d"%i)
  5. i+=1

1-100求和

  1. i = 1
  2. sum = 0
  3. while i <= 100:
  4. sum += i
  5. i += 1
  6. print(sum)

while中的else

当跳出while循环时,会执行的命令。

  1. count = 0
  2. while count < 5:
  3. print(count,"small than 5")
  4. count += 1
  5. else:
  6. print(count,"no small than 5")

break,continue和pass

break:跳出for,while循环

continue:跳过当前循环,进入下一个循环

pass:空语句,常用来当做占位符,不做任何事

1-50偶数的和

  1. i = 0
  2. sum = 0
  3. while i <= 50:
  4. i += 1
  5. if i%2==1:
  6. continue
  7. sum += i
  8. print(sum)

字符串,列表,元祖,字典

String

python中字符串可以用,单引号,双引号,三引号括起来。使用反斜杠转义特殊字符。

  1. word = '字符串'
  2. wuhu = "这是一个芜湖"
  3. duanluo = """
  4. 这是 一个 段落
  5. 我 在这里 能
  6. 随便写
  7. """
  8. print(word)
  9. print(wuhu)
  10. print(duanluo)

单引与双引号中的转义字符

  1. stu = "I'm stu"
  2. print(stu)
  3. #I'm stu
  4. stu = 'I\'m stu'
  5. print(stu)
  6. #I'm stu
  7. stu = "Jason said \"I like you\"".
  8. print(stu)
  9. #Jason said "I like you"

字符串截取

  1. str = "liaowuhu"
  2. print(str[2]) #取单个字符
  3. print(str[1:]) #取第2个之后的全部字符
  4. print(str[1:5]) #取第2到6个字符
  5. print(str[0::3]) #取第1到之后的全部字符,每次跳3
  6. print(str[:7:3]) #取第8个之前的全部字符,每次跳3
  7. print(str[0:8:2]) #取第1到8个个字符,每次跳2

字符串的一些用法

  1. #字符串的链接
  2. print(str + ',你好') #直接添加字符
  3. print(str,",芜湖~") #直接添加字符,默认会有个空格
  4. #字符串的复制
  5. print(str*3) #将字符str 复制3个并打印。

转义字符

  1. print('wewqe\nqwe') #\n 会给字符回车
  2. print(r'wewqe\nqwe') #在前面加个r 会取消全部的转义字符

字符串高级用法

代码 函数用法 代码实例
len 获取字符串长度 print(len(s))
find 查找指定内容是否在某位置中 print(s.find(“a”))
startswith/startswith 判断字符串是否以xxx开头/结尾 print(s.startswith(“c”))
count 计算出现次数 print(s.count(“i”))
replace 替换字符 print(s.replace(“c”,”C”))
split 通过参数的内容切割字符串 print(s.split(“c”))
upper/lower 将字符串中的大小写替换 print(s.upper())
strip 去除空格 print(s.strip())
join 字符串拼接 print(s.join(“1a”))

列表

List

  • 列表可以完成大多数集合类的数据结构实现,列表中元素的类型可以不相同,他支持数字,字符,包括嵌套。
  • 列表卸载方括号[]之间,用逗号分隔开的元素列表。
  • 列表索引开头是以0开始,末尾是以-1开始。
  • 列表可以使用 + 操作服进行拼接,用 * 表示重复。
  • 当我们获得多个数据的时候,那么我们可以将它储存到列表中,然后直接列表访问。
  1. #打印namelist
  2. namelist = ["里奥",'liao',123,'test',1.213]
  3. print(namelist[0])
  4. print(namelist[3])
  5. for name in namelist: #for循环遍历
  6. print(name)
  7. print(len(namelist))
  8. length = len(namelist) #获得长度值赋给length
  9. i = 0
  10. while i < length:
  11. print(namelist[i])
  12. i += 1

增删改查

操作名称 操作方法 举例
【增】新增一个数据到列表尾部 append list.append(‘芜湖’)
【增】在指定位置插入 insert list.insert(1,3)
【增】将一个列表的元素添加到另一个列表 extend list.extend(a)
【删】直接删除某个值,有重复的删掉第一个 remove list.remove(‘里奥’)
【删】删除指定位置的一个元素 del del namelist[2]
【删】删除列表中的一个元素,默认最后一个 pop list.pop(1)
【改】直接修改执行下标进行修改 list[1] namelist[1] = “test”
【改】修改范围内的数据 list[1:3] list[1:3]=”123”,7.3
【查】判断是否有某个值 in if x in list:
【查】判断是否没有某个值 not in if x not in list:

常用操作

index:查找第一次出现的下标,并且告诉你在列表中的位置。找不到就报错

  1. a = ["a","as","e3","wda","das","sadc"]
  2. print(index("wda",2,5))
  3. #3

count:统计出现的次数

  1. a = ["a","as","e3","wda","das","sadc","a","a"]
  2. print(a.count("a"))
  3. #3

reverse:将列表所有元素反转

  1. a = ["a","as","e3","wda","das","sadc","a","a"]
  2. a.reverse()
  3. print(a)
  4. #反转输出

sort:排序输出

  1. a = [1,213,34789,67,590,556,423,316,24,6,93]
  2. a.sort() #正序排序
  3. print(a)
  4. a.sort(reverse=True) #倒叙排序
  5. print(a)

二维数组

  1. schoolName = [['123',123],[123,676],["12312","56756"]]
  2. print(schoolName[1][0])

实例:

  1. import random
  2. offices = [[],[],[]]
  3. names = ["1","2","3","4","5","6","7","8"]
  4. for name in names:
  5. index = random.randint(0,2)
  6. offices[index].append(name)
  7. i = 1
  8. for office in offices:
  9. print("office:%d number:%d"%(i,len(office)))
  10. i+=1
  11. for name in office:
  12. print("%s"%name,end="\t")
  13. print("\n")

元组

tuple与list类似,不同之处在于tuple的元素不能修改。tuple写在小括号里,元素之间用逗号隔开。

元祖的元素不可变,但可以包含可变对象。如list

  1. tup1 = ()
  2. print(type(tup1)) #输出tuple
  3. tup2 = (123) #int
  4. tup3 = (123,) #tuple
  5. tup4 = (123,48,16,"aaa") #tuple
  6. print(tup4(0)) #123
  7. print(tup4(-1)) #aaa
  8. print(tup4(1:3)) #48,16,aaa

增:

  • 两个元祖添加,并且赋值给另一个元祖
    1. tup1 = (123,1232,312)
    2. tup2 = ("WQe","WDs","jy")
    3. tup = tup1+tup2
    4. #(123,1232,312,"WQe","WDs","jy")

删:

  • def直接删除整个元祖
    1. tup1 = (123,123,54)
    2. del tup1
    3. print(tup1) #报错

改:

  • 不支持直接赋值修改
    1. tup1=(123,12312,12312)
    2. tup1[0] = 123 #这是错误的

字典

  • 字典是无序的对象集合,使用键-值(key-value)存储,具有极快的查找速度。
  • 键(key)必须使用不可变类型
  • 同一个字典中,键(key)必须是唯一的
  • 爬虫中经常使用字典。
  1. info = {"name":"liao","age":19} #定义字典
  2. print(info["name"]) #字典的访问
  3. print(info.get["gender","没有这个键"])#如果没有这个键,则返回指定字符

增:

直接添加就好了

  1. info = {"name":"里奥","age":18}
  2. newID= input("请输入学号:")
  3. info["id"]=newID
  4. print(info["id"])
  5. print(info)
  6. #10
  7. #{'name': '里奥', 'age': 18, 'id': '10'}

删:

  • del 删除。删除的是全部键值队。
  • clear 清空。将全部键值队清空,但是字典还在。

改:

直接修改

  1. info = {"name":"里奥","age":18}
  2. info["age"] = 20
  3. print(info["age"])

查:

  • info.keys() #列出所有的键
  • info.values() #列出所有的值
  • info.items() #列出所有的项,每个键就是一个元祖
  1. info = {"name":"里奥","age":18,"id":1}
  2. print(info.keys()) #列出所有的键
  3. print(info.values()) #列出所有的值
  4. print(info.items()) #列出所有的项,每个键就是一个元祖
  5. #打印遍历
  6. for key,value in info.items():
  7. print("key=%s,value=%s"%(key,value))

枚举函数,同时获得下标和数值

  1. mylist = ["a","b","c","d","e"]
  2. for i,x in enumerate(mylist):
  3. print(i+1,x)

set集合

set和dict类似,也是一组key的组合,但是不存储value。由于key不能重复,所以在set中,没有重复的key。会去除重复。

set是无序的,重复元素在set中自动被过滤。

函数

  1. def 函数名():
  2. 代码

定义与调用

  1. def printinfo():
  2. print("-------------------")
  3. print(" 人生苦短,我用python ")
  4. print("-------------------")
  5. printinfo()

有参函数

  1. def addNum(x,y):
  2. print(x+y)
  3. addNum(10,20)

带返回值

  1. def addNums(x,y):
  2. return x+y
  3. print(addNums(17,29))

返回多个值

  1. def chuyi(x,y):
  2. shang = x/y
  3. yu = x%y
  4. return shang,yu
  5. chu,yu = chuyi(20,2) #需要多个值保存返回内容
  6. print(chu,yu)

全局变量和局部变量

在函数中的全局变量使用global 进行修改,并且之后使用会生效。

lambda

  1. sum = lambda x,y:x+y
  2. print(sum(7,6))

lambda操作简单,适合实现一些简单的函数操作

eval

  1. num = 10
  2. result = eval("3 * num")
  3. print(result)
  4. list_str = "[1,2,3]"
  5. tuple_str = "(1,2,4)"
  6. dict_str = "{1:'wd',2:'dsad',3:'qwed'}"
  7. list_eval = eval(list_str)
  8. tuple_eval = eval(tuple_str)
  9. dict_eval = eval(dict_str)
  10. print("[list]序列数据:%s,序列类型%s"%(list_eval,type(list_eval)))
  11. print("[tuple]序列数据:%s,序列类型%s"%(tuple_eval,type(tuple_eval)))
  12. print("[dict]序列数据:%s,序列类型%s"%(dict_eval,type(dict_eval)))

eval可以不用进行强制转换,运行字符串中的程序代码。但是只能解析其中的单个字符串的信息

exec

作用和eval差不多,但是可以进行多行的字符串操作

文件操作

打开/创建文件

  1. f = open("test.txt","w") #打开文件,文件不存在,就新建。
  2. f.close()

访问模式

访问模式 说明
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

给文件内容编辑

  1. #写入
  2. f = open("test.txt","w")
  3. f.write("芜湖~~")
  4. f.close() #必须执行关闭,才会保存你的操作。
  5. #读 开始时定位在文件头部,每次执行一次向后移动指定字符数
  6. f = open("test.txt","r")
  7. content = f.read(3) #读取5个字符
  8. print(content)
  9. f.close()
  10. #一次读取全部信息
  11. f = open("test.txt","r")
  12. content = f.readlines() #读取全部内容为列表
  13. i = 1
  14. for temp in content:
  15. print(i,temp)
  16. i+=1
  17. f.close()
  18. #读取单行信息
  19. f = open("test.txt","r")
  20. content = f.readline()
  21. print(content)
  22. content = f.readline()
  23. print(content)
  24. content = f.readline()
  25. print(content)
  26. content = f.readline()
  27. print(content)
  28. f.close()

文件的序列化和反序列化

默认情况下,我们只能将字符串写入到文件中。所以无法写入对象。不过可以通过序列化写入到文件中。

序列化的两种方式

import json

dumps():将对象转换为字符串

  1. import json
  2. #导入json模块到文件中,序列化
  3. f=open('test.txt',"w")
  4. #创建文件
  5. name = ["QWeqw",123123,"xcawe"]
  6. #定义一个列表
  7. name_list = json.dumps(name)
  8. #将python对象变成json的字符串
  9. print(type(name_list))
  10. f.write(name_list)
  11. #将转换后的对象写入到文件中
  12. f.close()

dump():在将对象转换为字符串的同时,指定一个文件夹的对象,然后把转换后的字符串写入到这个文件里。

  1. import json
  2. #导入json包
  3. f = open('test.txt','w')
  4. name_list = ["wqexz",'vwer',12321]
  5. json.dump(name_list,f)
  6. #将name_list转换为str,并且写入到文件f中
  7. f.close()

反序列化

将json字符串转换为python对象

json.loads()

  1. import json
  2. fp = open("test.txt","r")
  3. a = fp.read()
  4. #读取文件
  5. print(a)
  6. print(type(a))
  7. #读取文件类型 str
  8. b = json.loads(a)
  9. #将json字符串转换为python对象
  10. print(type(b))
  11. fp.close()

json.load()

  1. import json
  2. fp = open("test.txt","r")
  3. a = json.load(fp)
  4. #直接写文件
  5. print(a)
  6. print(type(a))
  7. fp.close()

OS模块

  1. import os
  2. os.rename("test.txt","test123.txt") #修改名称
  3. os.mkdir("fild") #创建文件夹
  4. os.getcwd #获取当前目录
  5. os.remove("test123.txt") #删除文件
  6. os.chdir("../") #改变默认目录
  7. os.listdir("./") #获取目录列表
  8. os.rmdir("fild") #删除文件夹

错误与异常

错误:不可预料,不可知的。当出现错误,后面代码无法继续执行。

异常:可预料,能改变的。

异常捕获

  1. #单个异常捕获
  2. try:
  3. print("-"*30)
  4. f=open("123.txt","r") #只读模式,打开文件。此时文件不存在,会报错
  5. print("*"*30)
  6. except IOError: #如果是IOError的报错
  7. pass #捕获异常,使用pass占位报错。
  8. #多个异常捕获
  9. try:
  10. print(num)
  11. except (NameError,IOError): #将可能的错误都放到小括号中
  12. print("出现了名称错误")

错误信息提示

  1. try:
  2. print(num)
  3. except (NameError,IOError) as result: #将错误提示赋值给result
  4. print("出现了名称错误")
  5. print(result)
  6. #name 'num' is not defined

Execption

Exception 所有异常的父类,不知道写哪个异常,用它就对了。

finally与嵌套

finally:不管有没有报错,都是会执行的。

  1. import time
  2. try:
  3. f = open("123.txt","r") #尝试读取123.txt
  4. try:
  5. while True: #一直循环
  6. content = f.readline() #content等于文件的行
  7. if len(content) == 0: #如果没有值,当无法被赋值,则退出
  8. break
  9. time.sleep(2)
  10. print(content)
  11. finally:
  12. f.close()
  13. print("文件关闭")
  14. except Exception:
  15. print("发生异常")
  16. finally:
  17. print("文件关闭")
异常名称 描述
UserWarning 用户代码生成的警告
BaseException 所有异常的基类
SystemExit 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入^C)
Exception 常规错误的基类
StopIteration 迭代器没有更多的值
GeneratorExit 生成器(generator)发生异常来通知退出
StandardError 所有的内建标准异常的基类
ArithmeticError 所有数值计算错误的基类
FloatingPointError 浮点计算错误
OverflowError 数值运算超出最大限制
ZeroDivisionError 除(或取模)零 (所有数据类型)
AssertionError 断言语句失败
AttributeError 对象没有这个属性
EOFError 没有内建输入,到达EOF 标记
EnvironmentError 操作系统错误的基类
IOError 输入/输出操作失败
OSError 操作系统错误
WindowsError 系统调用失败
ImportError 导入模块/对象失败
LookupError 无效数据查询的基类
IndexError 序列中没有此索引(index)
KeyError 映射中没有这个键
MemoryError 内存溢出错误(对于Python 解释器不是致命的)
NameError 未声明/初始化对象 (没有属性)
UnboundLocalError 访问未初始化的本地变量
ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError Python 语法错误
IndentationError 缩进错误
TabError Tab 和空格混用
SystemError 一般的解释器系统错误
TypeError 对类型无效的操作
ValueError 传入无效的参数
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
Warning 警告的基类
DeprecationWarning 关于被弃用的特征的警告
FutureWarning 关于构造将来语义会有改变的警告
OverflowWarning 旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning 关于特性将会被废弃的警告
RuntimeWarning 可疑的运行时行为(runtime behavior)的警告
SyntaxWarning 可疑的语法的警告

python爬虫

准备工作

首行代码,使得代码包含中文。

  1. #-*- codeing = utf-8 -*-

加入main函数用于测试程序

if _name_ == "_main_"

当程序被调用执行时,先从该代码块执行

从其他文件夹导入类

  1. from 文件夹名 import 类名
  2. from test1 import t1

常用包

  1. import bs4 #网页解析,获取数据
  2. import re #正则表达式,网页匹配
  3. import urllib.request,urllib.error #制定url,获取网页内容
  4. import xlwt #进行Excel操作
  5. import sqlite3 #进行sqlite数据库操作

爬虫流程

  • 爬取网页
  1. baseurl = "https://movie.douban.com/top250?start=" #设置url
  2. def getdata(baseurl):
  3. datalist = []
  4. #逐一解析数据
  5. return datalist
  6. datalist = getdata(baseurl) #爬取网页
  • 解析数据
  • 保存数据
  1. savepath=r".\豆瓣电影top250.xls"
  2. saveDate(savepath)
  3. def saveDate(savepath):

获取数据

  1. #得到指定的一个url网页内容
  2. def askURL(url):
  3. #首先指定头部信息,设置用户代理,告诉服务器我们是什么类型的机器。
  4. head = { #模拟浏览器
  5. "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36 Edg/94.0.992.50"
  6. }
  7. url
  1. from bs4 import BeautifulSoup
  2. import urllib.request
  3. import urllib.error
  4. import sqlite3
  5. import xlwt
  6. import re
  7. def main():
  8. baseurl = "https://movie.douban.com/top250?start=" #设置url
  9. datalist = getdata(baseurl) # 爬取网页
  10. savepath = r".\豆瓣电影top250.xls"
  11. #saveDate(savepath)
  12. askURL("https://movie.douban.com/top250?start=")
  13. def getdata(baseurl):
  14. datalist = []
  15. #逐一解析数据
  16. return datalist
  17. #得到指定的一个url网页内容
  18. def askURL(url): #首先指定头部信息
  19. head = {
  20. "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36 Edg/94.0.992.50"
  21. }
  22. requests = urllib.request.Request(url,headers=head)
  23. html = ""
  24. try:
  25. response = urllib.request.urlopen(requests)
  26. html = response.read().decode("utf-8")
  27. print(html)
  28. except urllib.error.URLError as e :
  29. if hasattr(e,"code"):
  30. print(e.code)
  31. if hasattr(e,"reason"):
  32. print(e.reason)
  33. #return html
  34. def saveDate(savepath):
  35. print()
  36. if __name__ == '__main__':
  37. main()

urllib

获取baidu的页面代码

  1. import urllib.request
  2. #1.定义一个url,就是你需要访问的数据
  3. url = 'http://www.baidu.com'
  4. #2.模拟浏览器向服务器发送请求,此时服务器会给你一个响应反馈
  5. #response 响应
  6. response = urllib.request.urlopen(url)
  7. #3获取响应中的页面源码
  8. #content内容
  9. #read方法 返回字节形式的二进制数据。要将二进制的数据转换为字符串
  10. #二进制 -》字符串 解码 decode('编码格式')
  11. content = response.read().decode('utf-8')
  12. #4打印数据
  13. print(content)

1个类型和6个方法

  1. import urllib.request
  2. url = 'http://www.baidu.com'
  3. response = urllib.request.urlopen(url)
  4. #模拟浏览器想服务器发送请求
  5. #一个类型和六个方法
  6. #print(type(response))
  7. #<class 'http.client.HTTPResponse'>
  8. #按照一个字节一个字节的读
  9. content = response.read(5)
  10. print(content)
  11. #读取一行
  12. content = response.readline()
  13. print(content)
  14. #读取全部
  15. content = response.readlines()
  16. print(content)
  17. #返回状态码 200就是没问题
  18. print(response.getcode())
  19. #返回url地址
  20. print(response.geturl())
  21. #获取一些状态信息
  22. print(response.getheaders())

下载图片/视频/网页

  1. import urllib.request
  2. #下载网页
  3. url = 'http://www.baidu.com'
  4. #url代表下载路径,filename文件的名字
  5. urllib.request.urlretrieve(url,'baidu.html')
  6. #下载图片
  7. url_img = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201608%2F20%2F20160820091644_etiFR.jpeg&refer=http%3A%2F%2Fb-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1638861798&t=667fc36288ddaf4cb6dd24d9cd129af8'
  8. urllib.request.urlretrieve(url_img,'leimu.jpg')
  9. #下载视频
  10. url_video = 'https://vd3.bdstatic.com/mda-mjvdqf1qkkijh90e/sc/cae_h264_clips/1635589295180348540/mda-mjvdqf1qkkijh90e.mp4?auth_key=1636271907-0-0-3d7d201b6754c7c0d6fd76f777c0b472&bcevod_channel=searchbox_feed&pd=1&pt=3&abtest='
  11. urllib.request.urlretrieve(url_video,'test.mp4')

请求对象的定制

大部分网站都是https的协议,这个自带一个反爬。需要在爬时,添加请求头,使用Request方法。

  1. URL = 'https://www.baidu.com'
  2. headers = {
  3. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40"
  4. }
  5. #正常来说,咱们使用urlopen。会被https反爬,此时需要用到Request,将header添加进来
  6. response = urllib.request.urlopen(url)
  7. #因为urlopen的方法中,不能存储字典,所以header不能传进去
  8. #请求对象的定制
  9. request = urllib.request.Request(url=URL,headers=headers)
  10. response = urllib.request.urlopen(request)
  11. content = response.read().decode('utf8')
  12. print(content)

Get请求的quote方法

  1. import urllib.request
  2. import urllib.parse #该库用来设置quote
  3. #获取该网页的源码,此时wd=后面没有写东西
  4. URL = 'https://www.baidu.com/s?wd='
  5. #设置请求头
  6. headers = {
  7. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40"
  8. }
  9. #将 蕾姆 变成unicode编码的格式
  10. #我们将依赖urllib.parse
  11. name = urllib.parse.quote('蕾姆')
  12. URL = URL + name
  13. #请求对象定制
  14. request = urllib.request.Request(url=URL,headers=headers)
  15. #模拟浏览器想服务器发送请求
  16. response = urllib.request.urlopen(request)
  17. #获取响应的内容
  18. content = response.read().decode('utf-8')
  19. print(content)

Get请求的urlencode方法

有时候会有很多的字符需要转换成unicode编码

  1. import urllib.request
  2. import urllib.parse
  3. #获取该网页的源码
  4. URL = 'http://www.baidu.com/s?'
  5. #将字符转换成unicode编码
  6. data = {
  7. 'wd':'蕾姆',
  8. 'sex':'女',
  9. 'location':'异世界'
  10. }
  11. new_data = urllib.parse.urlencode(data)
  12. url = URL + new_data
  13. header = {
  14. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40"
  15. }
  16. #请求对象的定制
  17. requests = urllib.request.Request(url=url,headers=header)
  18. #模拟浏览器想服务器发送请求
  19. response = urllib.request.urlopen(requests)
  20. #获取网页源码的数据
  21. content = response.read().decode('utf-8');
  22. print(content)

Post请求百度翻译①

post请求的参数,是不会拼接在url后面的 而是需要放在请求对象定制的参数中

设置请求头——设置post请求数值——将请求参数进行编码——模拟浏览器发送请求——请求对象的定制——模拟浏览器想服务器发送请求——获取响应的数据——将响应的数据转换为python变量

  1. import urllib.request
  2. import urllib.parse
  3. import json
  4. url = 'https://fanyi.baidu.com/sug' #设置url
  5. header = { #设置请求头
  6. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40"
  7. }
  8. data = {
  9. 'kw':'apple'
  10. }
  11. #post的请求的参数必须要进行编码
  12. data = urllib.parse.urlencode(data).encode('utf-8')
  13. #post请求的参数,是不会拼接在url后面的 而是需要放在请求对象定制的参数中
  14. #post请求的参数,必须要执行编码
  15. #请求对象的定制
  16. requests = urllib.request.Request(url=url,data=data,headers=header)
  17. #模拟浏览器向服务器发送请求
  18. response = urllib.request.urlopen(requests)
  19. #获取响应的数据
  20. content = response.read().decode('utf-8')
  21. print(content) #此时还是json对象
  22. #post请求的参数 必须编码 data = urllib.parse.urlencode(data)
  23. #编码之后必须调用encode方法 data = urllib.parse.urlencode(data).encode('utf-8')
  24. #参数是放在请求对象定制的方法中 requests = urllib.request.Request(url=url,data=data,headers=header)
  25. a = json.loads(content)
  26. print(a)

Post请求百度翻译②

  1. import urllib.request
  2. import urllib.parse
  3. import json
  4. url = "https://fanyi.baidu.com/v2transapi?from=en&to=zh"
  5. header = {
  6. 'Cookie': 'FANYI_WORD_SWITCH=1; REALTIME_TRANS_SWITCH=1; SOUND_SPD_SWITCH=1; HISTORY_SWITCH=1; SOUND_PREFER_SWITCH=1; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1636282101,1636283407; BAIDUID_BFESS=D97104299B0231E843C8B065363FA834:FG=1; BAIDUID=D97104299B0231E852C4592CEFEF4223:FG=1; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1636285675; __yjs_duid=1_2528c66efbdff8f58d954589e0c966b71636285675145; __yjs_st=2_Y2Q2YzJkOGVlZGUzYTNlNzAyMGFkMDZhNDA3YjM1YTA2MjUwNTA4M2MwZDU1MTQ2ODc5YjkwMDNjN2YwMTgwZWIzMGJkNzI5M2RiMWVjMjkzYzI5NzU5ZDhiN2EyODA3MzA3MzkyMWMzOWJiMDYwODRkYjlhNTkzZGViOWVhMTdmMTNhZDRiYWU4NzRkOGU1NzI1MjA5MGYzYTZlNzQyZTU4MThkNjg5MTU0NGRkNzk5NDRmZWEyZmE0NTZkODMzYjMyYTNhMGE5ZmE5YTY1ODQwNTFkZDI4MzI1OTgwZTczOTQ5ODE3YTAzYTk0OWI4MDg3Y2I1YTY2NDZjZDFmNl83X2I3ZDViNWY0; ab_sr=1.0.1_MWYyYjA3ZjgyNzIwNmQyNTdhZTNlNzYzODgxZDYwZWQ2OThlMzJmMjc0ZWIxYjdlYjE0ZGJhZDQ0OTk1MmY3NGJiNzk0NDU2MjVjMDI3N2Y3ZDM0YzRlZTgxYTg5NTE2MmUyZTFlOGVmYjcyMjg2ZTFkYjJiYWZjZmY2OTVhNWRkMWJjNjhkMzI0YzkzM2U4N2I0ZjliYmNlZDg5NzFiNQ==',
  7. 'User-Agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40',
  8. }
  9. data = {
  10. "from": "en",
  11. "to": "zh",
  12. "query": "eat",
  13. "transtype":"realtime",
  14. "simple_means_flag": 3,
  15. "sign": "25728.296881",
  16. "token": "f2f58e3277099aae3d46dad701d019a8",
  17. "domain": "common",
  18. }
  19. #post请求的参数
  20. data = urllib.parse.urlencode(data).encode('utf-8')
  21. #请求对象定制
  22. request = urllib.request.Request(url = url,data = data,headers = header)
  23. #模拟浏览器向服务器发送请求
  24. response = urllib.request.urlopen(request)
  25. #获取响应的数据
  26. content = response.read().decode('utf-8')
  27. a = json.loads(content)
  28. print(a)

ajax的get请求①

爬取豆瓣电影的第一页

  1. import urllib.request
  2. url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20'
  3. headers = {
  4. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
  5. }
  6. # (1) 请求对象的定制
  7. request = urllib.request.Request(url=url,headers=headers)
  8. # (2)获取响应的数据
  9. response = urllib.request.urlopen(request)
  10. content = response.read().decode('utf-8')
  11. # open方法默认情况下使用的是gbk的编码 如果我们要想保存汉字 那么需要在open方法中指定编码格式为utf-8
  12. # encoding = 'utf-8'
  13. fp = open('douban1.json','w',encoding='utf-8')
  14. fp.write(content)
  15. with open('douban1.json','w',encoding='utf-8') as fp:
  16. fp.write(content)

ajax的get请求②

  1. import urllib.request
  2. import urllib.parse
  3. def create_request(page):
  4. base_url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&'
  5. #设置url
  6. data = {
  7. 'start':(page - 1)*20,
  8. 'limit':20
  9. }
  10. #设置get请求数据
  11. header = {
  12. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
  13. }
  14. data = urllib.parse.urlencode(data) #将get数据转换编码
  15. url = base_url + data
  16. request = urllib.request.Request(url=url,headers=header) #请求对象定制
  17. return request
  18. def get_content(request):
  19. #模拟浏览器向服务器发送请求
  20. response = urllib.request.urlopen(request)
  21. #获取响应的数据
  22. content = response.read().decode('utf-8')
  23. return content
  24. def down_load(page,content):
  25. #str(page) page本来是int形,需要强制转换为str
  26. with open("douban" + str(page) + '.json','w',encoding='utf-8') as fp:
  27. fp.write(content)
  28. #程序入口
  29. if __name__ == '__main__':
  30. start_page = int(input('起始的页码'))
  31. #先获取起始和结束的页码
  32. end_page = int(input('结束的页码'))
  33. for page in range(start_page,end_page + 1):
  34. request = create_request(page)
  35. #获取响应的数据
  36. content = get_content(request)
  37. down_load(page,content)

ajax的post请求

  1. import urllib.request
  2. import urllib.parse
  3. def create_request(page):
  4. base_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'
  5. data = {
  6. "cname": "郑州",
  7. "pid":"",
  8. "pageIndex": page,
  9. "pageSize": 10,
  10. }
  11. data = urllib.parse.urlencode(data).encode('utf-8')
  12. header = {
  13. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
  14. }
  15. request = urllib.request.Request(url=base_url,data=data,headers=header)
  16. return request
  17. def get_content(request):
  18. reponse = urllib.request.urlopen(request)
  19. content = reponse.read().decode('utf-8')
  20. return content
  21. def down_load(page,content):
  22. with open('kfc_' + str(page) +'.json','w',encoding='utf-8') as fp:
  23. fp.write(content)
  24. if __name__ == '__main__':
  25. star_page = int(input('请输入起始页码'))
  26. end_page = int(input('请输入结束页码'))
  27. for page in range(star_page,end_page+1):
  28. #请求对象的定制
  29. request = create_request(page)
  30. #获取网页源码
  31. content = get_content(request)
  32. #下载
  33. down_load(page,content)

cookie登录

  1. #适用场景:数据采集的时候,需要绕过登录,然后进入到某个页面
  2. #个人信息的页面是utf-8 但还是报错了编码错误,因为并没有进入到个人信息页面,而是进入到了登录界面
  3. import urllib.request
  4. import urllib.parse
  5. url = 'https://weibo.cn/6872551356/info'
  6. header = {
  7. 'cookie':' SUB=_2A25MjWedDeRhGeBG7FAU9S_PzjqIHXVvjgnVrDV6PUJbktCOLXfakW1NQe-etiou_OIg_KitV9VcRpKy7ytNczHc; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WF1PU1h6j8LkpZp6uVUOUjn5NHD95Qc1hMESK-pe0-cWs4DqcjPi--4iKnNiKyhi--fi-2fi-2fqgY7eK2t; SSOLoginState=1636374477; _T_WM=37a11b096a235bbb73e9bf73cb5c1690',
  8. #防盗链 判断当前是否从上一个路径进来的 一般是作用图片的防盗链
  9. 'referer': 'https://weibo.cn/',
  10. 'user-agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44'
  11. }
  12. #请求对象定制
  13. request = urllib.request.Request(url=url,headers=header)
  14. #模拟浏览器向服务器发送请求
  15. response = urllib.request.urlopen(request)
  16. #获取响应的数据
  17. content = response.read().decode('utf-8')
  18. #将数据保存到本地
  19. with open('weibo.html','w',encoding='utf-8')as fp:
  20. fp.write(content)

handler处理的基本使用

  1. #使用handler来访问百度
  2. import urllib.request
  3. import urllib.parse
  4. base_url = 'http://www.baidu.com/s?ie=utf-8&wd=ip'
  5. header = {
  6. "User-Agent": "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 95.0.4638.69Safari / 537.36Edg / 95.0.1020.44"
  7. }
  8. #请求对象定制
  9. request = urllib.request.Request(url=base_url,headers=header)
  10. #handler builder_opener open
  11. #1,获取handler对象
  12. handler = urllib.request.HTTPHandler()
  13. #2,通过hendler获得opener对象
  14. opener = urllib.request.build_opener(handler)
  15. #3,调用open方法
  16. response = opener.open(request)
  17. #4,获取响应数据
  18. content = response.read().decode('utf-8')
  19. print(content)

handler访问百度

  1. #使用handler来访问百度
  2. import urllib.request
  3. import urllib.parse
  4. base_url = 'http://www.baidu.com/s?ie=utf-8&wd=ip&usm=3&rsv_idx=2&rsv_page=1'
  5. header = {
  6. "User-Agent": "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 95.0.4638.69Safari / 537.36Edg / 95.0.1020.44"
  7. }
  8. #请求对象定制
  9. request = urllib.request.Request(url=base_url,headers=header)
  10. #模拟浏览器访问服务器
  11. #response = urllib.request.urlopen(request)
  12. proxies = {
  13. 'http':'112.194.204.79:8085'
  14. }
  15. handler = urllib.request.ProxyHandler(proxies=proxies)
  16. opener = urllib.request.build_opener(handler)
  17. response = opener.open(request)
  18. #获取响应的信息
  19. content = response.read().decode('utf-8')
  20. with open('daili.html','w',encoding='utf-8') as fb:
  21. fb.write(content)

handler代理池

  1. import urllib.request
  2. import urllib.parse
  3. import random
  4. proxies_pool = [ #选择性代理
  5. {'http':'221.125.138.189:8193'},
  6. {'http':'222.78.6.190:8083'},
  7. ]
  8. proxies = random.choice(proxies_pool)
  9. base_url = 'http://www.baidu.com/s?ie=utf-8&wd=ip'
  10. header = {
  11. "User-Agent": "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 95.0.4638.69Safari / 537.36Edg / 95.0.1020.44"
  12. }
  13. #请求对象定制
  14. request = urllib.request.Request(url=base_url,headers=header)
  15. #获取handler对象
  16. handler = urllib.request.ProxyHandler(proxies)
  17. #通过hendler获得opener对象
  18. opener = urllib.request.build_opener(handler)
  19. #调用open方法
  20. response = opener.open(request)
  21. #获得响应数据
  22. content = response.read().decode('utf-8')
  23. with open('daile1.html','w',encoding='utf-8') as fp:
  24. fp.write(content)

xpath解析

  1. xpath基本语法:
  2. 1.路径查询
  3. //:查找所有子孙节点,不考虑层级关系(找寻他的所有子节点)
  4. /:找直接子节点(找寻一层节点)
  5. 2.谓词查询
  6. //div[@id="test"] #查找id为test的值
  7. 3.属性查询
  8. //@class #查找带有class属性的的值
  9. 4.模糊查询
  10. //div[containse(@id,"he")]
  11. //div[starts-with(@id,"he")]
  12. 5.内容查询
  13. //div/h1/text()
  14. 6.逻辑运算
  15. //div[@id="head" and @class="s_down"]
  16. //title | //price

例子:

  1. from lxml import etree
  2. #lxml解析
  3. #1.本地文件 etree.parse
  4. #2.服务器响应数据 response.read().decode('utf-8') 常用! etree.HTML()
  5. #xpath解析本地文件
  6. tree = etree.parse('test.html')
  7. print(tree)
  8. #tree.xpath('xpath路径')
  9. # #查找ul下面的li
  10. li_list = tree.xpath('//body/ul/li')
  11. #查找所有有id的属性li标签
  12. #text() 获取标签内容
  13. li_list = tree.xpath('//ul/li[@id]/text()')
  14. #找到id为l1的li标签
  15. li_list = tree.xpath('//ul/li[@id="l1"]/text()')
  16. #查找到id为l1的li标签的class属性值
  17. li_list = tree.xpath('//ul/li[@id="l1"]/@class')
  18. #查询id中包含l的li标签
  19. li_list = tree.xpath('//ul/li[contains(@id,"l")]/text()')
  20. #查询id的值,以l开头的li标签
  21. li_list = tree.xpath('//ul/li[starts-with(@id,"c")]/text()')
  22. #查询id为l1和class为c1的标签
  23. li_list = tree.xpath('//ul/li[@id="l1" and @class="c1"]/text()')
  24. #判断列表的长度
  25. print(li_list)
  26. print(len(li_list) )

获得百度搜索中的百度一下

  1. # -*- coding: utf-8 -*-
  2. #1.获取百度源码
  3. #2.解析 解析服务器响应的文件
  4. #3.打印
  5. import urllib.request
  6. import urllib.parse
  7. from lxml import etree
  8. url = 'https://www.baidu.com/'
  9. header = {
  10. "User-Agent": "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 95.0.4638.69Safari / 537.36Edg / 95.0.1020.44"
  11. }
  12. #请求对象定制
  13. request = urllib.request.Request(url=url,headers=header)
  14. #模拟浏览器访问服务器
  15. response = urllib.request.urlopen(request)
  16. #获取网页源码
  17. content = response.read().decode('utf-8')
  18. #解析网页源码,获取我们想要的数据
  19. #解析服务器相应的文件
  20. tree = etree.HTML(content)
  21. #获取想要的数据 xpath返回值是列表数据
  22. result = tree.xpath('//input[@id="su"]/@value')[0]
  23. print(result)

爬取站长之家图片

  1. # -*- coding: utf-8 -*-
  2. import urllib.request
  3. import urllib.parse
  4. from lxml import etree
  5. #1.请求对象定制
  6. #2.获取网页源码
  7. #3.下载
  8. #需求:获取前十页的图片
  9. #https://sc.chinaz.com/tu/qinglvtupian.html
  10. #https://sc.chinaz.com/tu/qinglvtupian-2-0-0.html
  11. def create_request(page):
  12. if(page == 1):
  13. url = "https://sc.chinaz.com/tu/qinglvtupian.html"
  14. else:
  15. url = "https://sc.chinaz.com/tu/qinglvtupian-"+str(page)+"-0-0"+".html"
  16. header = {
  17. "User-Agent": "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 95.0.4638.69Safari / 537.36Edg / 95.0.1020.44"
  18. }
  19. request = urllib.request.Request(url=url,headers=header)
  20. return request
  21. def get_content(request):
  22. response=urllib.request.urlopen(request)
  23. content = response.read().decode('utf-8')
  24. return content
  25. def down_load(content):
  26. #下载图片,并不是下载页面
  27. #urllib.request.urlretrieve("图片地址","文件名称")
  28. tree = etree.HTML(content)
  29. name_list = tree.xpath('//div[@id="ulcontent"]//a/img/@alt')
  30. #一般涉及到图片的网站,涉及到懒加载(此时是src2)
  31. src_list = tree.xpath('//div[@id="ulcontent"]//a/img/@data-src')
  32. for i in range(len(name_list)):
  33. name = name_list[i]
  34. src = src_list[i]
  35. src1 = src.replace('\\','/')
  36. print(src1)
  37. url = "https:"+src1
  38. urllib.request.urlretrieve(url=url,filename='./picture/'+name+".jpg")
  39. if __name__ == '__main__':
  40. start_page=int(input("请输入起始页码"))
  41. end_page=int(input("请输入结束页码"))
  42. for page in range(start_page,end_page+1):
  43. #1.请求对象定制
  44. request = create_request(page)
  45. #2.获取网页源码
  46. content = get_content(request)
  47. #3.下载
  48. down_load(content)

jsonpath

  1. { "store": {
  2. "book": [
  3. { "category": "reference",
  4. "author": "Nigel Rees",
  5. "title": "Sayings of the Century",
  6. "price": 8.95
  7. },
  8. { "category": "fiction",
  9. "author": "Evelyn Waugh",
  10. "title": "Sword of Honour",
  11. "price": 12.99
  12. },
  13. { "category": "fiction",
  14. "author": "Herman Melville",
  15. "title": "Moby Dick",
  16. "isbn": "0-553-21311-3",
  17. "price": 8.99
  18. },
  19. { "category": "fiction",
  20. "author": "J. R. R. Tolkien",
  21. "title": "The Lord of the Rings",
  22. "isbn": "0-395-19395-8",
  23. "price": 22.99
  24. }
  25. ],
  26. "bicycle": {
  27. "color": "red",
  28. "author": "liao",
  29. "price": 19.95
  30. }
  31. }
  32. }
  1. # -*- coding: utf-8 -*-
  2. import urllib.request
  3. import jsonpath
  4. import json
  5. obj = json.load(open('test.json','r',encoding='utf-8'))
  6. #书店所有的书的作者
  7. #书店下,所有书,的作者
  8. author_list=jsonpath.jsonpath(obj,'$.store.book[0].author')
  9. print(author_list)
  10. #所有的作者
  11. author_list1 = jsonpath.jsonpath(obj,'$..author')
  12. print(author_list1)
  13. #store下面的所有元素
  14. tag_list = jsonpath.jsonpath(obj,'$.store.*')
  15. print(tag_list)
  16. #store里所有的钱
  17. price_list = jsonpath.jsonpath(obj,'$.store..price')
  18. print(price_list)
  19. #第三本书
  20. book = jsonpath.jsonpath(obj,'$..book[2]')
  21. print(book)
  22. #最后一本书
  23. book = jsonpath.jsonpath(obj,'$..book[(@.length-1)]')
  24. print(book)
  25. #前两本书
  26. book_list = jsonpath.jsonpath(obj,'$..book[:2]')#$..book[0,1]
  27. print(book_list)
  28. #条件过滤需要在()前加个?
  29. #过滤出包含某数值的书
  30. book_list2 = jsonpath.jsonpath(obj,'$..book[?(@.isbn)]')
  31. print(book_list2)
  32. #那本书超过了10元
  33. book_list3 = jsonpath.jsonpath(obj,'$..book[?(@.price > 10)]')
  34. print(book_list3)

获取淘票票地址

  1. # -*- coding: utf-8 -*-
  2. import urllib.request
  3. import jsonpath
  4. import json
  5. url = 'https://dianying.taobao.com/cityAction.json?activityId&_ksTS=1636777395914_131&jsoncallback=jsonp132&action=cityAction&n_s=new&event_submit_doGetAllRegion=true'
  6. header = {
  7. # ':authority':' dianying.taobao.com',
  8. # ':method':' GET',
  9. # ':path':' /cityAction.json?activityId&_ksTS=1636777395914_131&jsoncallback=jsonp132&action=cityAction&n_s=new&event_submit_doGetAllRegion=true',
  10. # ':scheme':' https',
  11. # 'accept-encoding':' gzip, deflate, br',
  12. 'cookie':' thw=cn; t=9ef04f246b9aed1c2e1f0236b10986e8; sgcookie=E100iZ7WJj4QacdoVsug7ML%2Box4YrnJrwZ8nuArKTbnd1xnv2%2BmbW%2F3DqKj2VPczwTwq603RD7vZiwdAP%2BkcGVryl%2FP4cYu6Pqfk7c%2BiMNx9Dbw%3D; tracknick=%5Cu91CC%5Cu5965%5Cu9171; _cc_=V32FPkk%2Fhw%3D%3D; cookie2=12e513275306c8a6337fc33148bee081; v=0; _tb_token_=3af35de6f715e; cna=64jtGcprQ3QCAQHAnALV+amn; xlly_s=1; l=eBaPEC-gOW_zmVkUBO5ZPurza77O3IRb4sPzaNbMiInca1Sf9F9cBNCdtZueWdtjgtCAdexrrNYcMRLHR3qM5c0c07kqm07t3xvO.; isg=BE1NmaUEEKNGvYrYowNhWAc3XGnHKoH8QdIFv4_SF-RThm04VXsgzP-Y8BrgRpm0; tfstk=c1e1Bp_yzFY1wc52QlsebdtmW1MVZixSc1ggfSdutMbc-vE1iCvrPc97iEHqDD1..',
  13. 'referer': 'https://dianying.taobao.com/',
  14. 'user-agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44',
  15. }
  16. request = urllib.request.Request(url=url,headers=header)
  17. reponse = urllib.request.urlopen(request)
  18. content = reponse.read().decode('utf-8')
  19. #split 切割
  20. content = content.split('(')[1].split(')')[0]
  21. print(content)
  22. with open('taopiaopiao.json','w',encoding='gbk') as fp:
  23. fp.write(content)
  24. obj = json.load(open('taopiaopiao.json'))
  25. city_list = jsonpath.jsonpath(obj,'$..regionName')
  26. print(city_list)

Bs4

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <div>
  9. <ul>
  10. <li id ="liao1">张三</li>
  11. <li id = "l2">李四</li>
  12. <li>王五</li>
  13. <a href="" class="a1">里奥奥</a>
  14. <span>test hahahah</span>
  15. </ul>
  16. </div>
  17. <a href="" title="a2">baidu</a>
  18. <div id="d1">
  19. <span>
  20. 笑死我了,全是男同
  21. </span>
  22. </div>
  23. <p id="wuhu" class="qwq">wdnmd</p>
  24. </body>
  25. </html>
  1. from bs4 import BeautifulSoup
  2. #通过解析本地文件,来将bs4的基础语法进行讲解
  3. #默认打开的文件的编码格式是gbk,所以需要指定编码
  4. soup = BeautifulSoup(open('test.html',encoding='utf-8'),'lxml')
  5. #1.根据标签名字查找节点
  6. #注意:找到是第一个符合条件的数据
  7. print(soup.a) #查到第一个a标签的内容
  8. print(soup.a.attrs) #展示标签的属性和属性值
  9. #bs4的一些函数
  10. # 1.find
  11. #和soup.a差不多,不过可以使用一些条件
  12. print(soup.find('a'))
  13. print(soup.find('a',title="a2"))
  14. #根据class的值找到对应的标签对象,class是内置关键字,需要加个下划线
  15. print(soup.find("a",class_="a1"))
  16. # 2.find_all
  17. #返回一个列表,并且返回所有a标签
  18. print(soup.find_all('a'))
  19. #以列表表示,同时查找a和span标签
  20. print(soup.find_all(['a','span']))
  21. #查找所有的li标签数据,并且只查找显示前两位
  22. print(soup.find_all('li',limit=2))
  23. # 3.select(推荐)
  24. #select返回列表,并且返回多个数据
  25. print(soup.select('a'))
  26. #可以通过 “.” 代表class。该用法为类选择器
  27. print(soup.select('.a1'))
  28. #可以通过 “#” 代表id
  29. print(soup.select('#liao1'))
  30. #属性选择器
  31. #查找到li标签中有id的标签
  32. print(soup.select('li[id]'))
  33. #查找到li标签中id为liao1的标签
  34. print(soup.select('li[id="l2"]'))
  35. #层级选择器
  36. #后代选择器
  37. #找到div下面的li
  38. print(soup.select('div li'))
  39. #子代选择器
  40. #获取某标签的第一级子标签
  41. #注意:很多的计算机编程语言中,不加空格会出现问题
  42. print(soup.select('div > ul > li'))
  43. #找到a标签和li标签的所有对象
  44. print(soup.select('a,li'))
  45. #节点信息
  46. #获取节点内容
  47. obj = soup.select('#d1')[0]
  48. #如果标签对象中只有内容,string和get_text都可以使用。
  49. #如果标签对象中除了内容,还有标签,那么string就获取不到数据 而get_text可以
  50. # print(obj.string)
  51. print(obj.get_text()) #推荐
  52. #节点的属性
  53. obj = soup.select('#wuhu')[0]
  54. #name 是标签的名字
  55. #attrs将属性值作为字典返回
  56. print(obj.name)
  57. #获取节点的属性
  58. obj = soup.select('#wuhu')[0]
  59. print(obj.attrs.get('class'))
  60. print(obj.get('class'))
  61. print(obj['class'])

爬取星巴克数据

  1. from bs4 import BeautifulSoup
  2. import urllib.request
  3. #目标网站地址
  4. base_url = 'https://www.starbucks.com.cn/menu/'
  5. #模拟浏览器访问数据
  6. response = urllib.request.urlopen(base_url)
  7. #获取数据
  8. content = response.read().decode('utf-8')
  9. #通过解析,来将bs4的基础语法进行讲解
  10. soup = BeautifulSoup(content,'lxml')
  11. obj = soup.select('div > ul > li > a > strong')
  12. for i in range(len(obj)):
  13. print(obj[i].get_text())

selenium

1比1模仿浏览器访问页面,是有界面的

  1. import urllib.request
  2. from selenium import webdriver
  3. #创建浏览器操作对象
  4. path = 'msedgedriver.exe'
  5. #创建浏览器
  6. browser = webdriver.Edge(path)
  7. #访问网站
  8. base_url = 'https://www.jd.com'
  9. #打开页面
  10. browser.get(base_url)
  11. #page_source获取网页源码
  12. content = browser.page_source
  13. print(content)

selenium的元素定位

  1. from selenium import webdriver
  2. #设置文件路径
  3. path = 'msedgedriver.exe'
  4. #设置模拟浏览器
  5. browser = webdriver.Edge(path)
  6. base_url = 'https://www.baidu.com'
  7. #访问网页
  8. browser.get(base_url)
  9. #元素定位
  10. #根据id找到对象 ★
  11. button = browser.find_element_by_id('su')
  12. print(button)
  13. #根据标签属性的属性值来获取对象的
  14. button = browser.find_element_by_name('wd')
  15. print(button)
  16. #根据xpath语句来获取对象 ★
  17. button = browser.find_element_by_xpath('//input[@id="su"]')
  18. print(button)
  19. #根据标签名字来获取对象
  20. button = browser.find_element_by_tag_name('input')
  21. print(button)
  22. #使用bs4的语法来实现的 ★
  23. button = browser.find_element_by_css_selector('#su')
  24. print(button)
  25. #根据a标签的名称获取对象
  26. button = browser.find_element_by_link_text('直播')
  27. print(button)

selenium获取元素信息

  1. from selenium import webdriver
  2. #设置文件路径
  3. path = 'msedgedriver.exe'
  4. browser = webdriver.Edge(path)
  5. #设置访问的网页
  6. base_url ='http://www.baidu.com'
  7. #开始访问网页
  8. browser.get(base_url)
  9. #获取元素一些变量
  10. input = browser.find_element_by_id('su')
  11. #获取元素属性
  12. print(input.get_attribute('class'))
  13. #获取元素文本
  14. a = browser.find_element_by_link_text('新闻')
  15. print(a.text)
  16. #获取元素tag标签
  17. print(input.tag_name)

selenium交互

  1. from selenium import webdriver
  2. import time
  3. #创建浏览器对象
  4. path = 'msedgedriver.exe'
  5. #设置需要用到的浏览器类型
  6. browser = webdriver.Edge(path)
  7. #设置需要打开的url
  8. base_url = 'https://www.baidu.com'
  9. browser.get(base_url)
  10. #当打开浏览器时休息两秒
  11. time.sleep(2)
  12. #获取文本框的对象
  13. input = browser.find_element_by_id('kw')
  14. #在文本框输入周杰伦
  15. input.send_keys('周杰伦') #发送一个值为周杰伦
  16. time.sleep(2)
  17. #获取百度一下的按钮
  18. button = browser.find_element_by_id('su')
  19. #点击按钮
  20. button.click()
  21. time.sleep(2)
  22. #滑倒底部
  23. js_bottom = 'document.documentElement.scrollTop=100000'
  24. browser.execute_script(js_bottom)
  25. time.sleep(2)
  26. #获取下一页那妞
  27. next_page = browser.find_element_by_xpath('//a[@class="n"]')
  28. #点击下一页
  29. next_page.click()
  30. time.sleep(2)
  31. #回到上一页
  32. browser.back()
  33. time.sleep(2)
  34. #再次回去
  35. browser.forward()
  36. time.sleep(2)
  37. #退出
  38. browser.quit()

handless

没有界面

  1. from selenium import webdriver
  2. from selenium.webdriver.chrome.options import Options
  3. #封装的handless
  4. def share_browser():
  5. chrome_options = Options()
  6. chrome_options.add_argument('--headless')
  7. chrome_options.add_argument('--disable-gpu')
  8. # path是你自己的浏览器路径
  9. path = r'C:\Program Files\Google\Chrome\Application\chrome.exe'
  10. chrome_options.binary_location = path
  11. browser = webdriver.Chrome(chrome_options=chrome_options)
  12. return browser
  13. browser = share_browser()
  14. base_url = 'https://www.baidu.com'
  15. browser.get(base_url)
  16. #截图
  17. browser.save_screenshot('baidu.png')

request

  1. r.text 获取网页源码
  2. r.encoding 访问或定制编码方式
  3. r.url 获取请求的url
  4. r.content 响应的字节类型
  5. r.status_code 响应的状态码
  6. r.headers 响应的头信息
  1. import requests
  2. #网页网址
  3. base_url = 'https://www.baidu.com'
  4. response = requests.get(url=base_url)
  5. #设置相应的编码格式
  6. response.encoding = 'utf-8'
  7. #一个类型和一个属性
  8. print(type(response))
  9. #以字符串的形式来返回网页的源码
  10. print(response.text)
  11. print(response.url)
  12. print(response.content)
  13. print(response.status_code)
  14. print(response.headers)

request_get请求

  1. import requests
  2. #网页的路径
  3. url = 'http://www.baidu.com/s?'
  4. #请求头
  5. headers = {
  6. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34"
  7. }
  8. #跟在后面的数据
  9. data = {
  10. 'wd': '北京'
  11. }
  12. #使用get请求,url:地址 params:后面跟着的数据 header:请求头
  13. response = requests.get(url=url, params=data, headers=headers)
  14. #获取内容
  15. content = response.text
  16. print(content)

request_post请求

  1. import requests
  2. import json
  3. base_url = 'https://fanyi.baidu.com/sug'
  4. header = {
  5. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34"
  6. }
  7. data = {
  8. "kw": "eye"
  9. }
  10. # url 请求地址
  11. # data 请求参数
  12. # kwargs 字典
  13. response = requests.post(url=base_url, data=data, headers=header)
  14. content = response.text
  15. obj = json.loads(content)
  16. print(obj)

requests_验证码登录

  1. # 通过登录进入到主页面
  2. import requests
  3. from bs4 import BeautifulSoup
  4. import urllib.request
  5. # 登录页面的url地址
  6. base_url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
  7. header = {
  8. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34"
  9. }
  10. # 获取页面的源码
  11. response = requests.get(url=base_url, headers=header)
  12. content = response.text
  13. # print(content)
  14. # 解析页面源码 然后获取 __VIEWSTAT,__VIEWSTATEGENERATOR
  15. soup = BeautifulSoup(content, 'lxml')
  16. # 获取__VIEWSTAT
  17. viewstate = soup.select('#__VIEWSTATE')[0].attrs.get('value')
  18. # 获取VIEWSTATEGENERATOR
  19. viewstategenerator = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')
  20. # 获取验证码图片
  21. code = soup.select('#imgCode')[0].attrs.get('src')
  22. code_url = 'https://so.gushiwen.cn' + code
  23. # urllib.request.urlretrieve(url=code_url, filename='yzm.jpg')
  24. #通过requests的方法,session,能使请求变为一个对象
  25. session = requests.session()
  26. #验证码url的内容
  27. response_code = session.get(code_url)
  28. #此时不能用text,要用二进制 content
  29. content_code = response_code.content
  30. #wb 将二进制写入到文件
  31. with open('code.jpg','wb')as fp:
  32. fp.write(content_code)
  33. # 获取验证码之后,下载本地,然后手动输入验证码
  34. code_name = input("请输入你的验证码:")
  35. # 点击登录
  36. url_post = "https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx"
  37. data_post = {
  38. "__VIEWSTATE": viewstate,
  39. "__VIEWSTATEGENERATOR": viewstategenerator,
  40. "from": "http://so.gushiwen.cn/user/collect.aspx",
  41. "email": "1182350036@qq.com",
  42. "pwd": "mly118235",
  43. "code": code_name,
  44. "denglu": "登录",
  45. }
  46. #此时不能用requests,必须用session
  47. response_post = session.post(url=url_post,headers=header,data=data_post)
  48. content_post = response_post.text
  49. with open('gushiwen.html','w',encoding='utf-8')as fp:
  50. fp.write(content_post)