python的requests初步使用

本文介绍Python的Requests库基本用法,包括GET与POST请求、文件上传、自定义Headers及Cookies等,并通过实例演示如何实现登录及获取数据。

早就听说requests的库的强大,只是还没有接触,今天接触了一下,发现以前使用urllib,urllib2等方法真是太搓了……

这里写些简单的使用初步作为一个记录

安装

http://cn.python-requests.org/en/latest/user/install.html#install

发送无参数的get请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

r = requests.get('http://httpbin.org/get')
print r.text
'''
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Connection": "close",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.3.0 CPython/2.6.6 Windows/7",
    "X-Request-Id": "8a28bbea-55cd-460b-bda3-f3427d66b700"
  },
  "origin": "124.192.129.84",
  "url": "http://httpbin.org/get"
'''

<!-- more -->
# 发送带参数的get请求,将key与value放入一个字典中,通过params参数来传递,其作用相当于urllib.urlencode
``` python
>>> import requests
>>> pqyload = {'q':'杨彦星'}
>>> r = requests.get('http://www.so.com/s',params = pqyload)
>>> r.url
u'http://www.so.com/s?q=%E6%9D%A8%E5%BD%A6%E6%98%9F'

发送post请求,通过data参数来传递,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

>>> payload = {'a':'杨','b':'hello'}
>>> r = requests.post("http://httpbin.org/post", data=payload)
>>> print r.text
{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "a": "u6768",
    "b": "hello"
  },
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Connection": "close",
    "Content-Length": "19",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.3.0 CPython/2.6.6 Windows/7",
    "X-Request-Id": "c81cb937-04b8-4a2d-ba32-04b5c0b3ba98"
  },
  "json": null,
  "origin": "124.192.129.84",
  "url": "http://httpbin.org/post"
}
>>>

可以看到,post参数已经传到了form里,data不光可以接受字典类型的数据,还可以接受json等格式

1
2
3
4

>>> payload = {'a':'杨','b':'hello'}
>>> import json
>>> r = requests.post('http://httpbin.org/post', data=json.dumps(payload))

发送文件的post类型

这个相当于向网站上传一张图片,文档等操作,这时要使用files参数

1
2
3
4

>>> url = 'http://httpbin.org/post'
>>> files = {'file': open('touxiang.png', 'rb')}
>>> r = requests.post(url, files=files)

定制headers,使用headers参数来传递

1
2
3
4
5
6
7

>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
>>> headers = {'content-type': 'application/json'}

>>> r = requests.post(url, data=json.dumps(payload), headers=headers)

响应内容

响应状态码

r = requests.get(‘http://httpbin.org/get‘)
print r.status_code

响应头

1
2
3

>>> print r.headers
{'content-length': '519', 'server': 'gunicorn/18.0', 'connection': 'keep-alive', 'date': 'Sun, 15 Jun 2014 14:19:52 GMT', 'access-control-allow-origin': '*', 'content-type': 'application/json'}

也可以取到这个个别的响应头用来做一些判断,这里的参数是不区分大小写的

r.headers[‘Content-Type’]

r.headers.get(‘Content-Type’)

响应内容,前面已经在应用了

r.text

r.content

获取响应中的cookies

1
2
3
4

>>> r = requests.get('http://www.baidu.com')
>>> r.cookies['BAIDUID']
'D5810267346AEFB0F25CB0D6D0E043E6:FG=1'

也可以自已定义请求的COOKIES

1
2
3
4
5
6
7
8
9
10
11
12

>>> url = 'http://httpbin.org/cookies'
>>> cookies = {'cookies_are':'working'}
>>> r = requests.get(url,cookies = cookies)
>>>
>>> print r.text
{
  "cookies": {
    "cookies_are": "working"
  }
}
>>>

cookies还有很多,因为目前我也还不是很多,以后再扩充吧

使用timeout参数设置超时时间

1
2
>>> requests.get('http://github.com', timeout=1)
<Response [200]>

如果将时间设置成非常小的数,如requests.get(‘http://github.com’, timeout=0.001),那么如果在timeout的时间内没有连接,那么将会抛出一个Timeout的异常

访问中使用session

先初始化一个session对象,s = requests.Session()

然后使用这个session对象来进行访问,r = s.post(url,data = user)

参考文章 http://blog.youkuaiyun.com/iloveyin/article/details/21444613 基本上都是从这扒的代码

以下通过访问人人网来获取首页中的最近来访问,然后再访问查看更多的来访来读取更多的最近来访

20151029更新,和美女刘巍进行讨论,由于很久没有登录人人网,它的登录页面与获得最近来访的页面都有所变动,登录时的url是http://www.renren.com/ajaxLogin/login 获取最近来访是http://www.renren.com/myfoot/whoSeenMe

更多的来访就是以带session的访问http://www.renren.com/myfoot/whoSeenMe

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

#coding:utf-8
import requests
import re

url = r'http://www.renren.com/ajaxLogin/login'

user = {'email':'email','password':'pass'}
s = requests.Session()
r = s.post(url,data = user)

html = r.text
visit = []
first = re.compile(r'</span><span class="time-tip first-tip"><span class="tip-content">(.*?)</span>')
second = re.compile(r'</span><span class="time-tip"><span class="tip-content">(.*?)</span>')
third = re.compile(r'</span><span class="time-tip last-second-tip"><span class="tip-content">(.*?)</span>')
last = re.compile(r'</span><span class="time-tip last-tip"><span class="tip-content">(.*?)</span>')
visit.extend(first.findall(html))
visit.extend(second.findall(html))
visit.extend(third.findall(html))
visit.extend(last.findall(html))
for i in visit:
    print i

print '以下是更多的最近来访'
vm = s.get('http://www.renren.com/myfoot/whoSeenMe')
fm = re.compile(r'"name":"(.*?)"')
visitmore = fm.findall(vm.text)
for i in visitmore:
    print i

renrenrenren

先看效果: https://renmaiwang.cn/s/jkhfz Hue系列产品将具备高度的个性化定制能力,并且借助内置红、蓝、绿三原色LED的灯泡,能够混合生成1600万种不同色彩的灯光。 整个操作流程完全由安装于iPhone上的应用程序进行管理。 这一创新举措为智能照明控制领域带来了新的启示,国内相关领域的从业者也积极投身于相关研究。 鉴于Hue产品采用WiFi无线连接方式,而国内WiFi网络尚未全面覆盖,本研究选择应用更为普及的蓝牙技术,通过手机蓝牙与单片机进行数据交互,进而产生可调节占空比的PWM信号,以此来控制LED驱动电路,实现LED的调光功能以及DIY调色方案。 本文重点阐述了一种基于手机蓝牙通信的LED灯设计方案,该方案受到飞利浦Hue智能灯泡的启发,但考虑到国内WiFi网络的覆盖限制,故而选用更为通用的蓝牙技术。 以下为相关技术细节的详尽介绍:1. **智能照明控制系统**:智能照明控制系统允许用户借助手机应用程序实现远程控制照明设备,提供个性化的调光及色彩调整功能。 飞利浦Hue作为行业领先者,通过红、蓝、绿三原色LED的混合,能够呈现1600万种颜色,实现了全面的定制化体验。 2. **蓝牙通信技术**:蓝牙技术是一种低成本、短距离的无线传输方案,工作于2.4GHz ISM频段,具备即插即用和强抗干扰能力。 蓝牙协议栈由硬件层和软件层构成,提供通用访问Profile、服务发现应用Profile以及串口Profiles等丰富功能,确保不同设备间的良好互操作性。 3. **脉冲宽度调制调光**:脉冲宽度调制(PWM)是一种高效能的调光方式,通过调节脉冲宽度来控制LED的亮度。 当PWM频率超过200Hz时,人眼无法察觉明显的闪烁现象。 占空比指的...
<think>好的,用户想知道如何使用Pythonrequests库进行文件上传,包括具体的应用场景和代码示例。首先,我需要回忆requests库的基本用法,特别是关于POST请求的部分。记得requests库发送POST请求通常用requests.post()方法,而文件上传需要用到files参数。 接下来,文件上传的具体格式。根据之前学过的知识,上传文件时需要构造一个字典,键是服务器接收文件的字段名,值则是一个元组,包含文件名、文件对象和MIME类型。比如,可能像这样:{'file': ('example.txt', open('example.txt', 'rb'), 'text/plain')}。不过用户可能需要更详细的说明,比如如何打开文件,是否需要使用二进制模式等。 然后,应用场景方面,常见的比如用户上传头像、文档处理服务、图片分享平台等。需要举几个实际的例子,让用户明白在什么情况下会用到文件上传功能。比如,用户在一个Web应用中上传个人资料图片,或者向云存储服务上传文档。 代码示例部分,应该分步骤来写。首先导入requests库,然后定义目标URL,接着用open函数以二进制模式读取文件,构造files字典,最后发送POST请求。还要提醒用户注意关闭文件,但使用with语句可以自动处理,避免资源泄露。可能还需要处理服务器的响应,比如检查状态码或输出返回内容。 另外,用户可能会遇到的常见问题,比如文件路径错误、权限问题、服务器配置不支持等。需要给出一些常见错误的解决方法,比如确认文件是否存在,检查网络连接,或者查看服务器日志。例如,如果遇到ConnectionError,可能是URL错误或服务器不可用。 还需要考虑是否有多文件上传的情况,这时候可以修改files字典,添加多个键值对,或者使用列表。比如同时上传图片和文档,可能需要构造不同的字段名。例如:files = {'image': ('photo.jpg', open('photo.jpg', 'rb'), 'image/jpeg'), 'document': ('report.pdf', open('report.pdf', 'rb'), 'application/pdf')}。 安全性方面,可能需要提到使用HTTPS来保证传输过程中的数据安全,或者在上传大文件时设置适当的超时时间,避免长时间等待。此外,服务器端对文件类型和大小的限制也是需要注意的,客户端可以做初步检查,但最终验证应在服务器端进行。 测试方面,建议用户使用测试服务器或者本地搭建的简易服务来调试文件上传功能,比如使用Flask或Django编写一个接收文件的端点,这样可以方便地查看上传是否成功。例如,用Flask写一个简单的接收路由: from flask import Flask, request app = Flask(__name__) @app.route('/upload', methods=['POST']) def upload_file(): uploaded_file = request.files['file'] if uploaded_file: uploaded_file.save('saved_file.txt') return '文件上传成功' return '未接收到文件' if __name__ == '__main__': app.run(debug=True) 这样用户就可以将代码中的url改为http://localhost:5000/upload进行测试。 可能还需要提到其他相关参数,比如data可以同时发送表单数据,结合files和data一起使用。例如,上传文件的同时提交一些表单字段: data = {'user': 'john', 'description': '项目文档'} files = {'file': ('report.pdf', open('report.pdf', 'rb'), 'application/pdf')} response = requests.post(url, data=data, files=files) 这样服务器可以同时接收表单数据和文件。 还要注意一些细节,比如MIME类型的正确性。如果用户不确定文件类型,可以使用application/octet-stream作为默认值,但最好明确指定正确的类型,比如image/png、application/json等,以确保服务器能正确处理。 最后,总结一下步骤,确保回答结构清晰,分点说明,并给出示例代码和常见问题解答,这样用户能一步步跟着操作,遇到问题也有参考的解决方法。</think>### Python requests库文件上传使用方法 #### 1. 核心语法 使用`files`参数构造文件字典,通过POST请求发送。语法格式: ```python files = {'字段名': (文件名, 文件对象, MIME类型)} response = requests.post(url, files=files) ``` #### 2. 操作步骤 1. **准备文件**:确保文件存在且可读 2. **构造字典**:使用二进制模式打开文件 3. **发送请求**:建议配合`with`语句管理文件资源 ```python import requests url = 'https://httpbin.org/post' with open('test.jpg', 'rb') as f: files = {'image': ('photo.jpg', f, 'image/jpeg')} response = requests.post(url, files=files) print(response.status_code) print(response.json()['files']) ``` #### 3. 应用场景 - **用户内容上传**:社交媒体图片/视频上传(如微信朋友圈发图) - **云文档处理**:在线Office文档转换服务(如WPS云文档) - **数据采集系统**:批量上传日志文件到分析平台 - **企业应用**:OA系统上传报销凭证扫描件 #### 4. 高级用法 **多文件上传**: ```python files = [ ('images', ('front.jpg', open('front.jpg', 'rb'), 'image/jpeg')), ('images', ('side.jpg', open('side.jpg', 'rb'), 'image/jpeg')) ] ``` **混合表单数据**: ```python data = {'user_id': '1001', 'description': '产品设计图'} files = {'file': open('design.zip', 'rb')} response = requests.post(url, data=data, files=files) ``` #### 5. 常见问题解决 | 问题现象 | 解决方法 | |---------|----------| | `OSError: [Errno 22]` | 检查文件路径是否正确,使用绝对路径 | | `ConnectionError` | 验证目标URL可达性,检查网络设置 | | `413 Request Entity Too Large` | 压缩文件或联系服务器管理员调整限制 | | 中文文件名乱码 | 显式指定文件名编码:`('简历.pdf', f, 'application/pdf', {'Content-Transfer-Encoding': 'binary'})` | #### 6. 安全建议 1. 文件大小校验:客户端预先检查文件尺寸 ```python if os.path.getsize('data.zip') > 10*1024*1024: # 10MB限制 raise ValueError("文件超过大小限制") ``` 2. 文件类型白名单: ```python ALLOWED_TYPES = {'image/jpeg', 'image/png'} if content_type not in ALLOWED_TYPES: raise TypeError("不支持的文件格式") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值