Spider理论系列-python的数据类型

128 阅读12分钟

写在前面

为什么要把数据类型作为理论系列第一章呢?其实呢我们使用爬虫得到的数据需要处理,比如字符串,字典,列表,元组,我们爬取的数据就是这些类型,如何操作数据成为我们想要的.就需要熟练掌握这些数据类型的API,就像spider实战系列爬取一人之下那一文中​​Spider实战系列-抓取《一人之下第三季》_浅辄的技术博客_51CTO博客​​里的密钥解密那一部分,就使用了字符串替换.我个人是学Java出身的,因为Java是驼峰命名,而且还是个强类型语言,但python就不一样,定义一个变量就能使用,哈,其实有时候还是挺不方便的.

所以,爬虫要想学好,下面的数据类型操作要熟练使用.

数据类型

一.基础数据类型

  • int
#int:整数,加减乘除,大小比较
a=10
  • float
#float:小数
a=10.5
print(a)
print(10/3) #小数:数据范围是无限的。整数:在某一个特定的区间内是可以表示的很清楚的
#1~100000000

#0~1
#计算机是一个二进制的产品:0,1
#计算机表示一个小数是会有误差的,
  • boolean
#bool:用来做条件判断的
#     取值范围:True,False
#基础数据类型之间的转化
a ='10'
print(type(a))
b=int(a)#把字符串转化成int()
print(type(b))

a=10        #在python中,所有的非零的数字都是True,零是Fasle
b=bool(a)
print(type(b))
print(b)
while 1:    #死循环,恒为真
    print("给我钱")

s = ""#在python中,所有的非空字符串都是True,空字符串是False
print(bool(s))

#综上,在pythont中,表示空的东西都是False,不空的东西都是True

二.字符串

1.字符串格式化


    #字符串的格式化问题
    #我叫xxx,我住在xxx,我几年xxx岁,我喜欢xxx
    name = input("输入你的名字:")
    address = input("输入你的地址:")
    age = int(input("输入你的年龄:"))
    hobby = input("输入你的爱好:")
    # %s字符串占位
    # %d占位整数
    # %f占位小数
    s = "我叫%s,我住在%s,我几年%d岁,我喜欢%s" % (name,address,age,hobby)
    s1 = "我叫{},我住在{},我几年{},我喜欢{}".format(name,address,age,hobby)
    s2 = f"我叫{name},我住在{address},我几年{age},我喜欢{hobby}"# f-string
    print(s)

2.索引和切片

    # 索引和切片
    # 索引:按照位置提取元素
    s = "我叫Lee"
    # 可以采用索引的方式来提取某一个字符(文字)
    print(s[2])  # 程序员都是从0开始数数
    print(s[-1])  # -表示倒数

    # 切片:从一个字符串中提取一部分内容
    s = "我是Lee,你是小黄么"
    print(s[3:6])  # 从索引3位置进行切片,切到6结束 坑:切片拿不到第二个位置的元素
    # 语法:s[start:end]从start到end进行切片,但是取不到end[start,end)
    print(s[0:6])
    print(s[:6])  # 如果start是从开头进行切片,可以省略
    print(s[6:])  # 从start开始一直截取到末尾
    # : 如果左右两端有空白,表示开头或者结尾
    print(s[:])

    print(s[-3:-1])  # 目前还是只能从左往右切片
    print(s[-1:-3])  # 没结果,这是个坑!!!

    s = "我爱你"
    # 可以给切片添加步长来控制切片的方向
    print(s[::-1])  # 一表示从右往左
    # 语法:s[start:end:step]从start切到end,每step个元素选出来一个元素

    s="abcdefghijklmnopq"
    print(s[3:8:2])
    print(s[-1:-10:-3])

