#回顾 由上一篇文章知道:经过python代码向服务器发送request,而后经过获取response就能够获取到网页的内容了。那么python如何向网站发起请求呢?这个过程又是如何实现的呢?html
python的Urllib库为咱们实现了想浏览器发起请求的过程,Urllib是python内置的一个http请求库(不须要额外的手动安装),除了发起request,Urllib还提供了比较强大的url解析函数。 java
其中:python
import urllib.requst
response = urllib.request.urlopen('http://www.baidu.com')
复制代码
urllib其实不太好用,后面会介绍其余更好用的库:它是基于Urllib库来实现的。urllib做为最基本的请求库,这里仍是介绍一下urllib库的基本原理和使用。面试
##request.urlopen()函数介绍 urllib.request.urlopen( url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None )json
其中浏览器
###urlopen返回的response对象提供方法: - read() , readline() ,readlines() , fileno() , close() :对HTTPResponse类型数据进行操做,返回的是byte类型的数据,须要使用decode方法转换为字符串,获取响应体的内容 - info():返回HTTPMessage对象,表示远程服务器返回的头信息 - getcode():返回Http状态码。若是是http请求,200请求成功完成 ; 404网址未找到 - geturl():返回请求的url服务器
####案例:cookie
from urllib import request
response = request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))
复制代码
上面代码打印出来的是浏览器访问“www.baidu.com”时返回的第一个html页面: socket
注:若是你在浏览器中看不到上面的源代码,能够清除cookie试试函数
2.测试post请求
from urllib import request
from urllib import parse
#request.urlopean(url,data,)
data = bytes(parse.urlencode({'word':'hello'}),encoding='utf-8')
response = request.urlopen('http://httpbin.org/post',data=data);#这是一个HTTP测试网站
print(response.read().decode('utf-8'))
复制代码
上面代码的输出的是json格式:
3.超时设置:在规定时间没有获得响应就会抛出异常
from urllib import request
response = request.urlopen('http://httpbin.org/get',timeout=0.1);#这是一个HTTP测试网站,超时时间设置为0.1秒
print(response.read().decode('utf-8'))
复制代码
上面代码会报异常:socket.timeout: timed out
下面代码输出的是:TimeOut
from urllib import request
from urllib import error
import socket
try:
response = request.urlopen('http://httpbin.org/get',timeout=0.1);#超时0.1s
except error.URLError as e:
if isinstance(e.reason,socket.timeout):
print('TimeOut')
复制代码
上面是urlopen使用,即发如何发起request请求,下面介绍response相关知识点
#response
from urllib import request
response = request.urlopen('http://www.python.org');
print(type(response))
复制代码
输出的结果是: 打印出来的是: class 'http.client.HTTPResponse'
2.response中的主要成员:状态码和响应头
from urllib import request
response = request.urlopen('http://www.python.org');
print(response.status)
print(response.getheaders());
print(response.getheader('server'))#获取响应头中的某一个取值
复制代码
输出结果:
上面结果对应浏览器的下面结果:
3.获取response响应体的内容
from urllib import request
response = request.urlopen('http://www.python.org');
print(response.read.decode('utf-8'))
复制代码
输出的内容在文章开头的get请求中以已经介绍了
#Request对象
执行结果:
另一种添加header的方式:
#代理:Handle
from urllib import request
proxy_handle = request.ProxyHandle({
‘http':http://代理ip
'https':https://代理IP
})
opener = request.builder_opener(proxy_handle)
response = opener.open('www.baidu.com')
复制代码
##cookie 在爬虫中,cookie主要是用来维持用户帐号的登陆状态 1.cookie的获取
#---------------获取cookie
from http import cookiejar
from urllib import request
cookie = cookiejar.CookieJar()
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
response = opener.open('http://www.baidu.com')
for item in cookie:
print(item.name+' = '+item.value)
复制代码
2.**cookie保存:**由于cookie能够用来保持登陆信息的,因此能够把cookie保存成文本文件。若是cookie没有失效,咱们能够从文件读取cookie,并将cookie附加在request中:
#---------------保存cookie
from http import cookiejar
from urllib import request
filename= 'cookie.txt'
cookie = cookiejar.MozillaCookieJar(filename)
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True,ignore_expires=True)
复制代码
3.cookie:cookie能够保存成不一样的格式,可是这不过重要,你使用什么格式存储的就使用什么格式读取就好,下面是另一种cookie保存格式,主要是类
#---------------保存cookie另一种格式
from http import cookiejar
from urllib import request
filename= 'cookie.txt'
cookie = cookiejar.LWPCookieJar(filename)
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True,ignore_expires=True)
复制代码
#---------------读取cookie
from http import cookiejar
from urllib import request
filename= 'cookie.txt'
cookie = cookiejar.LWPCookieJar(filename)
cookie.load('cookie.txt',ignore_discard=True,ignore_expires=True);
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
response = opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))
复制代码
#异常处理
from urllib import request,error
try:
response = request.urlopen('网址')#当网页不存在的时候,异常能够捕获到,程序不会终止退出
except error.URLError as e:
print(e.reason)
复制代码
上面的异常也能够像java那样分类捕捉异常,主要有三个error: 1.URLError 2.HTTPError(URLError的子类) 3.ContentTooShortError
#parse,URL解析
from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(result,result))
复制代码
type:class 'urllib.parse.ParseResult' result: scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment'
from urllib.parse import urunlparse
data = ['http','www.baidu.com','index.html','a=6','comment']
print(urlunparse(data))
#http://www.baidu.com/index.html?a=6#comment
复制代码
urlencode将以字典形式组织的参数拼接到url上
欢迎关注我的公众号【菜鸟名企梦】,公众号专一:互联网求职面经、java、python、爬虫、大数据等技术分享**: 公众号**菜鸟名企梦
后台发送“csdn”便可免费领取【csdn】和【百度文库】下载服务; 公众号菜鸟名企梦
后台发送“资料”:便可领取5T精品学习资料**、java面试考点和java面经总结,以及几十个java、大数据项目,资料很全,你想找的几乎都有