循环

  1. 使用 for 循环 打印一个99乘法表。
    1. for x in range(1,10):
    2. for y in range(1,x+1):
    3. print(f"{y} * {x}",end="\t")
    4. print() # 换行
    image.png

  1. for x in range(9,0,-1):
  2. for y in range(9,x-1,-1):
  3. print(f"{y} * {x}",end="\t")
  4. print() # 换行

image.png

  1. 生成随机的身份证号 (1950—2020之间)。

身份证号 前6位 可以从csv文件中读取,随机获取一个。 参考实现 https://www.yuque.com/imhelloworld/bypiud/hr988g#kWgZ5
中间8位, 分别是年月日
年 四位 从 1950-2020 随机
月 两位 01- 12 注意随机的时候, 当随机值 小于10 前面补0 比如 9月 应该是 09
日 需要注意
值 小于10 前面补0 比如 9月 应该是 09
不同的月 不一样
后4位 注意最后一位 可能是 X
生成之后分别将 前6位,中间8位,最后4位 作为字符串拼接一下即可。

# 导入 csv 模块
import csv
import random

#创建一个空的列表
all_code = []
# 读取 gb2260.csv 文件
with open(file='gb2260.csv',encoding='utf8',mode='r') as f:
    # 使用csv 创建读取对象
    cr = csv.reader(f)
    for code in cr:
        # print(code, type(code),code[0])
        # 每次获取一个code 将code值存放在 all_code 中
        all_code.append(code[0])

# 等文件读取完成之后 all_code中存放了所有的 code值
# print(all_code)

# 使用random 随机从 all_code  中选择一个
cd = random.choice(all_code)
print(f"随机选中地区码:{cd}")

# 生成年月日
# 生成年份
y = random.randint(1950,2020)
print(f"生成的年份:{y}")
# 生成月份
m = random.randint(1,12)
if m < 10:
    # 月份前面补0,将数字转换位字符串
    m = "0" + str(m)
print(f"生成的月份:{m}")
# 生成天
# 根据月份和年份
# 1 当月份为 1,3,5,7,8,10,12 月,天数31天
if int(m) in [1,3,5,7,8,10,12]:
    d = random.randint(1,31)
# 2,当月份为 4,6,9,11 月 天数是30天
elif int(m) in [4,6,9,11]:
    d = random.randint(1,30)
# 3.2月份分为平年和闰年, 如果是闰年的29天
# 公元年分为4的倍数但非100的倍数 或者 为400的倍数
elif (y % 4 == 0 and y%100 != 0) or y%400==0:
    d = random.randint(1,29)
# 以上都不符合,那就是平年的2月份
else:
    d = random.randint(1,28)
# 如果d小于10 ,需要补0
if d<10:
    d = "0"+str(d)
print(f"生成的日期:{d}")

# 生成后4位 最后1位可X

l3 = ""
# 循环三次
for i in range(3):
    # 每次都生成一个随机数字进行拼接
    l3 = l3+ str(random.randint(0,9))
# 最后一位有可能是X,也可能是数字 
l1 = random.choice([0,1,2,3,4,5,6,7,8,9,"X"])
print(f"生成的最后四位: {l3}{l1}")

print(f"生成随机的身份证号: {cd}{y}{m}{d}{l3}{l1}")
  1. 根据如下代码, 将数字按照对应的映射关系进行转化。 ```python map_dict = { 0:”零”, 1:”一”, 2:”二”, 3:”三”, 4:”四”, 5:”五”, 6:”六”, 7:”七”, 8:”八”, 9:”九” } nums = [123,506,709]

    写段程序 上面nums中的数字 换成汉字。进行转换输出

    [“一二三”,”五零六”,”七零九”]
建立映射关联,通过循环获取每个值,进行数据转换。
```python
map_dict = {
    0:"零",
    1:"一",
    2:"二",
    3:"三",
    4:"四",
    5:"五",
    6:"六",
    7:"七",
    8:"八",
    9:"九"
}
nums = [123,506,709]
nums_str = []
# 循环列表
for num in nums:
    print(num)
    # 将列表中的数字转换为字符串 进行循环
    num_str = ""
    for n in str(num):
        print(n,type(n))  # 字符串
        #  n转换为数字 根据字典添加映射
        print( map_dict[int(n)])
        # 字符串拼接
        num_str = num_str +  map_dict[int(n)]
    print(num_str)
    nums_str.append(num_str)

print(nums_str)