3.常用操作

    # 字符串常用操作
    # 字符串的操作一般不会对原字符串产生影响,一般是返回一个新的字符串
    # 3.1字符串大小写转换
    s = "python"
    s1 = s.capitalize()
    print(s1)

    s = "I have a dream!"
    s1 = s.title()  # 单词的首字母大写
    print(s1)

    s = "I HAVE A DREAM"
    s1 = s.lower()  # 变成小写字母
    print(s1)

    s = "i have a dream"
    s1 = s.upper()  # 把所有字母变成大写字母
    print(s1)

    # 如何忽略大小写来进行判断 =>  upper()
    verify_code = "xAd1"
    user_input = input(f"请输入验证码({verify_code}):")
    if verify_code.upper() == user_input.upper():
        print("验证码正确")
    else:
        print("验证码不正确")

4.切割和替换

    # 3.2替换和切割(*)
    # strip()       去掉字符串左右两端的空白符(空格,\t,\n)
    s = "    你好  ,  我是 Lee"
    s1 = s.strip()
    print(s1)

    # 案例
    username = input("请输入用户名:").strip()
    password = input("请输入密码:").strip()
    if username == "admain":
        if password == "123456":
            print("登陆成功")
        else:
            print("登陆失败!")
    else:
        print("登陆失败!")

    # replace(old,ne)字符串替换
    s = "你好呀,我是刘德华"
    s1 = s.replace("刘德华", "彭于晏")
    print(s1)

    a = "hello i am a good man!"
    a1 = a.replace("", "")  # 去掉所有的空格
    print(a1)

    # split(用什么切割) 字符串切割  用什么切,就会损失掉谁,
    a = "python_java_c_c#_javascript"
    lst = a.split("_")  # 切割之后的结果会放在列表当中
    print(lst)
    lst = a.split("_java")
    print(lst)

5.查找和替换

    # 查找和判断
    s = "你好啊,我是吴彦祖是"
    ret = s.find("我")  # 返回如果是一1就是没有该字符串出现   只会查找出第一次出现的
    print(ret)
    ret = s.index("我")  # 如果报错就是没有
    print(ret)

    print("我" in s)  # in可以做条件上的判断
    print("我" not in s)

    # 判断
    name = input("输入你的名字")
    # 判断你是不是姓张
    if name.startswith("李"):  # 判断字符串是否以KXXXX开头,endwith()
        print("你姓李")
    else:
        print("不姓李")

    money = input("请输入你的钱")
    if money.isdigit():     #判断字符串是否由整数组成,
        money = int(money)
        print("可以花钱了")
    else:
        print("对不起,你输入有误")

6.补充和总结

    # 补充和总结
    s = "hello"
    print(len(s))   #length长度
    #join()
    s = "python_java_c_javascript"
    lst = s.split("_")
    print(lst)

    lst = ["小黄","小楠","小李"]
    # 用_把上面的人名连起来
    s="_".join(lst)
    print(s)

总结

    """
    1.f“{变量}"格式化一个字符串
    2.索引和切片:
        索引:从0开始的.[]
        切片:s[start:end:step],end位置的数据永远拿不到
    3.相关操作:
        字符串操作对原字符串是不发生改变的,
        1.upper()在需要忽略大小写的时候
        2.strip()可以去掉字符串左右两端的空白(空格,\t,\n)
        3.replace()字符串替换
        4.split()对字符串进行切割
        5.join()拼接一个列表中的内容成为新字符串
        6.startswith()判断字符串是否以xxx开头
        7.1en()字符串长度(内置函数)
        
        字符串的循环和遍历
        for c in s:
            print(c)
        字符串中的每一个字符
        关于in:
            1.判断xxx是否在xxxx中出现了
            2.for循环
    """

三.列表

1.列表的概念

    # 定义:能装东西的东西
    # 在oython中用[]来表示一个列表,列表中的元素通过,隔开
    a = ["小黄", "小蓝", "小紫", [1, 2, "小灰", True]]
    # 特性:
    #   1.也像字符串一样也有索引和切片
    #   2.索引如果超过范围会报错
    #   3.可以用for循环进行遍历
    #   4.用len拿到列表的长度
    lst = ["小黄", "小蓝", "小紫", "小红"]
    print(lst[0])
    print(lst[1:3])
    print(lst[::-1])
    print(lst[33656])
    for item in lst:
        print(item)
    print(len(lst))

