urllib的parse模块主要是实现url的解析,合并,编码,解码
from urllib import parse
#parse.urlparse实现了url的识别和分段
url = 'https://www.1712B.com/daxuesheng?name=zhangsan#123'
"""
url,:要解析和才分的url
scheme='':设置协议,只有在url没有协议的情况下才会生效
allow_fragments=True:是否忽略锚点,默认为True表示不忽略
"""
result = parse.urlparse(url)
"""
(scheme='https'(协议), netloc='www.1712B.com'(域),
path='/daxuesheng'(路径), params=''(可选参数),
query='name=zhangsan'(查询参数), fragment='123'(锚点))
"""
print(result)
#取出才分后的某一个参数
print(result.scheme)
#parse.urlunparse可以实现url的组合
data = [sub_str for sub_str in result]
print('-----',data)
full_url = parse.urlunparse(data)
print(full_url)
#parse.uurlrljoin需要传递一个基类url,根据基类将某一个不完整的url拼接完整
sub_url = '/p/123456'
base_url = 'https://www.1712B.com/daxuesheng?name=zhangsan#123'
full_url = parse.urljoin(base_url,sub_url)
print('urljoin',full_url)
#parse.urlencode将字典类型的参数,序列化为url的编码格式的字符串
parmars = {
'name':'张三',
'class':'1712B',
}
result = parse.urlencode(parmars)
print('urlencode',result)
#parse.parse_qs反序列化,将url编码格式的字符串,转为字典类型
result = parse.parse_qs(result)
print('parse_qs',result)
#parse.quote可以将中文字符,转为url编码格式
kw = '摸摸摸'
result = parse.quote(kw)
print('quote',result)
#将url编码进行解码
result = parse.unquote(result)
print('unquote',result)
# 最最常用的是urljoin,urlencode两个方法
urllib下使用代理
# http/https代理
# 一定是一个高匿代理理
# 隐藏真实ip
from urllib import request
#自定义ProxyHandler的目的是为了设置代理,使用代理发起请求
#proxies:对应的是一个字典
# 代理有免费代理(西刺,快代理.....)
# 和收费代理 (西刺,快代理.....,阿布云....)
# proxies = {
# 'http':'118.187.58.34:53281',
# 'https':'124.235.180.121:80',
# }
#独享代理,需要账号密码做验证的
proxies = {
'http':'http://2295808193:6can7hyh@106.12.23.200:16818',
'https':'https://2295808193:6can7hyh@106.12.23.200:16818'
}
handler = request.ProxyHandler(proxies=proxies)
#自定义opener
opener = request.build_opener(handler)
#url地址
#https://httpbin.org/get
url = 'http://httpbin.org/get'
response = opener.open(url)
print(response.status)
print(response.read().decode('utf-8'))
urllib.error:在发起请求的过程中,可能会因为各种情况
# 导致请求出现异常,因而导致代码崩溃,所以我们悬疑处理这些异常的请求
from urllib import error,request
# error.URLError
def check_urlerror():
"""
1.没有网络
2.服务器连接失败
3.找不到指定服务器
:return:
"""
url = 'http://www.baidu.com/'
try:
response = request.urlopen(url,timeout=0.01)
print(response.status)
except error.URLError as err:
#[Errno -2] Name or service not known(未知服务器)
#timed out:请求超时
#[Errno -3] Temporary failure in name resolution(没网)
print(err.reason)
# check_urlerror()
# error.HTTPError是URLError的子类
def check_httperror():
url = 'https://www.qidian.com/all/nsacnscn.htm'
try:
response = request.urlopen(url)
print(response.status)
except error.HTTPError as err:
#HTTPError的三个属性
#状态码
print(err.code)
#返回错误的原因
print(err.reason)
#返回响应头
print(err.headers)
except error.URLError as err:
print(err.reason)
check_httperror()
自定义opener
from urllib import request
def send_request(req, timeout=100, context=None):
"""
自己定义一个方法发起请求
:param req: request请求对象
:param timeout: 设置请求的超时时间
:param context: 忽略ssl证书认证(ca证书)
:return:
handler:创建handler处理器是为了实现特定功能
opener:为了使用opener.open方法发起请求
"""
if context:
handler = request.HTTPSHandler(context=context,debuglevel=1)
opener = request.build_opener(handler)
return opener.open(req, timeout=timeout)
else:
#debuglevel默认为0,设置为1的话表示开启debug模式,
#会对请求进行跟踪,方便查看每一个请求的信息
handler = request.HTTPSHandler(debuglevel=1)
opener = request.build_opener(handler)
return opener.open(req, timeout=timeout)
url = 'http://www.baidu.com/'
req_header = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
req = request.Request(url,headers=req_header)
response = send_request(req)
print(response.read().decode('utf-8'))
网友评论