urllib库
python内置的HTTP请求库
四个模块:request,parse,error,rebotparser
一。request模块
请求对象组成:url,参数,请求头,请求体四部分。
response = urllib.request.urlopen(url,data=None,timeout,..)
response = urllib.request.urlopen(Request对象)
Request对象
urllib.request.Request(url,data,headers,method)
data是作为请求体进行传递的
data = bytes(utllib.parse.urlencode(map),'utf-8')
headers的一些属性:
User-Agent : 有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求
Referer:有的服务器会识别headers中的referer是不是自己
Content-Type : 在使用 REST 接口时,服务器会检查该值,用来确定 HTTP Body 中的内容该怎样解析。
application/xml : 在 XML RPC,如 RESTful/SOAP 调用时使用
application/json : 在 JSON RPC 调用时使用
application/x-www-form-urlencoded : 浏览器提交 Web 表单时使用在使用服务器提供的 RESTful 或 SOAP 服务时, Content-Type 设置错误会导致服务器拒绝服务
例如
headers={
'User-Agent':'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
'Referer':'http://www.zhihu.com/articles'
}
response对象
响应对象组成:状态码,响应头,响应主体
状态码,响应头,响应主体
response.status
response.getheaders() / response.getheaders("server")
response.read().decode('utf-8') # 如果不加decode,则返回的是bytes类型的流
二。parse模块(URL解析和URL引用)
1.URL解析:urlparse将url解析成各个组件和urlunparse将组件拼装成url
urlparse
urllib.parse.urlparse(urlstring,scheme='',allow_fragments=True)
# scheme指定协议类型,如果url中已经存在,则scheme不起作用
#allow_fragments为false时,fragment将为空,#后的内容将前移至path中,如果path之后的参数全为空
#URL组成
URL:scheme://netloc/path;parameters?query#fragment
urljoin
将前后两个url进行拼接,每个url分成6个部分,后面那个参数会被分割后会填充前面那个参数中分割后不存在的那个部分,双方都有的话,将以前者为准
urljoin('http://www.cwi.nl/%7Eguido/Python.html','FAQ.html')
>>>'http://www.cwi.nl/%7Eguido/FAQ.html'
urlencode
将字典转为query的形式
from urllib.parse import urlencode
params = {
'name' :'tim',
'age' :23
}
print(urlencode(params))
>>> name='tim'&age=23
urlunparse
将url的6个部分拼接成url
data = {'','',...}
三。error模块
由request产生。主要存在两个类:URLError,HTTPError(继承URLError)
URLError属性:reason
HTTPError属性:code,reason,headers
四。rebotparser模块
用来解析robots.txt文件,不常用。
五。高级用法
1. Opener
当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例)。在前面,我们都是使用的默认的opener,也就是urlopen。它是一个特殊的opener,可以理解成opener的一个特殊实例,传入的参数仅仅是url,data,timeout。
如果我们需要用到Cookie或者Proxy,只用这个opener是不能达到目的的,所以我们需要创建更一般的opener来实现对Cookie和Proxy的设置。
2. proxy代理
import urllib.request
proxy_handler = ProxyHandler({'http':'http://127.0.0.1:9999',...})
opener = build_opener(proxy_handler)
response = opener.open('http://..')
3. Cookielib
主要用来提供可存储的cookie对象。可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送。可以通过F12->Application->Cookies中查看
CookieJar —-派生—->FileCookieJar —-派生—–>MozillaCookieJar和LWPCookieJar
import http.cookiejar
#声明一个CookieJar对象实例来保存cookie
cookie = http.cookiejar,CookieJar()
#利用urllib库request模块的HTTPCookieProcessor对象来创建cookie处理器
handler=urllib.request.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener=urllib.request.build_opener(handler)
#此处的open方法同urllib2的urlopen方法,也可以传入request
response=opener.open('http://www.baidu.com')
for item in cookie:
print'Name = '+item.name
print'Value = '+item.value
使用MozillaCookieJar和LWPCookieJar可以将cookie保存到文件中,使用save来存储,使用load来加载。
#设置保存cookie的文件,同级目录下的cookie.txt
filename='cookie.txt'
#声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
cookie=http.cookiejar.MozillaCookieJar(filename)
#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handler=urllib2.request.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener=urllib.request.build_opener(handler)
#创建一个请求,原理同urllib2的urlopen
response=opener.open("http://www.baidu.com")
#保存cookie到文件
cookie.save(ignore_discard=True,ignore_expires=True)
使用load来加载cookie文件到cookie
cookie = http.cookiejar.MozillaCookieJar()
cookie.load(filename,ignore_discard=True,ignore_expires=True)
handler=urllib2.request.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener=urllib.request.build_opener(handler)
#创建一个请求,原理同urllib2的urlopen
response=opener.open("http://www.baidu.com")