requests补充
HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种。其中,POST 一般用来向服务端提交数据,本文主要讨论 POST 提交数据的几种方式。
这里主要讨论一下requests模仿浏览器请求的四种方式。
一、application/x-www-form-urlencoded
这种方式的传递参数,在requests中,属于get的方法。会有一个字典形式的数据,然后我们在请求的时候:
import requests url = 'https://i.cnblogs.com/EditPosts.aspx?opt=1'
parameter = {
'123': '456',
'234': '345'
}
r = requests.get(url, params=parameter)
这种请求方式比较常见,一般学requests的时候都会用到。
二、multipart/x-www-form-data
这种属于post中上传文件的方式,具体代码:
url = 'https://i.cnblogs.com/EditPosts.aspx?opt=1'
files = {'app_id': (None, '123456'),
'version': (None, '2256'),
'platform': (None, 'ios'),
'libzip': ('libmsc.zip', open('C:\Users\danwang3\Desktop\libmsc.zip', 'rb'), 'application/x-zip-compressed')
}
response = requests.post(url, files=files) # 代码是从http://blog.csdn.net/j_akill/article/details/43560293,拷贝来的,没有用过。
这种请求方式,在做爬虫的时候很少会遇见,如果有需求,requests也是可以实现这样的方式进行post提交的。
三、application/json
这种方式和第一种的使用率是一样的,都很高,也得益于json格式的流行。很常见的post请求数据格式。
import requests url = 'https://i.cnblogs.com/EditPosts.aspx?opt=1'
form_data = {
'123': '456',
'234': '345'
}
r = requests.get(url, data=form_data)
这种请求方式,代码也比较简洁,很常见。
它还有一种变种方式:request payload,这种是浏览器发送的ajax请求
{
number: "18047137483",
password: "",
randomPass: "",
sRand: "SSOLogin",
userLoginType: "4"
}
它的不同之处,是长得像字典,但是仔细一看不是字典,如果你写成字典,请求就会失败。
我们在模拟这样的请求的时候,需要使用到json
import json
import requests url = 'http://www.***'
data = {
'123': '654',
'abc': 'ddd',
}
form_data = json.dumps(data)
r = requests.post(url, data=form_data)
html = r.text
# 在json.dumps之前,我们还是要一个字典形式的数据的。
另外还有一种,也是request payload的数据类型。是目前见过的最变态的请求数据格式:
callCount=1
page=/service/bill/customerbill/index.jsp?bill=detail
httpSessionId=
scriptSessionId=AA0CBE9FB90164F9E0E55CF74FCC9338568
c0-scriptName=Service
c0-methodName=excute
c0-id=0
c0-param0=string:TWB_GET_MONTH_DETAIL_BILL_NEW
c0-param1=boolean:false
c0-e1=string:myPage
c0-e2=string:myPage_table
c0-e3=string:TWB_GET_MONTH_DETAIL_BILL_NEW
c0-e4=boolean:false
c0-e5=string:15
c0-e6=string:1
c0-e7=null:null
c0-e8=boolean:false
c0-e9=null:null
c0-e10=string:-1
c0-param2=Object_Object:{div_id:reference:c0-e1, table_id:reference:c0-e2, func_id:reference:c0-e3, is_sql:reference:c0-e4,
page_size:reference:c0-e5, page_index:reference:c0-e6, exp_excel:reference:c0-e7, hide_pager:reference:c0-e8, class_name:reference:c0-e9,
area_code:reference:c0-e10}
batchId=4
# 以上是请求的时候页面上显示的部分数据
这种数据我们怎么去post呢?当然是有办法的,不止一种,这里举一个实用的例子
import requests url = 'http://****'
form_data = {
'callCount': '1',
'page': '/service/bill/customerbill/index.jsp?bill=balance',
'httpSessionId': '',
'scriptSessionId': 'AA0CBE9FB90164F9E0E55CF74FCC9338775',
'c0-scriptName': 'Service',
'c0-methodName': 'excute',
'c0-id': '0',
'c0-param0': 'string:TWB_GET_MONTH_DETAIL_BILL',
'c0-param1': 'boolean:false',
'c0-e1': 'string:myPage',
'c0-e2': 'string:myPage_table',
'c0-e3': 'string:TWB_GET_MONTH_DETAIL_BILL',
'c0-e4': 'boolean:false',
'c0-e5': 'string:15',
'c0-e6': 'string:1',
'c0-e7': 'null:null',
'c0-e8': 'boolean:false',
'c0-e9': 'null:null',
'c0-e10': 'string:-1',
'c0-param2': 'Object_Object:{div_id:reference:c0-e1, table_id:reference:c0-e2, func_id:reference:c0-e3, is_sql:reference:c0-e4,
page_size:reference:c0-e5, page_index:reference:c0-e6, exp_excel:reference:c0-e7, hide_pager:reference:c0-e8, class_name:reference:c0-e9,
area_code:reference:c0-e10,}',
'batchId': '4'
}.
r = requests.post(url, data=form_data)
# 因为是演示请求,数据可能和原始数据不太对应,这里只是伪代码,明白意思即可。
四、text/xml
这种请求方式,是不才最近刚遇到的一种方式。之前也没有接触过,它是使用post请求方式给服务器端发送了一个带HTML标签的字符串。这种在编写的时候也比较简单,但是因为不常见,所以也困扰了比较长的时间。
url = 'https://i.cnblogs.com/EditPosts.aspx?opt=1'
payload = '''
<buffalo-call>
<method>getCode</method>
<map>
<type>java.util.HashMap</type>
<string>ABC</string>
<string>123654</string>
<stringID</string>
</map> </buffalo-call>
'''
headers = {
'Content-Type': 'text/xml;charset=UTF-8'
}
r = requests.post(url, data=payload, headers=headers)
# 注:在遇到这种数据方式的时候,我们一定要对请求头的'Content-Type'进行设置,让它的值为'text/xml'
因为这种形式的请求很少见,所以难免会造成一些困惑,记下来以便后续查询,也希望能帮助刚接触requests的小伙伴。
requests补充的更多相关文章
- sys,os,模块-正则表达式
# *__conding:utf-8__* """"我是注释""" sys,os模块 import sysimport os pr ...
- python day 8: re模块补充,导入模块,hashlib模块,字符串格式化,模块知识拾遗,requests模块初识
目录 python day 8 1. re模块补充 2. import模块导入 3. os模块 4. hashlib模块 5. 字符串格式:百分号法与format方法 6. 模块知识拾遗 7. req ...
- 进程线程协程补充、docker-compose一键部署项目、搭建代理池、requests超时设置、认证设置、异常处理、上传文件
今日内容概要 补充:进程,线程,协程 docker-compose一键部署演示 搭建代理池 requests超时设置 requests认证设置 requests异常处理 requests上传文件 内容 ...
- scrapy post payload的坑及相关知识的补充【POST传参方式的说明及scrapy和requests实现】
一.问题及解决: 在用scrapy发送post请求时,把发送方式弄错了. 本来应该是 application/x-www-form-urlencoded 弄成了application/json. 但 ...
- ImportError: No module named 'requests'
补充说明: 当前环境是在windows环境下 python版本是:python 3.4. 刚开始学习python,一边看书一边论坛里阅读感兴趣的代码, http://www.oschina.net/c ...
- python_day7【模块configparser、XML、requests、shutil、系统命令-面向对象】之篇
python内置模块补充 一.configparser configparser:用户处理特定格式的文件,其本质是利用open打开文件 # 节点 [section1] #键值对k1 = v1 k2:v ...
- [实战演练]python3使用requests模块爬取页面内容
本文摘要: 1.安装pip 2.安装requests模块 3.安装beautifulsoup4 4.requests模块浅析 + 发送请求 + 传递URL参数 + 响应内容 + 获取网页编码 + 获取 ...
- python爬虫之requests模块介绍
介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) #注意:requests库发送请求将网页内容下 ...
- 爬虫、请求库requests
阅读目录 一 介绍 二 基于GET请求 三 基于POST请求 四 响应Response 五 高级用法 一 介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,req ...
随机推荐
- [debian]use ISO as debian apt source / 使用ISO文件作为apt源
准备文件: debian-9.8.0-amd64-DVD-1.iso debian-9.8.0-amd64-DVD-2.iso debian-9.8.0-amd64-DVD-3.iso 挂载: roo ...
- P1417 烹调方案 (0/1背包+贪心)
题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...
- localhost 将您重定向的次数过多
localhost 将您重定向的次数过多 问题描述:在项目中,出现 localhost 将您重定向的次数过多 ,有可能是因为设置重定向的时候,自己重定向到自己,或者重定向成环,导致无限的重定向.检查重 ...
- 一段充满bug的R程序,慎入 ...
twitter的AnomalyDetection 官网效果图如下: 尝试写了下面这个R程序: get_specify_df <- function(start_ts,stop_ts,categ ...
- mockplus 原型设计工具
国产原型工具 http://www.mockplus.cn, 该工具功能很棒. 每次打开软件都需先登陆, 好在项目文件是可以保存到本地, 可以注册为免费版/个人版/团队版/企业版. 我是免费账号, 功 ...
- 1、jQuery的使用入门
一.创建一个WEB项目,在WebRoot下新建一个Jscript文件夹,并将jQuery中的jquery-3.1.1.min.js文件复制过来. 二.用<script>标签引入jQuery ...
- IntelliJ IDEA中项目报错org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 8 或maven操作compile报resource使用utf8这样的编码错
问题:项目开发工具已经setting成utf-8 并且项目各方面的配置文件包括maven这些的pom.xml里的配置都已经设置为utf-8 但是还报错 IntelliJ IDEA中项目报错org.xm ...
- R-----shiny包的部分解释和控件介绍
R-----shiny包的部分解释和控件介绍 作者:周彦通.贾慧 shinyApp( ui = fixedPage( fixedPanel( top = 50, right=50, width=200 ...
- input file 重复上传同一张图片失效的解决办法
解决方法: 每次取消图片预览后,重置input[type=’file’]的value的值 链接:https://blog.csdn.net/zd717822023/article/details/78 ...
- GitHub:本地项目上传与团队协作
第一部分:我的本次作业成果 我自己个人的github地址是:colintz的个人仓库 我们开发团队小组的github地址是:小组3集中营 第二部分:强烈推荐的github资源 对于和我一样,初次接触g ...