Python爬虫学习(2): httplib
httplib模块实现了HTTP和HTTPS的客户端部分,但是一般不直接使用,经常通过urllib来进行HTTP,HTTPS的相关操作。
如果需要查看其源代码可以通过查找命令定位:
find / -name "httplib.py"
整个请求过程的状态转移图如下所示:
httplib提供如下的类:
1. httplib.
HTTPConnection
(host[, port[, strict[, timeout[, source_address]]]])
一个HTTPConnection
实例表示一次与HTTP server的连机事务,在实例化的时候至少需要一个主机地址。port参数如果没有指定会默认采用80端口。strict参数的默认值是false,当这个值为true的时候,如果状态行(status line)不是HTTP/1.0 or 1.1,则会引发BadStatusLine错误。timeout参数指定在多长时间后还未连接到主机则停止此联机行为。source_address参数是二元组形式(host,port),指定发起连接的客户机的IP和端口。
>>> h1 = httplib.HTTPConnection('www.cwi.nl')
>>> h2 = httplib.HTTPConnection('www.cwi.nl:80')
>>> h3 = httplib.HTTPConnection('www.cwi.nl', 80)
>>> h3 = httplib.HTTPConnection('www.cwi.nl', 80, timeout=10)
其包含如下几个方法:
1.1 HTTPConnection.
request
(method, url[, body[, headers]])
以method方法来访问url地址,body参数可以是需要发送的数据字符串,还可以是文件对象,其将会在发送完headers之后发送出去。headers参数对应HTTP headers中需要的内容。如果headers参数没有指定,则headers中的Content-Length会根据body的大小自动添加(字符串的长度或者是文件的大小)。
1.2 HTTPConnection.
getresponse
()
一般在调用request之后用来获取返回结果,此方法返回一个HTTPResponse对象。
注意: 在发送一个新的请求之前要先读取返回的结果,否则会出错。源文件中对应的部分如下:
# Note: if a prior response exists, then we *can* start a new request. # We are not allowed to begin fetching the response to this new # request, however, until that prior response is complete. # if self.__state == _CS_IDLE: self.__state = _CS_REQ_STARTED else: raise CannotSendRequest()
测试实例:
1.3 HTTPConnection.
set_debuglevel
(level)
设置调试级别(相关的调试信息会打印出来),默认值是0,表示不打印调试信息。
In [14]: con = httplib.HTTPConnection("www.baidu.com") In [15]: con.set_debuglevel(1)
# 请求过程中会输出一些调式信息
In [16]: req = con.request("GET","/")
send: 'GET / HTTP/1.1\r\nHost: www.baidu.com\r\nAccept-Encoding: identity\r\n\r\n'
1.4 HTTPConnection.
connect
()
当HTTPConnection
对象创建的时候自动连接到服务器
1.5 HTTPConnection.
close
()
你懂的
你除了直接调用request
()方法来访问服务器,还可以以下边4步实现此功能:
1.6.1 HTTPConnection.
putrequest
(request, selector[, skip_host[, skip_accept_encoding]]):
这是连接到服务器之后的第一步操作
1.6.2 HTTPConnection.
putheader
(header, argument[, ...])
发送请求头
1.6.3 HTTPConnection.
endheaders
(message_body=None)
向服务器发送一空行表示请求头的结束。
1.6.4 HTTPConnection.
send
(data)
向服务器发送数据。应该在endheaders函数调用之后,getresponse函数之前调用。
2. httplib.
HTTPSConnection
(host[, port[, key_file[, cert_file[, strict[, timeout[, source_address[, context]]]]]]])
这是HTTPConnection
的一个子类,通过SSL来和安全主机交互,采用的默认端口是443.如果参数context指定时候,这其此参数必须是ssl.SSLContext(描述SSL的各种信息)
的实例。
key_file和cert_file参数已经弃用。
3. httplib.
HTTPResponse
(sock, debuglevel=0, strict=0)
这个类会在成功连接后返回,不会被用户直接初始化。
HTTPResponse.
read
([amt]):
返回响应结果,或者读取下amt个字节
In [23]: response = con.getresponse() In [24]: response.read(10)
Out[24]: '<!DOCTYPE '
HTTPResponse.
getheader
(name[, default])
获取指定文件头中指定的内容
In [26]: response.getheader("server")
Out[26]: 'BWS/1.1'
In [27]: response.getheader("date")
Out[27]: 'Mon, 17 Oct 2016 10:59:40 GMT'
In [28]: response.getheader("Date")
Out[28]: 'Mon, 17 Oct 2016 10:59:40 GMT'
HTTPResponse.
getheaders
()
获取文件头的列表
HTTPResponse.
fileno
()
获取socket的文件描述符
HTTPResponse.
msg
-
获取包含响应头的
mimetools.Message
的实例In [30]: message = response.msg
In [31]: message
Out[31]: <httplib.HTTPMessage instance at 0x39610e0>
# 获取响应头信息
In [33]: dict = message.dict
In [34]: dict
Out[34]:
{'accept-ranges': 'bytes',
'cache-control': 'no-cache',
'connection': 'Keep-Alive',
'content-length': '',
'content-type': 'text/html',
'date': 'Mon, 17 Oct 2016 10:59:40 GMT',
'last-modified': 'Thu, 13 Oct 2016 05:07:00 GMT',
'p3p': 'CP=" OTI DSP COR IVA OUR IND COM "',
'pragma': 'no-cache',
'server': 'BWS/1.1',
'set-cookie': 'BAIDUID=6C2B1FF908F1DD87C092C282D6F1EE2A:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, BIDUPSID=6C2B1FF908F1DD87C092C282D6F1EE2A; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, PSTM=1476701980; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com',
'vary': 'Accept-Encoding',
'x-ua-compatible': 'IE=Edge,chrome=1'}
HTTPResponse.
status
HTTP的状态码
HTTPResponse.
reason
In [35]: response.reason
Out[35]: 'OK'
4. httplib.
HTTPMessage
这个类中存储HTTP的响应头信息。其通过 mimetools.Message实现,并提供处理头的使用函数,不会被用户实例化。
参考地址: https://docs.python.org/2/library/httplib.html#httplib.HTTPSConnection
Python爬虫学习(2): httplib的更多相关文章
- python爬虫学习(1) —— 从urllib说起
0. 前言 如果你从来没有接触过爬虫,刚开始的时候可能会有些许吃力 因为我不会从头到尾把所有知识点都说一遍,很多文章主要是记录我自己写的一些爬虫 所以建议先学习一下cuiqingcai大神的 Pyth ...
- python爬虫学习 —— 总目录
开篇 作为一个C党,接触python之后学习了爬虫. 和AC算法题的快感类似,从网络上爬取各种数据也很有意思. 准备写一系列文章,整理一下学习历程,也给后来者提供一点便利. 我是目录 听说你叫爬虫 - ...
- Python爬虫学习:三、爬虫的基本操作流程
本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:三.爬虫的基本操作与流程 一般我们使用Python爬虫都是希望实现一套完整的功能,如下: 1.爬虫目标数据.信息: 2.将 ...
- Python爬虫学习:四、headers和data的获取
之前在学习爬虫时,偶尔会遇到一些问题是有些网站需要登录后才能爬取内容,有的网站会识别是否是由浏览器发出的请求. 一.headers的获取 就以博客园的首页为例:http://www.cnblogs.c ...
- Python爬虫学习:二、爬虫的初步尝试
我使用的编辑器是IDLE,版本为Python2.7.11,Windows平台. 本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:二.爬虫的初步尝试 1.尝试抓取指定网页 ...
- 《Python爬虫学习系列教程》学习笔记
http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己 ...
- python爬虫学习视频资料免费送,用起来非常666
当我们浏览网页的时候,经常会看到像下面这些好看的图片,你是否想把这些图片保存下载下来. 我们最常规的做法就是通过鼠标右键,选择另存为.但有些图片点击鼠标右键的时候并没有另存为选项,或者你可以通过截图工 ...
- python爬虫学习笔记(一)——环境配置(windows系统)
在进行python爬虫学习前,需要进行如下准备工作: python3+pip官方配置 1.Anaconda(推荐,包括python和相关库) [推荐地址:清华镜像] https://mirrors ...
- [转]《Python爬虫学习系列教程》
<Python爬虫学习系列教程>学习笔记 http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多. ...
- python爬虫学习01--电子书爬取
python爬虫学习01--电子书爬取 1.获取网页信息 import requests #导入requests库 ''' 获取网页信息 ''' if __name__ == '__main__': ...
随机推荐
- kail linux安装软件提示“无法定位软件包”解决方法
主要是更新源的问题,我安装ibus-pinyin老是提示"无法定位软件包" 最后我用的是163的源: # 源 deb http://mirrors.163.com/debian w ...
- [Unity] 3D数学基础 - 2D旋转矩阵
2D矩阵的旋转: NewX = X * Cos(α) - Y * Sin(α) NewY = X * Sin(α) + Y * Cos(α) 一般在三角函数中使用的是弧度,我们可以通过下面的公式将角度 ...
- NGUI 学习笔记
1.NGUI中UI的深度关系(新版NGUI 3.9): 在同一个Panel中,不管同不同Altas,各个UI的顺序受Depth影响 在不同Panel中,UI的顺序受Panel的Depth影响 例如Pa ...
- tyvj1194 划分大理石
描述 有价值分别为1..6的大理石各a[1..6]块,现要将它们分成两部分,使得两部分价值之和相等,问是否可以实现.其中大理石的总数不超过20000. 输入格式 有多组数据!所以可能有多行如果有0 ...
- APP常用字体
font-family:Microsoft YaHei,Helvitica,Verdana,Tohoma,Arial,san-serif;
- PHP变量入门教程(1)基础
基础 PHP 中一个美元符号后面跟上一个变量名称,即表示一个变量.变量的名称是对大小写敏感的. 变量名与 PHP 中其它的标签一样遵循相同的规则.一个有效的变量名由字母或者下划线开头,后面跟上任意数量 ...
- 兼容IE8以下浏览器input表单属性placeholder不能智能提示功能
当前很多表单提示使用了表单属性placeholder,可这属性不兼容IE8以下的浏览器,我自己写了一个兼容处理js // 兼容IE8以下浏览器input不能智能提示功能 if(navigator.ap ...
- phpcms手机门户相关
相关标签 {$WAP['sitename']}标题 {list_url(3)} 调取栏目链接 {template "wap","header"}{templat ...
- oracle查询以当前年份为准的近些年数据
今天在工作中遇到了一个查询近几年数据的问题,oracle学的比较渣渣,学习了一下. 举个例子: 比如说员工入职,我想看这个公司的员工入职情况,然后做一个趋势统计表. 以当前年份为准,查看近5年的情况趋 ...
- 加速android源码编译
添加缓存环境变量 : 在 ~/.bashrc 环境变量文件中 添加 export USE_CCACHE=1环境变量, 加速随后的编译过程; 分配缓存磁盘大小 为 ccache 指定磁盘中的一部分大小, ...