徐高翔的个人网站

Python实用模块推荐(十二)pycurl

2019-08-20

软硬件环境

  • ubuntu 19.04 64bit
  • anaconda3 with python 3.7.3
  • pycurl 7.43.0.2

简介

CURL是一个基于URL进行数据传输的命令行工具,使用C语言编写,支持httphttpsftptelnetfileldap等常见网络传输协议,具有速度快、体积小、效率高等特点。libcurl是对应的C库。pycurl是对应的python库`。

安装pycurl

anaconda3中已经内置了pycurl。如果你使用的是其它环境,可以通过pip来安装

script
1
pip install pycurl

或者下载源码进行安装

script
1
2
3
tar xvf pycurl-7.65.3.tar.gz    
cd pycurl-7.65.3
sudo python setup.py install

测试pycurl是否安装成功,命令行执行python

1
2
import pycurl
print(pycurl.version)

HTTP GET操作

这里的示例,实现一个从web server上下载一个文件到本地的功能,利用pycurl这个模块,直接上代码

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

# -*- coding: utf-8 -*-


"""
@author: Xu Gaoxiang
@license: Apache V2
@email: xugx.ai@gmail.com
@site: https://www.xugaoxiang.com
@software: PyCharm
@file: curl_demo.py
@time: 2019/8/19 下午4:33
"""

import pycurl


PYCURL_CONNECTTIMEOUT = 30
PYCURL_TIMEOUT = 300
PYCURL_DOWNLOADURL = "http://127.0.0.1/test.mp4"
PYCURL_DOWNLOAD_FILE = "download.file"

fp = open(PYCURL_DOWNLOAD_FILE,'wb+')

def pycurl_writeFile(buffer):
fp.write(buffer)

def pycurl_download(url):

# 全局初始化
pycurl.global_init(pycurl.GLOBAL_ALL)

# 实例化对象
c = pycurl.Curl()

# 参数设置
c.setopt(pycurl.URL, url)
c.setopt(pycurl.WRITEDATA, fp)
c.setopt(pycurl.WRITEFUNCTION, pycurl_writeFile)
c.setopt(pycurl.NOPROGRESS, 0)
c.setopt(pycurl.CONNECTTIMEOUT, PYCURL_CONNECTTIMEOUT)
c.setopt(pycurl.TIMEOUT, PYCURL_TIMEOUT)
c.setopt(pycurl.VERBOSE, 1)

# 执行
c.perform()

# 资源回收
c.close()
fp.close()

if __name__ == '__main__':

pycurl_download(PYCURL_DOWNLOADURL)

上述代码执行结果

pycurl_02

HTTP POST操作

首先我们准备搭建个web服务,这里我们使用flask这个框架,post接口接受一个json并打印出来,然后返回一个字符串,如下

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
# -*- coding: utf-8 -*-


"""
@author: Xu Gaoxiang
@license: Apache V2
@email: xugx.ai@gmail.com
@site: https://www.xugaoxiang.com
@software: PyCharm
@file: flask_server.py
@time: 2019/8/20 上午07:12
"""

from flask import Flask, request

flask_app = Flask(__name__)

@flask_app.route('/processPOSTJSON', methods=['POST'])
def processPOSTJSON():
'''
处理客户端上传的JSON数据
:return:
'''

content = request.get_json()
print(content)

return "success"

启动服务

script
1
2
3
# flask_server.py是上述文件的名字
export FLASK_APP=flask_server.py
flask run

接着使用pycurl构建客户端的代码,如下

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
# -*- coding: utf-8 -*-


"""
@author: Xu Gaoxiang
@license: Apache V2
@email: xugx.ai@gmail.com
@site: https://www.xugaoxiang.com
@software: PyCharm
@file: curl_post.py
@time: 2019/8/19 下午5:35
"""

import pycurl
import json

URL = "http://127.0.0.1:5000/processPOSTJSON"

c = pycurl.Curl()
c.setopt(pycurl.URL, URL)
c.setopt(pycurl.HTTPHEADER, ['Content-Type: application/json'])
data = json.dumps({"name": "xgx", "sex": "male", "country": "china"})
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(pycurl.VERBOSE, 1)
c.perform()
c.close()

运行客户端的代码,可以看到服务端返回过来的字符串success,同时在服务端,json的值也被打印了出来。由于我们在flask中使用了get_jaon方法,因此,在客户端必须要设置HTTPHEADER,否则,会打印出None

参考资料

推荐文章(由hexo文章推荐插件驱动)

使用支付宝打赏
使用微信打赏

请博主喝咖啡!