python爬虫学习手册-服务器渲染(基础库httplib2)了
今天我在逛博客时候看到这么一个帖子,大概意思就是说爬虫不需要了解什么其他的别的,会个请求库,会个解析库就行了,但是我的心情跟吃了X一样的难受,这么忽悠小白好吗?虽然说是,是python方向里比较简单的一个分支,是有挺多重复的库,但是我觉得系统之所以为系统,就是因为包含了许多类似的知识,有些东西是不重要,但是你不能不知道,你可以不对所有的都是非常熟悉,但是不能不了解!好了,开始正题!
一、是什么?
httplib2是一个功能强大的网络请求库,其实它和urllib、urllib、requests都是类似的库,安装库
pip install httplib2
二、怎么用?
既然它和其他的请求库类似那么就有着相似的方法,我们一条条来盘点下httplib2的强大方法!
1.基本请求
import httplib2
h = httplib2.Http('result') #获取的内容写入result目录下
response, content = h.request('https://www.baidu.com/')
最后会在result文件夹下生成一个名字叫
这种的文件!可以使用记事本打开,里面会看见里面有这样的内容
status: 200
accept-ranges: bytes
cache-control: no-cache
connection: Keep-Alive
content-length: 227
content-type: text/html
date: Thu, 29 Nov 2018 14:37:43 GMT
etag: "5bfcae80-e3"
last-modified: Tue, 27 Nov 2018 02:40:00 GMT
p3p: CP=" OTI DSP COR IVA OUR IND COM "
pragma: no-cache
server: BWS/1.1
set-cookie: BD_NOT_HTTPS=1; path=/; Max-Age=300, BIDUPSID=4164BB9449141E2F6F953DED296ECE6E; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, PSTM=1543502263; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
strict-transport-security: max-age=0
x-ua-compatible: IE=Edge,chrome=1
content-location: https://www.baidu.com/
<html>
<head>
<script>
location.replace(location.href.replace("https://","http://"));
</script>
</head>
<body>
<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>
</body>
</html>
基本的请求分成里两部分
1.创建Http对象,因为需要一个Http类型的对象
2.就是进行基本的POST/GET请求
而我们返回的内容分为两部分,一部分就是response包含的服务器返回的HTTP报头的内容,200表示请求成功,另一部分是Content里面包含的内容,也就是HTML页面,是服务器返回的实际数据
2.缓存
HTTPlib2有一个和其他的请求库不同的东西,我感觉还挺有意思,叫缓存,是的就是你想的那样,在一个默认的时间里你的同样的请求不会真的被发送到服务器,而是读取本地的缓存来返回给你!httplib2库默认是启用缓存,你可以设置不用缓存
response2, content2 = h.request('http://www.baidu.com/', headers={'cache-control':'no-cache'})
添加
headers={'cache-control':'no-cache'}
httplib2注意到我们添加了无缓存标头, 因此它完全绕过了它的本地缓存, 然后就会打开网络请求数据
3.提交表单
import urllib
import httplib2
from httplib2 import Http
from urllib import urlencode
h =httplib2.Http()#创建Http对象
data = dict(name="Joe", comment="A test comment")#准备添加的数据
response, content = h.request("http://www.baidu.com/", "POST", urlencode(data))#urlencode()#提交数据
print(response)
{'status': '200', 'transfer-encoding': 'chunked', 'vary': 'Accept-Encoding,User-Agent',
'server': 'Apache', 'connection': 'close', 'date': 'Tue, 31 Jul 2007 15:29:52 GMT',
'content-type': 'text/html'}
提交的data为字典类型
4.设置cookie
其他的请求库都能设置cookie,httplib2当然也能,代码如下
import urllib
import httplib2
http = httplib2.Http()
url = 'http://www.baidu.com/'
body = {'USERNAME': 'foo', 'PASSWORD': 'bar'}#账号和密码
headers = {'Content-type': 'application/x-www-form-urlencoded'}
response, content = http.request(url, 'POST', headers=headers, body=urllib.urlencode(body))
headers = {'Cookie': response['set-cookie']} ###将获得cookie设置到请求头中,以备下次请求使用
url = 'http://www.baidu.com/'
response, content = http.request(url, 'GET', headers=headers) ##本次请求就不用带用户名和密码
5.设置代理
import httplib2
import socks ##需要第三方模块
httplib2.debuglevel=4
h = httplib2.Http(proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, 'localhost', 8000))
response,content = h.request("http://www.baidu.com/")
6.request其他参数
Http.request(self, uri, method='GET', body=None, headers=None, redirections=5, connection_type=None)
执行单次的http请求
uri:一个以'http' 或 'https'开头的资源定位符字串,必须是一个绝对的地址
method:支持所有的http请求方式。如: GET, POST等
body:请求的附件数据,一个经过urllib.urlencode编码的字符串
headers:请求头信息,字典类型
redirections:最大的自动连续的重定向次数默认为5
7.httplib2的优点
httplib2,一个第三方的开源库,它比http.client更完整的实现了HTTP协议,同时比urllib.request提供了更好的抽象。
python的HTTP库不支持缓存,而httplib2支持。
Python的HTTP 库不支持最后修改时间检查,而httplib2 支持。
Python HTTP库不支持ETag,而httplib2支持.
Python的 HTTP库不支持压缩,但httplib2支持。
httplib2 帮你处理了永久重定向。它不仅会告诉你发生了永久重定向,而且它会在本地记录这些重定向,并且在发送请求前自动重写为重定向后的URL。
参考:1.httplib2处理http的get和post
2.惯例源码 httplib2源码