函数

将生成身份号的代码封装在三个函数中。

def get_code():
    """
    主要是生成随机的前6位
    """

def get_ymd():
    """
    主要是生成随机的4位年 2位月 2位 日
    """

def get_last():
    """
    生成身份证号的后4位
    """

通过调用三个函数 可以组合生成一个随机的身份证号。

import csv
import random
def get_code():
    """
    主要是生成随机的前6位
    """
    # 创建一个空的列表
    all_code = []
    # 读取 gb2260.csv 文件
    with open(file='gb2260.csv', encoding='utf8', mode='r') as f:
        # 使用csv 创建读取对象
        cr = csv.reader(f)
        for code in cr:
            # print(code, type(code),code[0])
            # 每次获取一个code 将code值存放在 all_code 中
            all_code.append(code[0])

    # 等文件读取完成之后 all_code中存放了所有的 code值
    # print(all_code)

    # 使用random 随机从 all_code  中选择一个
    cd = random.choice(all_code)
    print(f"随机选中地区码:{cd}")
    return cd

def get_ymd():
    """
    主要是生成随机的4位年 2位月 2位 日
    """
    # 生成年月日
    # 生成年份
    y = random.randint(1950, 2020)
    print(f"生成的年份:{y}")
    # 生成月份
    m = random.randint(1, 12)
    if m < 10:
        # 月份前面补0,将数字转换位字符串
        m = "0" + str(m)
    print(f"生成的月份:{m}")
    # 生成天
    # 根据月份和年份
    # 1 当月份为 1,3,5,7,8,10,12 月,天数31天
    if int(m) in [1, 3, 5, 7, 8, 10, 12]:
        d = random.randint(1, 31)
    # 2,当月份为 4,6,9,11 月 天数是30天
    elif int(m) in [4, 6, 9, 11]:
        d = random.randint(1, 30)
    # 3.2月份分为平年和闰年, 如果是闰年的29天
    # 公元年分为4的倍数但非100的倍数 或者 为400的倍数
    elif (y % 4 == 0 and y % 100 != 0) or y % 400 == 0:
        d = random.randint(1, 29)
    # 以上都不符合,那就是平年的2月份
    else:
        d = random.randint(1, 28)
    # 如果d小于10 ,需要补0
    if d < 10:
        d = "0" + str(d)
    print(f"生成的日期:{d}")
    return str(y)+str(m)+str(d)

def get_last():
    """
    生成身份证号的后4位
    """
    l3 = ""
    # 循环三次
    for i in range(3):
        # 每次都生成一个随机数字进行拼接
        l3 = l3 + str(random.randint(0, 9))
    # 最后一位有可能是X,也可能是数字
    l1 = random.choice([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "X"])
    print(f"生成的最后四位: {l3}{l1}")
    return str(l3)+str(l1)


if __name__ == '__main__':
    userId = get_code()+get_ymd()+get_last()
    print(f"生成随机的的身份证号: {userId}")

使用requests库参考 注册接口编写 登录接口。要求能够登录成功。

# 导入 requests 模块
import requests

# 接口的文档地址:http://49.233.108.117:28019/swagger-ui.html#/


def test_regiseter():
    # 定义注册用户的地址
    url = "http://49.233.108.117:28019/api/v1/user/register"
    # 定义请求数据
    bodydata= {
      "loginName": "13212312312",
      "password": "123456"
    }
    # 发送请求  url= 表示请求地址, json= 请求数据为json格式
    r = requests.post(url=url,json=bodydata)
    # r 是整个服务器返回的结果
    print("状态码:", r.status_code)
    # 服务器返回结果
    print("结果:", r.json())

def test_login():
    pass

# 导入 requests 模块
import requests

# 接口的文档地址:http://49.233.108.117:28019/swagger-ui.html#/


def test_regiseter():
    # 定义注册用户的地址
    url = "http://49.233.108.117:28019/api/v1/user/register"
    # 定义请求数据
    bodydata= {
      "loginName": "13212312312",
      "password": "123456"
    }
    # 发送请求  url= 表示请求地址, json= 请求数据为json格式
    r = requests.post(url=url,json=bodydata)
    # r 是整个服务器返回的结果
    print("状态码:", r.status_code)
    # 服务器返回结果
    print("结果:", r.json())

