官方说明
https://docs.python-requests.org/en/master/index.html

发送get 请求

浏览器抓包

使用 chrome 浏览器 打开 https://movie.douban.com/
使用【F12 】快捷键 或者 右键—【检查】 打开开发者工具
image.png

打开【网络】
image.png

在网页上 点击【热门】 观察【网络】—【所有请求】
image.png

通过分析 可以进行抓包
分析可以看到 请求的网址,请求方法

image.png

同时也要注意 请求标头 (请求头信息)
image.png

请求参数
image.png

服务器返回结果
image.png

通过分析: 可以得到 豆瓣电影的接口信息


请求方法: GET
请求路径: https://movie.douban.com/j/search_subjects
请求参数:

  1. {
  2. "type": "movie",
  3. "tag": "热门",
  4. "page_limit": 50,
  5. "page_start": 0
  6. }

请求头:
User-Agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36


服务器返回结果
image.png

根据抓到的包,现在使用Python的方式来模拟请求。

get 请求代码

  1. import requests
  2. url = "https://movie.douban.com/j/search_subjects"
  3. query_data = {
  4. "type": "movie",
  5. "tag": "热门",
  6. "page_limit": 50,
  7. "page_start": 0
  8. }
  9. # 发送get
  10. r = requests.get(url,params=query_data)
  11. # 请求头
  12. print(r.request.headers)
  13. print(r.status_code)
  14. print(r.text)

上面代码执行的时候,返回结果如下
image.png
并没有给我们返回具体的电影信息。

经过分析: 主要是因为发送的请求,请求头中 user-agent 是python的reqeusts。一般这个多用来作为爬虫,服务器拒绝这个请求返回结果。

定制请求头

在代码中需要添加信息头。

  1. import requests
  2. url = "https://movie.douban.com/j/search_subjects"
  3. query_data = {
  4. "type": "movie",
  5. "tag": "热门",
  6. "page_limit": 50,
  7. "page_start": 0
  8. }
  9. headers = {
  10. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"
  11. }
  12. # 发送get params 请求参数, headers 信息头
  13. r = requests.get(url,params=query_data,headers=headers)
  14. # 请求头
  15. print(r.request.headers)
  16. print(r.status_code)
  17. print(r.text)

查看服务器返回结果
image.png

post请求

用户注册接口
请求方式:POST
请求路径:http://49.233.108.117:28019/api/v1/user/register
请求headers

  1. Content-Type: application/json

请求body:

  1. {
  2. "loginName": "13388899999",
  3. "password": "123456"
  4. }

接口分析

这个接口主要难点:每次注册的时候 用户名不能一样。
用户使用的是 11位手机号,最好的方式是使用代码随机生成一个手机号。

随机手机号码

使用 random模块进行
https://docs.python.org/zh-cn/3/library/random.html

  1. import random
  2. def get_phone():
  3. """
  4. 生成随机的11位手机号码
  5. 手机号的前缀; ['13','17','18','15']
  6. 后面需要随机生成 9位数。
  7. :return:
  8. """
  9. # 手机号码前缀 从列表中随机选择其中的一个值
  10. pre_phone = random.choice(['13','17','18','15'])
  11. # 随机的一个值
  12. nums = ""
  13. for i in range(9):
  14. # 每次随机的时候 生成 0-9 之间的一个数字
  15. num = random.randint(0,9)
  16. # 每次生成一个新的随机值 做一次拼接
  17. nums = nums + str(num)
  18. # 前缀和后面的值拼接在一起 组成手机号
  19. return pre_phone+nums
  20. phone = get_phone()
  21. print(phone)

发送post请求注册

  1. import requests
  2. import random
  3. def get_phone():
  4. """
  5. 生成随机的11位手机号码
  6. 手机号的前缀; ['13','17','18','15']
  7. 后面需要随机生成 9位数。
  8. :return:
  9. """
  10. # 手机号码前缀 从列表中随机选择其中的一个值
  11. pre_phone = random.choice(['13','17','18','15'])
  12. # 随机的一个值
  13. nums = ""
  14. for i in range(9):
  15. # 每次随机的时候 生成 0-9 之间的一个数字
  16. num = random.randint(0,9)
  17. # 每次生成一个新的随机值 做一次拼接
  18. nums = nums + str(num)
  19. # 前缀和后面的值拼接在一起 组成手机号
  20. return pre_phone+nums
  21. url = "http://49.233.108.117:28019/api/v1/user/register"
  22. body_data = {
  23. "loginName": get_phone(), # 通过调用函数 生成手机号码
  24. "password": "123456"
  25. }
  26. # 发送 json 格式 post请求
  27. r = requests.post(url,json=body_data)
  28. # 状态码
  29. print(r.status_code)
  30. # 请求头
  31. print(r.request.headers)
  32. # 服务器返回结果
  33. print(r.text)
  34. print(r.json())

面试问题

  1. 接口中如果要添加额外的请求信息,比如信息头这些,你是怎么处理的?

    在reqeuests 请求中 添加 headers 参数,所有的请求头信息的内容 都放在字典数据格式中调用requests 传出去即可。

  1. 有些接口中的参数值 每次都不固定,你是怎么处理的?

自己封装函数,生成随机的值。
主要使用 random 模块
比如 注册接口中使用用户名每次都不一样。