2.增删改查

    # 列表的增删改查
    lst = []
    # 向列表中添加内容
    lst.append("小黄")
    lst.append("小岚")
    lst.append("小仔")
    # insert()插入
    lst.insert(0, "小黑")
    # extend()可以合并两个列表
    lst.extend(["曹操", "刘备", "关羽"])
    print(lst)

    # 删除
    ret = lst.pop(3)  # 给出被删除的索引,返回被删除的元素
    print(lst)
    print(ret)
    lst.remove("小岚")  # 删除某个元素
    print(lst)

    # 修改
    lst[3] = "小希"
    print(lst)

    # 查询
    print(lst[3])  # 直接用索引进行查询操作

    # 其他操作
    # 排序
    lst = [1, 2, 3, "小黄", "Lee"]  # 列表会按照你存放的顺序来保存
    print(lst)

    lst = [132, 156, 654, 3216, 654, 6872, 6843, 7489]
    lst.sort()  # 对列表进行升序排序
    lst.sort(reverse=True)  # reverse: 翻转
    print(lst)

    # 列表的嵌套
    lst = ["abc", "def", ["123", "456", ["ghi", "lee", 789], 7]]
    print(lst[2][2][0])

    lst[2][2][1] = lst[2][2][1].upper()

    print(lst)

    # 列表的循环删除
    lst = ["小黄", "小蓝", "小紫", "小红", "Lee"]
    for item in lst:
        if item.startswith("小"):
            lst.remove(item)
    print(lst)  # 这样删除会删不干净,因为在删除一个元素后,会补上来一个元素

    lst = ["小黄", "小蓝", "小紫", "小红", "Lee"]
    temp = []  # 准备一个临时列表,负责存储要删除的内容
    for item in lst:
        if item.startswith("小"):
            temp.append(item)  # 把要删除的内容记录下来

    for item in temp:
        lst.remove(item)  # 去原列表中进行删除操作
    print(lst)

    # 安全稳妥的循环删除方式:
    #       将要删除的内容保存在一个新列表中,循环新列表,删除老列表

四.元组

    # tuple元组,特点:不可变的列表
    t = ["小黄", "小李", "小岚"]

    print(t)
    print(t[1:3])
    t[0] = "小楠"  # 'tuple' object does not support item assignment
    print(t)

    # 你固定了某些数据,不允许外界修改
    # 元组如果只有1个元素
    t=("小红")
    print(t)
    print(type(t)) #<class 'str'>

    #关于元组的不可变(坑)
    t=(1,2,3,["小岚","小吕"])
    t[3].append("小黄")
    print(t)    #(1, 2, 3, ['小岚', '小吕', '小黄'])

