pythoncurl全面解析

发布时间:2023-05-22

一、什么是pythoncurl?

pycurl是curl库的一个Python接口,它可以利用libcurl实现高速网络下载,同时支持HTTP、HTTPS、FTP、GOPHER、TELNET、DICT和FILE,支持SSL、证书、HTTP POST、HTTP PUT、HTTP DELETE、HTTP HEAD、FTP上传等功能、HTTP代理,SOCKS代理等代理功能。 从功能上来讲,curl是一个命令行工具,curl库则是可以在程序里面调用的一系列函数,pycurl则是一个对curl库的Python封装,可以让Python程序方便而直接地调用curl,实现HTTP/HTTPS/FTP等多个协议下载等上传操作。

二、pythoncurl命令

1. pycurl.Curl()方法

常规的使用方法是通过创建Curl对象获取网络资源。

import pycurl  
import sys  
storage = sys.stdout  
c = pycurl.Curl()  
c.setopt(c.URL, 'http://www.example.com/')  
c.setopt(c.WRITEDATA, storage)  
c.perform()  
c.close()  

2. pycurl.CurlMulti()

pycurl.CurlMulti()用法类似于pycurl.Curl()的get请求,但是它可以同时处理多个请求,是一个并发网络请求工具。

import pycurl  
m = pycurl.CurlMulti()  
# URL  
urls = ['http://www.baidu.com', 'http://www.163.com', 'http://www.sina.com.cn', 'http://www.qq.com', 'http://www.taobao.com']  
# 遍历添加请求  
for url in urls:  
    c = pycurl.Curl()  
    c.setopt(pycurl.URL, url)  
    c.setopt(pycurl.CONNECTTIMEOUT, 30)  
    c.setopt(pycurl.TIMEOUT, 30)  
    c.setopt(pycurl.NOPROGRESS, 1)  
    c.setopt(pycurl.FORBID_REUSE, 1)  
    c.setopt(pycurl.MAXREDIRS, 1)  
    c.setopt(pycurl.DNS_CACHE_TIMEOUT, 30)  
    c.setopt(pycurl.URL, url)  
    m.add_handle(c)  
# 执行并行下载  
while 1:  
    ret, num_handles = m.perform()  
    if ret != pycurl.E_CALL_MULTI_PERFORM:  
        break  
    pass  
# 阻塞应用直到所有访问完成  
while num_handles:  
    apply(select.select, tuple(sockets))  
    ret, num_handles = m.perform()  
    pass  

3. pycurl.FormWriter()

pycurl.FormWriter()函数用于多字符集间的文件上传

import pycurl  
c = pycurl.Curl()  
c.setopt(pycurl.URL, 'http://www.example.com/handlepost.cgi')  
c.setopt(pycurl.HTTPPOST, [("fileupload",
pycurl.FORM_FILE, "upload.xml",pucrl.FORM_FILENAME,"上传数据.xml", pycurl.FORM_CONTENTTYPE,"text/xml"),])
c.perform()  

三、pycurl常见的附加参数

1. CURLOPT_URL / CURLOPT_PORT :设置访问的URL和端口

这两个参数用来指定访问的URL或端口。

c.setopt(pycurl.URL, "http://www.example.com/page1.html")  
c.setopt(pycurl.PORT, 80)  

2. CURLOPT_POSTFIELDS / CURLOPT_POSTFIELDSIZE:设置POST请求中要传送的数据

这两个参数用来发送POST数据,可以将文件和字符串发送到指定的URL地址上。

data = {'x': 123, 'y': 456}  
post_data = urlencode(data)  
c.setopt(c.POSTFIELDS, post_data)  

3. CURLOPT_HTTPHEADER:设置HTTP头

参数可以设置HTTP头,以行的形式传递一个标签头列表和一个值列表。每个值存储在curl的内部缓冲区中,直到发送请求。

headers = ["Content-Type: application/json", "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64)"]  
c.setopt(c.HTTPHEADER, headers)  

4. CURLOPT_SSL_VERIFYPEER:设置是否验整个证书链

CURLOPT_SSL_VERIFYPEER用于设置SSL证书的验证方式,可设置为True和False,代表验证整个证书链和服务器证书,True需要检查服务器证书是否存在,并检查证书链,False不检查证书。

c.setopt(c.SSL_VERIFYPEER, False)  

5. CURLOPT_PROXY:设置代理服务器地址

如果想使用代理服务器访问,可以使用CURLOPT_PROXY设置代理服务器地址。

c.setopt(c.PROXY, 'http://proxy.example.com:8888/')  

四、总结

pythoncurl在Python程序开发和数据采集过程中应用非常广泛,其丰富的命令选项和附加参数可以帮助Python程序开发者轻松地实现各种请求和数据采集操作。