def test_login():
    url = "http://49.233.108.117:28019/api/v1/user/login"
    bodydata = {
      "loginName": "13212312312",
      "passwordMd5": "E10ADC3949BA59ABBE56E057F20F883E"
    }
    r = requests.post(url,json=bodydata)
    print(r.status_code)
    print(r.json())

自动化作业

  1. 给接口添加对应的断言。 ```python

import requests import random

随机生成手机号码

phone = random.randint(13000000000,13999999999) jsondata = { “token”:None, “goodsid”:None, }

def test_register():

# 定义注册用户的地址
url = "http://49.233.108.117:28019/api/v1/user/register"
# 定义请求数据
bodydata = {
    "loginName": str(phone),
    "password": "123456"
}
print(bodydata)
# 发送请求  url= 表示请求地址, json= 请求数据为json格式
r = requests.post(url=url, json=bodydata)
# r 是整个服务器返回的结果
print("状态码:", r.status_code)
# 服务器返回结果
print("结果:", r.json())

def test_login(): url = “http://49.233.108.117:28019/api/v1/user/login“ bodydata = { “loginName”: str(phone), “passwordMd5”: “E10ADC3949BA59ABBE56E057F20F883E” } print(bodydata) r = requests.post(url, json=bodydata) print(r.status_code) print(r.json())

# 将token提取出来 放在 字典格式数据中  - 上游传参
jsondata["token"] = r.json()["data"]

def test_search(): url = “http://49.233.108.117:28019/api/v1/search

# 信息头数据  下游接口中使用到这个值
headerdata = {
    "token": jsondata["token"]
}

# 请求参数
querydata = {
    "keyword": "iphone"
}
# 发送get 请求 params get请求的参数, headers 请求头数据
r = requests.get(url=url,params=querydata,headers=headerdata)
print(r.status_code)
print(r.json())
# 所有的商品 存放在一个列表中
all_goods = r.json()['data']['list']
# 创建空的列表
gids = []
# 循环列表 拿到每一个商品
for goods in all_goods:
    # 从商品中访问 goodsId
    gid = goods["goodsId"]
    print(gid)
    # 将商品id 放在列表中
    gids.append(gid)
# 循环结束 可以看到所有的商品id
print(gids)
# 随机选择一个 作为参数
jsondata["goodsid"] = random.choice(gids)

def test_add_cart(): url = “http://49.233.108.117:28019/api/v1/shop-cart

# 信息头数据  下游接口中使用到这个值
headerdata = {
    "token": jsondata["token"]
}
bodydata = {
    "goodsCount": random.randint(1,5),
    "goodsId": jsondata["goodsid"]
}
r = requests.post(url,json=bodydata,headers=headerdata)
print(r.status_code)
print(r.json())

---

```python

import requests
import random
# 随机生成手机号码
phone = random.randint(13000000000,13999999999)
jsondata = {
    "token":None,
    "goodsid":None,
}

def test_register():
    # 定义注册用户的地址
    url = "http://49.233.108.117:28019/api/v1/user/register"
    # 定义请求数据
    bodydata = {
        "loginName": str(phone),
        "password": "123456"
    }
    print(bodydata)
    # 发送请求  url= 表示请求地址, json= 请求数据为json格式
    r = requests.post(url=url, json=bodydata)
    # r 是整个服务器返回的结果
    print("状态码:", r.status_code)
    # 服务器返回结果
    print("结果:", r.json())
    assert r.status_code == 200
    assert r.json() == {'resultCode': 200, 'message': 'SUCCESS', 'data': None}


def test_login():
    url = "http://49.233.108.117:28019/api/v1/user/login"
    bodydata = {
        "loginName": str(phone),
        "passwordMd5": "E10ADC3949BA59ABBE56E057F20F883E"
    }
    print(bodydata)
    r = requests.post(url, json=bodydata)
    print(r.status_code)
    print(r.json())
    # 将token提取出来 放在 字典格式数据中  - 上游传参
    jsondata["token"] = r.json()["data"]
    assert r.status_code == 200
    assert r.json()["resultCode"] ==200
    assert r.json()["message"] == "SUCCESS"
    assert r.json()["data"] is not None


