zoukankan      html  css  js  c++  java
  • requests模块发送POST请求

    在HTTP协议中,post提交的数据必须放在消息主体中,但是协议中并没有规定必须使用什么编码方式,从而导致了 提交方式 的不同。服务端根据请求头中的 Content-Type 字段来获知请求中的消息主体是用何种方式进行编码,再对消息主体进行解析。

    具体的编码方式包括如下:

    - application/x-www-form-urlencoded  # 以form表单形式提交数据,最常见也是大家最熟悉的 
    - application/json  # 以json串提交数据。 
    - multipart/form-data  # 上传文件

    下面使用requests来发送上述三种编码的POST请求。

    1.提交Form表单

    requests提交Form表单,一般存在于网站的登录,用来提交用户名和密码。以 http://httpbin.org/post 为例,在requests中,以form表单形式发送post请求,只需要将请求的参数构造成一个字典,然后传给requests.post()的data参数即可。

    代码如下:

    url = 'http://httpbin.org/post'
    d = {'key1': 'value1', 'key2': 'value2'}
    r = requests.post(url, data=d)  # requests.post() 中利用 data 属性
    print r.text

    输出效果如下:

    {
        "args":{},
        "data":"",
        "files":{},
        "form":{"key1":"value1","key2":"value2"},
        "headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate",
        "Connection":"close",
        "Content-Length":"23",
        "Content-Type":"application/x-www-form-urlencoded",
        "Host":"httpbin.org",
        "User-Agent":"python-requests/2.12.3"},
        "json":null,
        "origin":"113.140.11.122",
        "url":"http://httpbin.org/post"
    }

    httpbin.org 网站可以显示你提交请求的内容,输出的”Content-Type”:”application/x-www-form-urlencoded”,证明这是提交Form的方式。

    2.提交json串

    对于提交json串,主要是用于发送ajax请求中,动态加载数据。以拼多多网站为例,加载商品的方式为ajax,商品的内容在响应中。

    下面把请求头和请求实体列举一下:

    错误写法:

    import requests
    
    url = "http://jinbao.pinduoduo.com/network/api/common/goodsList"
    data ={"pageSize":60,"pageNumber":1,"withCoupon":0,"sortType":0}
    headers = {
        'Content-Type':'application/json; charset=UTF-8',
        'Host':'jinbao.pinduoduo.com',
        'Origin':'http://jinbao.pinduoduo.com',
        'Referer':'http://jinbao.pinduoduo.com/',
        'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Mobile Safari/537.36',
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        }
    r = requests.post(url=url,data =data,headers=headers)
    print(r.text)

    打印的内容如下:

    {"success":false,"errorCode":4000000,"errorMsg":"System Error","result":null}

    即使写上了 'Content-Type':'application/json; charset=UTF-8' ,返回依然出错了,原因就在于 你的请求实体的格式错了,服务端无法解码

    正确写法1:

    正确代码是把data进行json编码,再发送。代码如下:

    r = requests.post(url=url,data=json.dumps(data),headers=headers)  # 利用 json 对 字典序列化

    这个时候再看一下打印内容,已经正确返回商品内容了

    正确写法2:

    处理将data主动编码为json发送之外,requests还提供了一个json参数,自动使用json方式发送,而且在请求头中也不用显示声明 'Content-Type':'application/json; charset=UTF-8'。
    完整代码如下:

    import requests
    
    url = "http://jinbao.pinduoduo.com/network/api/common/goodsList"
    data ={"pageSize":60,"pageNumber":1,"withCoupon":0,"sortType":0}
    headers = {
        'Host':'jinbao.pinduoduo.com',
        'Origin':'http://jinbao.pinduoduo.com',
        'Referer':'http://jinbao.pinduoduo.com/',
        'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Mobile Safari/537.36',
    }
    r = requests.post(url=url,json =data,headers=headers)  # 直接把字典传给 requests.post() 的 json 参数
    print(r.text)

     

    3.上传文件:

    上传文件在爬虫中使用的很少,不过还是使用requests讲解一下使用方式。Content-Type类型为multipart/form-data,以multipart形式发送post请求,只需将一文件传给  requests.post() 的  files参数  即可。还是以  http://httpbin.org/post 为例,代码如下:

    url = 'http://httpbin.org/post'
    files = {'file': open('upload.txt', 'rb')}
    r = requests.post(url, files=files  # 文件传给 requests.post() 的 files 参数
    print(r.text)

    参考链接: https://blog.csdn.net/qiye_/article/details/80380955

  • 相关阅读:
    webpack-dev-server报错
    npm run dev 报错 run `npm audit fix` to fix them, or `npm audit` for details
    vscode里使用.vue代码模板的方法
    console.log()中的%d,%s等代表的输出类型
    使用Babel将单独的js文件 中的 ES6转码为ES5
    jQuery选择什么版本 1.x? 2.x? 3.x?
    在线jquery.min.js、vue.min.js引用
    WebSocket对象的“readyState”属性记录连接过程中的状态值
    vue项目中,使用vue-awesome-swiper插件实现轮播图
    vue-cli 项目里屏幕自适应
  • 原文地址:https://www.cnblogs.com/neozheng/p/10296830.html
Copyright © 2011-2022 走看看