五.Set

    # set集合,set集合是无序的
    s = {1, 2, "小黑子", 3}
    print(type(s))
    print(s)

    s = {1, 2, 3, "油饼食不食", []}  # unhashable type: 'list'
    print(s)
    # 不可哈希:python中的set集合进行数据存储的时候.需要对数据进行哈希计算,根据计算出来的哈希值进行存储数据
    #         set集合要求存储的数据必须是可以进行哈希计算的,
    #         可变的数据类型,list,dict,set
    # 可哈希:不可变的数据类型,int,str,tuple,bool

    s = set()  # 创建空集合

    s.add("一个真正的鳗")
    s.add("小黑子")
    s.add("ikun")
    print(s)

    s.pop()  # 由于集合无序,测试的时候没法验证是最后一个,
    print(s)

    s.remove("小黑子")
    print(s)

    # 热想要修改,先删除,再新增
    s.remove("小黑子")
    s.add("我家哥哥")
    print(s)

    for item in s:
        print(item)

    # 交集,并集,差集
    s1 = {"哥哥", "下蛋", "一个真正的鳗"}
    s2 = {"ikun", "小黑子", "哥哥"}

    print(s1 & s2)  # 交集
    print(s1.intersection(s2))

    print(s1 | s2)  # 并集
    print(s1.union(s2))

    print(s1 - s2)  # 差集
    print(s1.difference(s2))

    # 重要的作用:可以去除重复
    s1 = {"周杰伦", "昆凌", "蔡依林", "侯佩岑"}
    print(s1)
    s1.add("周杰伦")
    print(s1)

    lst = ["周杰伦", "昆凌", "蔡依林", "侯佩岑", "周杰伦", "昆凌", "蔡依林", "侯佩岑", "周杰伦", "昆凌", "蔡依林", "侯佩岑"]
    print(lst)
    print(set(lst))
    print(list(set(lst)))  # 去除重复之后的数据是无序的。

使用set集合去重的操作

    baseRes = []
    needRes = []
    # FunList .append('a')       #可添加值
    baseRes = ['/XiuRen/12286.html', '/XiuRen/12286_1.html', '/XiuRen/12286_2.html', '/XiuRen/12286_3.html', '/XiuRen/12286_4.html', '/XiuRen/12286_5.html', '/XiuRen/12286_6.html', '/XiuRen/12286_7.html', '/XiuRen/12286_8.html', '/XiuRen/12286_9.html', '/XiuRen/12286_10.html', '/XiuRen/12286_11.html', '/XiuRen/12286_12.html', '/XiuRen/12286_13.html', '/XiuRen/12286_14.html', '/XiuRen/12286_15.html', '/XiuRen/12286_16.html', '/XiuRen/12286_17.html', '/XiuRen/12286_18.html', '/XiuRen/12286_19.html', '/XiuRen/12286_20.html', '/XiuRen/12286_21.html', '/XiuRen/12286_22.html', '/XiuRen/12286_23.html', '/XiuRen/12286_24.html', '/XiuRen/12286_25.html', '/XiuRen/12286_26.html', '/XiuRen/12286_27.html', '/XiuRen/12286_28.html', '/XiuRen/12286_29.html', '/XiuRen/12286_1.html', '/XiuRen/12286.html', '/XiuRen/12286_1.html', '/XiuRen/12286_2.html', '/XiuRen/12286_3.html', '/XiuRen/12286_4.html', '/XiuRen/12286_5.html', '/XiuRen/12286_6.html', '/XiuRen/12286_7.html', '/XiuRen/12286_8.html', '/XiuRen/12286_9.html', '/XiuRen/12286_10.html', '/XiuRen/12286_11.html', '/XiuRen/12286_12.html', '/XiuRen/12286_13.html', '/XiuRen/12286_14.html', '/XiuRen/12286_15.html', '/XiuRen/12286_16.html', '/XiuRen/12286_17.html', '/XiuRen/12286_18.html', '/XiuRen/12286_19.html', '/XiuRen/12286_20.html', '/XiuRen/12286_21.html', '/XiuRen/12286_22.html', '/XiuRen/12286_23.html', '/XiuRen/12286_24.html', '/XiuRen/12286_25.html', '/XiuRen/12286_26.html', '/XiuRen/12286_27.html', '/XiuRen/12286_28.html', '/XiuRen/12286_29.html', '/XiuRen/12286_1.html']   #可是预先设置
    print(baseRes)
    needRes= list(set(baseRes ))
    print(needRes)    #不重复但是乱序
    needRes.sort(key=baseRes .index)
    print(needRes)    #不重复且按原序

六.字典

1.概念

# 首先,字典是以键值对的形式进行存储数据的
# 字典的表示方式:{key:value,key2:value,key3:value}
dic = {"jay": "周杰伦", "鸡哥": "蔡徐坤"}

