urllib库

3.1 使用urllib

urllib库是python内置的HTTP请求库。
request:它是最基本的HTTP请求模块
error:异常处理模块
parse:一个工具模块

3.1.1 发送请求

使用urllib的request模块,可以方便得实现请求的发送并得到响应

1.urlopen()

以python官网为例,我们把这个网页抓下来:

from urllib import request

respone=request.urlopen('https://www.python.org')
print(respone.read().decode('utf-8'))

响应是一个HTTPResponse 类型的对象,主要包含read(),readinto(),getheader(name),getheaders(),fileno() 等方法,以及msg,version,status,reason,debuglevel,closed 等属性

urlopen()函数的API:
urllib.request.urlopen(url,data=None,[timeout]\* ,cafile=None,capath=None,cadefault=False,context=None)
timeout参数:

timeout参数用于设置超时时间,单位为,意思是如果请求超过了设置的这个时间,还没有得到响应,就会抛出异常。因此可以通过设置这个超时时间来控制一个网页如果长时间未响应,就跳过它的抓取。

import socket
from urllib import request,error

try:
    response=request.urlopen('http://httpbin.org/get',timeout=0.1)
except error.URLError as e:
    if isinstance(e.reason,socket.timeout):
        print('TIME OUT')

2.Request

如果请求中需要加入Headers等信息,就可以利用更强大的Request类来构建

'''例子'''
from urllib import request

url='https://www.python.org'
req=request.Request(url)
response=request.urlopen(req)#urlopen()的参数由url变成了Request类的对象
print(response.read().decode('utf-8'))
Request的构造方法:
class urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=Npne)

1.第一个参数url用来请求URL,这是必传参数,其他都是可选参数。
2.第二个参数data如果要传,必须传bytes(字节流)类型的。如果它是字典,可以先用urllib.parse模块里的urldecode()编码。
3.第三个参数headers是一个字典,它就是请求头,我们可以构造请求时通过headers参数直接构造,也可以通过调用请求实例的add_header() 方法添加。
4.第四个参数origin_req_host 指的是请求方的host名称或者IP地址。
5.第五个参数unverfiable
6.第六个参数method是一个字符串,用来指请求时使用的方法
举个例子:

from urllib import request,parse

url='http://httpbin.org/post'
headers={
    'Use-Agent':'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)'
    ,'Host':'httpbin.org'
}
dict={
    'name':'Germey'
}
data=bytes(parse.urlencode(dict),encoding='utf-8')
req=request.Request(url=url,headers=headers,data=data,method='POST')
response=request.urlopen(req)
print(response.read().decode('utf-8')

运行结果:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "name": "Germey"
  }, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Content-Length": "11", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "Use-Agent": "Mozilla/4.0(compatible;MSIE 5.5;Windows NT)", 
    "User-Agent": "Python-urllib/3.9", 
    "X-Amzn-Trace-Id": "Root=1-6065db0f-1c0ea1db629b705e722929a5"
  }, 
  "json": null, 
  "origin": "220.249.162.169", 
  "url": "http://httpbin.org/post"
}

另外,headers也可以用add_header() 的方法来添加:

req=request.Request(url=url,data=data,method='POST')
req.add_header('Use-Agent':'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)')

3.高级用法

对于一些更高级的操作(比如Cookie处理,代理设置等),就需要更高级的工具Handler,它是各种处理器,有专门处理登入验证的,有处理cookie的,有处理代理设置的。
urllib.request模块里的BaseHandler类,它是其他Handler的父类,它提供了最基础的方法,如default_open(),protocol_request()等。
有各种Hanler子类继承了BaseHandler类,例如:
1.HTTPDefaultErrorHandler:用于处理响应错误。
2.HTTPRedirectHandler:用于处理重定向。
3.ProxyHandler:用于处理代理设置,默认代理为空。
4.HTTPCookieProcessor:用于处理Cookies。
5.HTTPPasswordMgr:用于管理密码,它维护了用户名和密码表。
6.HTTPBasicAuthHAndler:用于管理认证。
另一个比较重要的类是OpennerDirector,我们可以称为Opener,Opener可以使用open() 方法,返回类型和urlopen()如出一辙。
举几个实例:

验证
from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urllib.error import  URLError

username='username'
password='password'
url='http://localhost:5000/'

p=HTTPPasswordMgrWithDefaultRealm()
#用add_password()添加用户名和密码
p.add_password(None,url,username,password)
#实例化HTTPBasicAuthHandler对象,其参数HTTPPasswordMgrWithDefaultRealm的对象
auth_handler=HTTPBasicAuthHandler(p)
#用handler构造opener
opener=build_opener(auth_handler)

try:
    #用open()方法访问url
    result=opener.open(url)
    html=result.read().decode('utf-8')
    print(html)
except URLError as e:
    print(e.reason)
代理
from urllib.request import ProxyHandler,build_opener
from urllib.error import  URLError

proxy_handler=ProxyHandler({
    'http':'http://127.0.0.1:9743',
    'https':'https://127.0.0.1:9743'
})
opener=build_opener(proxy_handler)
try:
    result=opener.open('https://www.baidu.com')
    html=result.read().decode('utf-8')
    print(html)
except URLError as e:
    print(e.reason)
 '''
 这里我们在本地搭建了一个代理,它运行在9743端口上。  
 这里使用了ProxyHandler,其参数是一个字典,键名是协议类型,键值是代理链接,可以添加多个代理。 
 然后,利用这个Handler及build_opener()方法构造出Opener,之后发送请求即可。
 '''
Cookie

先用实例将网站的Cookies获取下来:

import http.cookiejar,urllib.request

cookie=http.cookiejar.CookieJar()
handler=urllib.request.HTTPCookieProcessor(cookie)
opener=urllib.request.build_opener(handler)
response=opener.open('https://baidu.com')
for item in cookie:
   print(item.name+"="+item.value)

首先,必须声明一个CookieJar对象。接下来就需要利用HTTPCookiePocesser来构建一个Handler,最后利用build_opener()构建一个Opener,执行open()方法即可。
运行结果如下:

E:\pythonProject1\venv\Scripts\python.exe E:/expriment_1/github.py
BAIDUID=4960031CCAA92AB93BEE5567F01B4420:FG=1
BIDUPSID=4960031CCAA92AB9E8CD0B352782435C
H_PS_PSSID=33801_33810_33749_33344_31660_33779_33759_26350_33731_33803
PSTM=1617325714
BDSVRTM=0
BD_HOME=1

更新中

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值