一、pycurl 模块安装
【anaconda3中已经内置了pycurl。】
-
windows命令行 python3.X环境下安装:
pip install pycurl
-
测试 pycurl 是否安装成功,命令行执行
python
import pycurl
print(pycurl.version)
二、pycurl 简介
- CURL 是一个基于URL进行数据传输的命令行工具,使用C语言编写
- CURL支持 HTTP、HTTPS、FTP、TELNET、FILE、LDAP 等常见的网络传输协议;
- CURL 特点:速度快(听说比urllib快,虽然还是不知道是多快……)、体积小、效率高;
- libcurl 是对应的 C语言库;而 pycurl 则是对应的 python库
【 pycurl是用 C语言 编写的 URL 库, 我想,curl 就是这么来的吧~】
三、pycurl 属性和方法
1、常用操作说明
import pycurl
# 创建一个 curl 对象
c = pycurl.Curl()
import certifi
# windows 系统访问 HTTPS/HTTP,需要证书
c.setopt(pycurl.CAINFO, certifi.where())
# 操作设置
c.setopt(pycurl.URL, url) # 设置要访问的URL,如:url = 'http://www.baidu.com'
c.setopt(pycurl.USERAGENT, User_Agent) # 配置HTTP请求头,模拟浏览器,如User_Agent = 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Mobile Safari/537.36'
c.setopt(pycurl.CONNECTTIMEOUT, 2) # 设置连接的等待时间,此处为2,设置为0则不等待
c.setopt(pycurl.TIMEOUT, 300) # 设置请求超时时间
c.setopt(pycurl.NOPROGRESS, 0) # 设置是否屏蔽下载的进度条,非0则为屏蔽
c.setopt(pycurl.MAXREDIRS, 5) # 指定HTTP最大重定向次数
c.setopt(pycurl.COOKIEFILE, cookie_file) # 读取 cookie
c.seropt(pycurl.COOKIEJAR, cookie_file) # 设置 cookie
c.setopt(pycurl.HEADERFUNCTION, getheader) # 将返回的 HTTP HEADER 定向到回调函数 getheader
c.setopt(pycurl.WRITEFUNCTION, getbody) # 将返回的内容定向到回调函数 getbody
c.setopt(pycurl.WRITEHEADER, fileobj) # 将返回的 HTTP HEADER 定向到 fileobj 文件对象
c.setopt(pycurl.WRITEDATA, fileobj) # 将返回的 HTML 内容定向到 fileobj 文件对象
# 执行以上操作 (执行完perform()操作后才能获取到info)
c.perform()
# 获取信息操作
c.getinfo(pycurl.NAMELOOKUP_TIME) # DNS(域名)解析所需时间
c.getinfo(pycurl.CONNECT_TIME) # (与远程服务器)建立连接所需的时间
c.getinfo(pycurl.PRETRANSFER_TIME) # 从建立连接到准备传输所需时间
c.getinfo(pycurl.REDIRECT_TIME) # 重定向所需时间
c.getinfo(pycurl.EFFECTIVE_URL) # 获取网页多次跳转后的最终地址
c.getinfo(pycurl.HTTP_CODE) # 返回的HTTP状态码
c.getinfo(pycurl.TOTAL_TIME) # 传输结束所需的时间
c.getinfo(pycurl.HEADER_SIZE) # 头部大小
c.getinfo(pycurl.REQUEST_SIZE) # 请求大小
c.getinfo(pycurl.SIZE_UPLOAD) # 上传数据包的大小
c.getinfo(pycurl.SIZE_DOWNLOAD) # 下载数据包的大小
c.getinfo(pycurl.SPEED_UPLOAD) # 上传速度
c.getinfo(pycurl.SPEED_DOWNLOAD) # 下载速度
c.getinfo(pycurl.CONTENT_TYPE) # 内容类型
注意: getinfo() 操作应该在 perform() 操作之后,否则打印不出来想要的信息。
需要使用上面的 定向 操作,需要导入 StringIO 类和 BytesIO 类(属于io模块下的类)
2、实例1_简单操作
完整程序主要包含**四个步骤**:
- 创建curl实例
- 设置:setopt操作
- 执行:perform
- 获取信息:getinfo
简单的实例如下所示——
import pycurl
import certifi
c = pycurl.Curl() # 创建curl对象
c.setopt(pycurl.CAINFO,certifi.where()) # 设置允许访问HTTP/HTTPS的证书
url = 'https://www.douban.com'
c.setopt(pycurl.URL,url) # 设置访问的网站URL (此处以豆瓣网站为例)
c.perform() # 执行操作
http_code = c.getinfo(pycurl.HTTP_CODE) # 获取网页响应的状态码
print('响应的状态码:', http_code)
运行结果——
……(省略的一堆打印结果)和——
响应的状态码: 200
3、实例2_使用定向操作
import pycurl,certifi
try: # python3 使用的StringIO和BytesIO导入方式
from io import BytesIO
except ImportError: # 为防止 导入出现问题,使用try,except操作
from io import StringIO as BytesIO
c = pycurl.Curl()
c.setopt(pycurl.CAINFO,certifi.where())
b = BytesIO() # 实例化BytesIO类
url = 'https://www.douban.com'
c.setopt(pycurl.URL,url)
c.setopt(pycurl.WRITEDATA,b) # 将HTML内容定向传入文件对象b
c.perform()
HTTP_CODE = c.getinfo(pycurl.HTTP_CODE)
HTTP_total_time = c.getinfo(pycurl.TOTAL_TIME)
print(b.getvalue().decode('utf-8')) # 定向返回源代码
print('http响应状态:',HTTP_CODE)
print('传输结束时间:',HTTP_total_time)
运行结果——
……
待续——
……