val = dic["jay"]
print(val)
# 字典的key必须是可哈希的数据类型
# 字典的value可以是任何数据类型
dic = {[]: 123}
print(dic)  # unhashable type: 'list'

dic={"ikun":["小黑子1号","小黑子2号"]}

2.增删改查


    dic = dict()

    dic["ikun"] = "小黄"
    dic[1] = "123"
    dic["ikun"] = "Lee"  # 覆盖前面的元素

    print(dic)

    dic.setdefault("湖南", "臭豆腐")  # 设置默认值.如果以前已经有了湖南了,setdefault就不起作用了
    dic.setdefault("湖南", "胡辣汤")
    print(dic)

    # 删除
    dic.pop("jay")  # 根据key去删除
    print(dic)

    # 查询
    print(dic["jay"])
    print(dic.get('jay'))
    print(dic["jay10086"])  # 如果key不存在,程序会报错. 当你确定你的key是没问题的,可以用
    print(dic.get('jay10086'))  # 如果key不存在,程序返回None. 程序返回None.当不确定你的key的时候,可以用

    # None
    a = None  # 单纯的就是空,表示没有的意思
    print(type(a))


    # 小案例
    dic = {
        "小黑子1号": "油饼食不食",
        "小黑子2号": "香精煎鱼",
        "小黑子3号": "我家哥哥下蛋你别吃",
        "小黑子4号": "一个真正的鳗",
        "小黑子5号": "香翅捞饭食不食"
    }
    name = input("输入你想看的小黑子话")
    val = dic.get(name)
    if val is None:
        print("你不是我们ikun的一员")
    else:
        print(val)

3.循环和嵌套

  • 循环

    dic = {
        "小黑子1号": "油饼食不食",
        "小黑子2号": "香精煎鱼",
        "小黑子3号": "我家哥哥下蛋你别吃",
        "小黑子4号": "一个真正的鳗",
        "小黑子5号": "香翅捞饭食不食"
    }
    # 1.可以用for循环,直接拿到key
    for key in dic:
        print(key, dic[key])

    # 2.希望把所有的ky全都保存在一个列表中
    print(list(dic.keys()))  # 拿到所有的key了

    # 3.希望吧所有的value都放在一个列表中
    print(list(dic.values()))

    # 4.直接拿到字典中的key和value
    print(dic.items())
    for key,val in dic.items():   #可以拿到所有的key 和 val
        # key = item[0]
        # val = item[1]
        # print(key, val)
        #key,val = item
        print(key,val)

    a, b = (1, 2)  # 元组或者列表都可以执行该操作,该操作被称为解构(解包)
    print(a)
    print(b)
  • 嵌套
ikun = {
    "name": "小黄",
    "age": 20,
    "quotes": {
        "quote1": "油饼食不食",
        "quote2": "香精煎鱼",
        "hobby": {
            "be1": "唱",
            "be2": "跳",
            "be3": "rap"
        }
    },
    "behave": [
        {"行为1": "唱", "哥哥1": "鲲鲲"},
        {"行为2": "跳", "哥哥2": "下蛋"},
        {"行为3": "rap", "哥哥3": "篮球"}
    ]
}

# 小黄语录的爱好的行为1
be1 = ikun["quotes"]["hobby"]["be1"]
print(be1)
# 小黄语录的爱好be2改为篮球
ikun["quotes"]["hobby"]["be2"] = "篮球"
print(ikun)
dic = {
    "1号小黑子": "油饼食不食",
    "2号小黑子": "香精煎鱼",
    "3号小黑子": "我家哥哥下蛋你别吃",
    "4号小黑子": "一个真正的鳗",
    "5号小黑子": "香翅捞饭食不食"
}

temp = []   # 存放即将要别除的key
for key in dic:
    if key.startswith("1"):
        temp.append(key)      #dictionary changed size during iteration

for t in temp:   #循环列表,删除字典中的内容
    dic.pop(t)
print(dic)