python中的urllib库,urllib3包括urllib吗

  python中的urllib库,urllib3包括urllib吗

  1.urllib urllib是Python中请求url连接的官方标准库。在Python2中主要是urllib和urllib2,在Python3中集成到urllib中。urllib中有四个模块,如下所示:

  Request:主要负责构造和发起网络请求,定义适合在各种复杂情况下打开URL(主要是HTTP)的函数和类。错误:处理异常分析:分析各种数据格式。robotparser:正在解析robot.txt文件1.urllib。请求模块中最常用的函数是urllib.request.urlopen(),具有以下参数:

  Urllib.request.urlopen (URL,data=none,[timeout,] *,cafile=none,capath=none,cadefault=false,context=none) URL:请求的URL数据:要发送到服务器的数据超时:设置网站的访问超时urlopern返回对象提供方法:

  Read()、readline()、readlines()、fileno()、close():对HTTPResponse类型的数据进行操作。info():返回一个HTTPMessage对象,指示远程服务器返回的头信息。getcode():返回Http状态代码。如果是http请求,则200请求成功完成;44未找到URL geturl():返回请求的url(1)发送简单的GET请求:

  From urllib导入请求response=request . urlopen( https://www . Baidu . com )print(response . read()。decode())在urlopern()方法中,直接写要访问的url地址字符串,这个方法会主动访问目标URL,然后返回访问结果。返回的访问结果是http.client.HTTPResponse对象。使用这个对象的read()方法,我们可以获得访问网页所获得的数据。这些数据是二进制格式的,所以我们还需要使用decode()方法对获得的二进制数据进行解码,转换成我们可以读取的可理解的字符串。

  (2)发送简单的POST请求:

  从urllib导入reuqestresponse=request . urlopen( http://http bin . org/post ,Data=b word=hello )打印(响应。阅读()。decode () # decode()解码在urlapen()方法中,urlapen()的默认访问方法是GET。当在urlapen()方法中传递数据参数时,将启动一个POST请求。注意:传递的data数据需要为bytes格式

  (3)复杂的请求——请求头

  当我们需要模拟一些其他参数时,简单的urlopen()方法已经不能满足我们的需求。这时,我们需要使用urllib.request中的Request对象来帮助我们模拟一些其他的参数,比如请求头。

  请求对象如下:

  #请求对象实例化req=urllib.request.request (URL,data=none,headers={},origin _ req _ host=none,unverifiable=false,method=none)举例如下:

  从urllib导入请求URL= http://http bin . org/get headers={ user-agent : Mozilla/5.0(Macintosh;英特尔OS X 10 _ 13 _ 5)\ Apple WebKit/537.36(KHTML,和GECKO一样)Chrome/66 . 0 . 3359 . 181 Safari/537.36 } #需要使用url和headers生成一个请求对象,然后将其传入urlopen方法req=request.request (URL,headers=headers)resp=Request . urlopern(req)print(resp . read()。decode())

  (4)复杂的请求—代理IP

  用爬虫抓取数据时,如果访问太频繁,网站有限制,很可能我们的ip地址会被封禁。这时候就需要设置一个代理来隐藏我们的真实IP。

  代理IP的原理:以本机先访问代理IP,再通过代理IP地址访问服务器,这样服务器接受到的访问IP就是代理IP地址。

  Urllib提供了urllib.request.ProxyHandler()方法来动态设置代理IP池。代理IP以字典的形式传入这个方法,然后通过urllib.reques.build_opener()创建opener对象,请求由这个对象的open()方法发送到服务器。

  从urllib导入请求URL= http://httpbin . org/IP proxy={ http : 218 . 18 . 232 . 26:80 ,Https : 218 . 18 . 232 . 26:80 } proxy=request . proxy handler(proxy)# Create proxy handler opener=request . build _ opener(proxy)# Create opener object resp=opener . open(URL)print(resp . read()。Decode())。在上面的方法中,我们还使用了一个新的东西,那就是request.build_opener()方法。事实上,urlopen()通过构造的Opener对象发送请求。这里我们使用request.build_opener()方法来重构一个opener()对象,通过它我们可以实现urlopen()实现的任何东西。

  (5)复杂的请求—cookies

  有时候我们在访问一些网站的时候,需要做翻页或者跳转等其他操作。为了防止我们想要的数据被访问,我们需要让网站认识到我们是同一个用户。这时候就需要带上cookie进行访问了。

  在设置cookie时,urllib没有一个好的cookie处理对象,所以这里我们需要使用另一个库,即http库,并使用里面的cookiejar来管理cookie:

  从http导入cookiejar从urllib导入请求URL= 3359 www.baidu.com #创建一个cookie jar对象cookie=cookiejar。CookieJar()#使用HTTPCookieProcessor创建cookie处理器cookie=request.http cookie处理器(cookie) #并将其作为参数创建Opener对象Opener=request . build _ Opener(cookie)#使用此Opener发起请求resp=opener.open(url) #。如果看前面的cookie对象,可以看到访问百度获得的cookie: print(i)中的cookiefor i。当然,如果使用install_opener方法将上面生成的opener对象设置为global,那么每次访问opener对象时都会获取这个cookie。全局设置后,可以使用urlopen()方法或opener.open()方法。如果不安装,只能用opener.open()方法。

  #将此开启器设置为全局开启器。之后所有的请求,无论是opener.open()还是urlopen()发送的,都会使用自定义的request . install _ opener(opener)resp=request . urla pen(URL)(6)复杂的请求—证书验证

  CA(Certificate Authority)是数字证书认证中心(Digital Certificate Certificate Center)的简称,是指颁发、管理和废止数字证书的可信第三方机构。

  CA的作用是检查证书持有人身份的合法性,颁发证书防止被伪造或篡改,管理证书和密钥。在现实生活中,身份证可以用来证明身份,所以在网络世界中,数字证书就是身份证。与现实生活不同的是,并不是每个网络用户都有数字证书,往往只有当一个人需要证明自己的身份时,才需要数字证书。普通用户一般不需要,因为网站不在乎谁访问了网站。现在网站只关心流量。但反过来,网站需要证明自己的身份。比如现在有很多钓鱼网站。例如,你想参观www.baidu.com,但实际上你正在参观www.daibu.com。“因此,在提交您的私人信息之前,您需要验证网站的身份,并要求网站出示数字证书。正常的网站会主动出示自己的数字证书,以保证客户端与网站服务器之间的通信数据是加密安全的。

  最简单的方法是通过添加忽略ssl证书验证来关闭证书验证。因为urllib没有很好的处理ssl,这里我们需要使用另一个库,即ssl库,如下:

  导入sslfrom urllib导入请求context=ssl。_ create _ un verified _ Context()RES=URL lib . request . urlopen(request,Context=context) 2。urllib.error模块主要在urllib中设置了两个异常,一个是URLError,一个是HTTPError,是URLError的子类。

  HTTPError还包含三个属性:

  Code:请求原因的状态代码:错误标题的原因:来自urlib的响应的标题。错误导入HttpError:request . urlopern( 3359 www . jinshu . com )除了HttpError为e: print (e.code) 3。urllib.parse模块的数据参数需要urllib.parse模块以数据格式进行处理。

  url lib . parse . quote(URL):(URL):(URL编码处理)主要对URL中的非ASCII代码进行编码。

  url lib . parse . un quote(URL):(URL):(URL解码处理)URL上的特殊字符恢复

  Urllib.parse.urlencode:对请求数据进行格式转换。

  二。urllib3来自官方网站的解释:

  Urllib3是一个强大的HTTP客户端,对SAP来说是健壮的。许多Python生态系统已经使用了urllib3,你也应该这样做。

  要通过urllib3访问网页,必须先构造一个PoolManager对象,然后通过PoolMagent中的request方法或urlopen()方法访问网页。这两种方法几乎没有区别。

  类URL库3。泳池管理员。池管理器(池数=10,头数=无,**连接池功率)生成一个自动释放池所需要的参数:

  数量_池代表了缓存的池的个数,如果访问的个数大于池数量,将按顺序丢弃最初始的缓存,将缓存的个数维持在池的大小10 .标题代表了请求头的信息,如果在初始化自动释放池的时候制定了标题,那么之后每次使用自动释放池来进行访问的时候,都将使用该头球来进行访问**连接_池_千瓦是基于连接池来生成的其它设置当访问网页完成之后,将会返回一个HTTPResponse对象,可以通过如下的方法来读取获取得到请求的响应内容:

  导入urllib3http=urllib3 .PoolManager(num_pools=5,headers={ 用户代理: ABCDE })resp 1=http。请求( GET , http://www.baidu.com ,body=data)# resp 2=http。urlopen( GET , http://www.baidu.com ,body=data)print(resp 2。数据。decode())除了普通的得到请求之外,你还可以使用请求()或者urlopen()进行邮政请求:

  导入URL lib 3导入JSON数据=JSON。转储({ ABC : 123 })http=URL lib 3 .PoolManager(num_pools=5,headers={ 用户代理: ABCDE })resp 1=http。请求( POST , http://www.httpbin.org/post ,正文=数据,超时=5,重试=5)# resp 2=http。URL打开(发布, http://www.httpbin.org/post ,正文=数据,超时=5,重试=5)打印(响应1。数据。decode())注意事项

  urllib3并没有办法单独设置cookie,所以如果你想使用甜饼干的话,可以将cookie放入到headers中

  request()和urlopen()方法:请求(self,method,url,fields=None,headers=None,**urlopen_kw)urlopen(self,method,url,redirect=True,**kw):差距还是很明显的,urlopen()比请求()有三个参数是不一样的,你会发现请求()具有字段,标题两个参数。而且相比之下重新测试()方法还是比较符合人们的使用方式的,所以更多的也就使用请求()方法了。

  推荐使用请求()来进行访问的,因为使用请求()来进行访问有两点好处,

  可以直接进行邮政请求,不需要将数据直接进行得到请求,参数转换成JSON格式导入URL lib 3导入JSON数据={ ABC : 123 } http=URL lib 3 .PoolManager(num_pools=5,headers={ 用户代理: ABCDE })resp 1=http。请求( POST , http://www.httpbin.org/post ,字段=数据)# resp 1=http。请求(获取, http://www.httpbin.org/post ,字段=数据)打印(责任1。数据。decode())

  虽然urlopen()没有字段,但这并不代表它不能进行邮政访问,相反,两个方法都有一个身体属性,这个属性就是我们平时邮政请求时所熟知的数据参数,只不过你需要将数据字典先转换成数据格式再进行传输。

  不需要自己拼接url参数

  2.2 urllib3代理管理器如果你需要使用代理来访问某个网站的话,那么你可以使用代理经理对象来进行设置

  def __init__(self,proxy_url,num_pools=10,headers=None,proxy_headers=None,* * connection _ pool _ kw):代理管理器和自动释放池的方法基本完全相同,这里举个简单的小例子,就不再赘述了:

  导入URL lib 3导入JSON数据={ ABC : 123 } proxy=URL lib 3 .代理经理( http://50。233 .137 .33:80 ,headers={ connection : keep-alive })resp 1=proxy。请求(过帐, http://www.httpbin.org/post ,字段=数据)打印(责任1。数据。decode())

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: