zoukankan      html  css  js  c++  java
  • Python(六) —— 网络请求

    接口调用

      接口调用有几个模块可以用:urllib 和 requests ,urllib 是内置的模块,极其不好用,强烈推荐用 requests 模块

    get 请求

    1、普通的 get 请求

    import requests
    url = 'http://api.nnzhp.cn/api/user/stu_info'
    res = requests.get(url)

    2、下载文件

    比如说下载一个 qq 号对应的头像:url 为:http://q4.qlogo.cn/g?b=qq&nk=2422156774&s=140

    要下载的话,要以二进制形式下载,存也是以二进制方式去存

    url = 'http://q4.qlogo.cn/g?b=qq&nk=2422156774&s=140'
    req = requests.get(url)
    with open('头像.jpg','wb') as fw:
        fw.write(req.content)   #content 返回的是二进制类型

    post 请求

    1、form 形式:

    url = 'http://api.nnzhp.cn/api/user/login'
    
    data = {
        'username':'niuhanyang',
        'passwd':'aA123456'
    }
    
    requests.post(url,data)

    2、发送 json 形式

    url = 'http://api.nnzhp.cn/api/user/add_stu'
    data =  {
        "name":"甘子文666",
        "grade":"天蝎座",
        "phone":18612532946,
        "sex":"",
        "age":28,
        "addr":"河南省济源市北海大道32号"
      }
    
    res = requests.post(url,json=data)
    print(res.text)

    3、添加 header / cookie

    注意,传 cookie 和 header 要指定一下,因为除 url,data,json 为位置参数外,其他的参数均为:**kwargs

    方式1:只添加 cookie,coookie 内以字典方式存进去

    url2 = 'http://api.nnzhp.cn/api/user/gold_add'
    data = {
        'stu_id':2,
        'gold':10086
    }
    cookie = {
        'niuhanyang':'1e7eb92afb46a529f8b30605ed0b6c09'
    }
    res = requests.post(url2,data,cookies = cookie)
    print(res.text)

    方式2:直接把 cookie 放进 header 传进去(推荐用此方法,在 cookie 贼啦长的时候,就知道为啥要用这个了 

    url2 = 'http://api.nnzhp.cn/api/user/gold_add'
    data = {
        'stu_id':2,
        'gold':10086
    }
    header = {'cookie':'niuhanyang=1e7eb92afb46a529f8b30605ed0b6c09'}
    res = requests.post(url2,data,headers = header)
    print(res.text)

    4、上传文件

    注意上传要先将文件以二进制形式打开,再上传

    url = 'http://api.nnzhp.cn/api/file/file_upload'
    data = {'file':open('a.py','rb')}   #rb 的意思是将文件以二进制形式打开
    res = requests.post(url,files = data)
    print(res.text)

     

    Response

    响应头

    import requests
    url = 'www.xxx.xxx'
    r = requests.get(url)
    
    print(r.headers) #获得响应头信息,返回的是一个字典形式
    print(r.headers['Content-Type'])
    print(r.headers.get('Content-Length'))

    响应状态码

    import requests
    url = 'www.xxx.xxx'
    r = requests.get(url)
    print(r.status_code) #响应状态码,返回一个 int 类型数字,参加状态码
    
    print(r.status_code==requests.codes.ok) #内置状态码查询对象
    r.raise_for_status() #通过 Response.raise_for_status() 来抛出异常

    响应的 cookie

    返回的是一个 dict 类型

    import requests
    url = 'www.xxx.xx'
    r = requests.get(url)
    
    print(r.cookies)
    
    print(r.cookies['bid'])

    响应信息

    import requests
    url = 'http://api.nnzhp.cn/api/user/stu_info'
    d = {'stu_name':'矿泉水2'}
    res = requests.get(url,d).json()  #返回一个字典
    res = requests.get(url,d).text  #返回一个字符串,假设数据类型为 json 类型,那么这个返回的就是格式化好的 json 串
    
    print(res)

     .content 和 .text 的用法区别

    requests对象的get和post方法都会返回一个Response对象,这个对象里面存的是服务器返回的所有信息,包括响应头,响应状态码等。其中返回的网页部分会存在.content和.text两个对象中。

    .content中间存的是字节码 .text存的是.content编码后的字符串

    一般来说 .text直接用比较方便 返回的是字符串 但是有时候会解析不正常导致

    返回的是一堆乱码这时用.content.decode('utf-8')就可以使其显示正常。

    总的来说.text是现成的字符串,.content还要编码,但是.text不是所有时候显示都正常,这是就需要用.content进行手动编码。

    对requests获取的原始数据,有两种获取形式,一个是r.content一个是r.text。

    二者的区别在于content返回的是byte型数据,而text返回的是Unicode数据,也就是说text对原始数据进行的特殊的编码,而这个编码方式是基于对原始数据的猜测(响应头),

    text一般用于返回的文本
    content的一般用于对返回的其他数据类型

    但是对于某些网站的中文用text可能会导致返回乱码,所以最好是使用content然后自己进行重新编码。

    最终结论是:

    text 返回的是unicode 型的数据,一般是在网页的header中定义的编码形式。

    content返回的是bytes,二级制型的数据。

    也就是说你如果想要提取文本就用text,但是如果你想要提取图片、文件,就要用到content

  • 相关阅读:
    Tomcat 服务器体系结构
    tomcat的下载和启动
    tomcat解决端口号占用问题
    我的wmware
    Xshell的使用
    GCC的-wl,-rpath=参数
    Matlab图像处理(01)-Matlab基础
    CMake最好的学习资料
    使用valgrind进行内存泄漏和非法内存操作检测
    CLion提示can't find stdio.h等错误
  • 原文地址:https://www.cnblogs.com/xiaowenshu/p/10854070.html
Copyright © 2011-2022 走看看