def test_search():
    url = "http://49.233.108.117:28019/api/v1/search"
    # 信息头数据  下游接口中使用到这个值
    headerdata = {
        "token": jsondata["token"]
    }

    # 请求参数
    querydata = {
        "keyword": "iphone"
    }
    # 发送get 请求 params get请求的参数, headers 请求头数据
    r = requests.get(url=url,params=querydata,headers=headerdata)
    print(r.status_code)
    print(r.json())
    # 所有的商品 存放在一个列表中
    all_goods = r.json()['data']['list']
    # 创建空的列表
    gids = []
    # 循环列表 拿到每一个商品
    for goods in all_goods:
        # 从商品中访问 goodsId
        gid = goods["goodsId"]
        print(gid)
        # 将商品id 放在列表中
        gids.append(gid)
        # 商品的goodsName中 包含 iphone
        # name:str 表示name变量的类型是字符串类型,主要为了下面写代码的有代码提示。 :str 这个可以去掉
        name:str = goods["goodsName"]
        #因为不区分大小写, name.lower()转换为小写   Apple iPhone 11 (A2223) =》 appple iphone 11 (a2223)
        # in 在 ... 里面
        assert 'iphone' in name.lower()
    # 循环结束 可以看到所有的商品id
    print(gids)
    # 随机选择一个 作为参数
    jsondata["goodsid"] = random.choice(gids)



def test_add_cart():
    url = "http://49.233.108.117:28019/api/v1/shop-cart"
    # 信息头数据  下游接口中使用到这个值
    headerdata = {
        "token": jsondata["token"]
    }
    bodydata = {
        "goodsCount": random.randint(1,5),
        "goodsId": jsondata["goodsid"]
    }
    r = requests.post(url,json=bodydata,headers=headerdata)
    print(r.status_code)
    print(r.json())

    assert r.json() == {'resultCode': 200, 'message': 'SUCCESS', 'data': None}
  1. 抓包批量下载图片。

在这个网站上抓包: https://movie.douban.com/
抓取热门电影image.png
接口返回结果中有 电影海报地址,以及电影的名称
将所有的电影海拔下载下来,文件名使用电影的名字。


在做这个练习的时候,因为豆瓣 有反爬虫机制, 发送请求的信息头如果不是浏览器的信息头,就不给返回结果。
image.png
我们写的代码中 默认的信息头 信息是 Python-Requests ,requests 这个库经常被用来作为爬虫,触发了网站的发爬虫机制。
所以在发送这个请求的时候,添加信息头。

def test_download_movie():
    url = "https://movie.douban.com/j/search_subjects"
    qeurydata = {
        "type":"movie",
        "tag":"最新",
        "page_limit":50,
        "page_start":0
    }
    heardersdata ={
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36"
    }
    r = requests.get(url=url,params=qeurydata,headers=heardersdata)
    print(r.request.headers)
    print(r.status_code)
    print(r.json())

执行可以看到运行的结果
image.png

参考答案

import requests
def test_download_movie():
    url = "https://movie.douban.com/j/search_subjects"
    qeurydata = {
        "type":"movie",
        "tag":"最新",
        "page_limit":50,
        "page_start":0
    }
    heardersdata ={
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36"
    }
    r = requests.get(url=url,params=qeurydata,headers=heardersdata)
    print(r.request.headers)
    print(r.status_code)
    print(r.json())
    # 循环服务器返回的结果
    for subject in r.json()["subjects"]:
        name = subject["title"]
        cover_url = subject["cover"]
        print(f"下面即将下载电影海报: 电影名:{name}, 海报地址{cover_url}")

        # 发送get请求 拿到服务器返回结果
        res = requests.get(url=cover_url,headers=heardersdata)
        # 使用open 保存文件, 使用name 电影名作为文件名
        with open(file=name+".png",mode='wb') as f:
            # 将图片信息保存进来
            f.write(res.content)
  • 使用for循环 循环接口返回的所有电影信息。
  • 在循环中,拿到每个电影的 海报地址,以及对应的电影名。进行下载。

python基础

跟定一组数据。分表统计出现的次数。

nums = [10,20,10,11,11,11,11,20,22,22,22,33,33,24]

结果为

{10:2,
 11:4,
 20:2,
 33:2,
 24:1,
 22:3}

主要思路: 利用集合数据类型的去重。
去统计每个元素的列表中的个数。


nums = [10,20,10,11,11,11,11,20,22,22,22,33,33,24]
# 将列表转换为集合
nums_set = set(nums)
print(nums_set)
nums_dict = {}
# 循环集合
for n in nums_set:
    # 获取里面的每个元素,拿到元素,可以去列表中统计对应的个数
    print(n,nums.count(n))
    # 将对应值放在字典中
    nums_dict[n] = nums.count(n)
# 循环完成之后 看字典
print(nums_dict)