本篇内容介绍了“Python的HTTP客户端模块urllib与urllib3怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!urllib
是Python中请求url连接的官方标准库,就是你安装了python,这个库就已经可以直接使用了,基本上涵盖了基础的网络请求功能。在Python2中主要为urllib和urllib2,在Python3中整合成了urllib。Python3.x中将urllib2
合并到了urllib
,之后此包分成了以下四个模块:urllib.request: 它是最基本的http请求模块,用来模拟发送请求urllib.error: 异常处理模块,如果出现错误可以捕获这些异常urllib.parse: 一个工具模块,提供了许多URL处理方法,如:拆分、解析、合并等urllib.robotparser:主要用来识别网站的robots.txt文件,然后判断哪些网站可以爬它支持如下协议的URL处理:file,ftp,gopher,hdl,http,https,imap,mailto,mms,news,nntp,prospero,rsync,rtsp,rtspu,sftp,sip,sips,snews,svn,snv+ssh,telnet,wais语法:urllib.parse.urlparse(urlstring,scheme=”,allow_fragments=True)可以传递3个参数urlstring:待解析的URL,字符串scheme:它是默认的协议,如http或者https,URL如果不带http协议,可以通过scheme来指定,如果URL中制定了http协议则URL中生效allow_fragments:是否忽略fragment即锚点,如果设置为False,fragment部分会被忽略,反之不忽略该方法可以实现URL的识别和分段,分别是scheme(协议),netloc(域名),path(路径),params(参数),query(查询条件),fragment(锚点)与urlparse()相反,urlunparse通过列表或者元祖的形式接受一个可迭代的对象,实现URL构造与urlparse()方法类似,它会返回5个部分,只是把params合并到path中。与urlunparse()类似,它也是将链接的各部分组合完整的链接的方法,传入的参数也是可迭代的对象,如列表元祖等,唯一的区别是长度必须是5个,它省略了paramsurlencode() 将dict中的键值对以连接符&划分。urlencode()在构造GET请求参数时很有用,可以将字典类型的请求数据转变为url编码parse_qs()与urlencode()正好相反,它是用来反序列化的,如将GET参数转换回字典格式quote:URL编码处理,该方法可以将内容转换为URL编码的格式。如参数中带有中文等非ASCII码时,有时会导致乱码的问题,此时用这个方法将中文字符转化为URL编码unquote(url):URL解码处理,与quote()相反,URL上的特殊字符还原格式:urljoin(baseurl,newurl,allowFrag=None)通过将基本URL(base)与另一个URL(url)组合起来构建完整URL,它会使用基本URL组件,协议(schemm)、域名(netloc)、路径(path)、来提供给URL中缺失的部分进行补充,最后返回结果。base_url提供了三项内容scheme,netloc,path,如果这3项在新的链接中不存在就给予补充,如果新的链接存在就使用新的链接部分,而base_url中的params,query和fragment是不起作用的。通过urljoin()方法可以实现链接的解析、拼接和生成。不写路径filename则会被存为临时文件,可以用urllib.urlcleanup()来清理缓存模块中最常用的函数为urlopen():参数如下:url: 请求的网址,str类型,也可以是一个request对象data:要发送到服务器的数据,data参数是可选的,内容为字节流编码格式的即bytes类型,如果传递data参数,urlopen将使用Post方式请求。timeout:设置网站的访问超时时间,单位为秒,如果请求超出了设置时间还未得到响应则抛出异常,支持HTTP,HTTPS,FTP请求。其他参数:context参数,她必须是ssl.SSLContext类型,用来指定SSL设置,此外,cafile和capath这两个参数分别指定CA证书和它的路免费云主机域名径,会在https链接时用到。urlopen返回http.client.HTTPResponse对象,提供方法:read():获取响应返回的数据,只能使用一次。readline():返回得是二进制格式得页面中得第一行readlines() :以二进制格式 返回所有得数据 以列表格式保存fileno():close() :info():返回一个httplib.HTTPMessage 对象,表示远程服务器返回的头信息。getcode():返回Http状态码,如果是http请求,200表示请求成功完成;404表示网址未找到。getheaders():获取返回响应的响应报头。geturl():返回请求的url。在urlopen()方法中,直接写入要访问的url地址字符串,该方法就会主动的访问目标网址,然后返回访问结果。返回的访问结果是一个http.client.HTTPResponse对象,使用该对象的read()方法即可获取访问网页获取的数据,这个数据是二进制格式的,所以我们还需要使用decode()方法来将获取的二进制数据进行解码,转换成我们可以看的懂得字符串。不需要使用read()方法 。GET请求和我们平常get访问方式一样,直接把参数写到网址上面就好了。在urlopen()
方法中,urlopen()
默认的访问方式是GET,当在urlopen()
方法中传入data参数时,则会发起POST请求。注意:传递的data数据需要为bytes格式,如data=b’word=hello’。当我们需要模拟一些其他的参数的时候,简单的urlopen()
方法已经无法满足我们的需求了,这个时候我们就需要使用下面的urllib.request
中的Request
对象来帮助我们实现一些其它参数的模拟,比如请求头。Request
对象如下所示:url:请求的URL,必须传递的参数,其他都是可选参数data:上传的数据,必须传bytes字节流类型的数据,如果它是字典,可以先用urllib.parse模块里的urlencode()编码headers:它是一个字典,传递的是请求头数据,可以通过它构造请求头,也可以通过调用请求实例的方法add_header()来添加
例如:修改User_Agent头的值来伪装浏览器,比如火狐浏览器可以这样设置:
{‘User-Agent’:’Mozilla/5.0 (compatible; MSIE 5.5; Windows NT)’}origin_req_host:指请求方的host名称或者IP地址unverifiable:表示这个请求是否是无法验证的,默认为False,如我们请求一张图片如果没有权限获取图片那它的值就是truemethod:是一个字符串,用来指示请求使用的方法,如:GET,POST,PUT等BaseHandler类:在urllib.request模块里的BaseHandler类,他是所有其他Handler的父类,他是一个处理器,比如用它来处理登录验证,处理cookies,代理设置,重定向等BaseHandler的子类包括:HTTPDefaultErrorHandler:用来处理http响应错误,错误会抛出HTTPError类的异常HTTPRedirectHandler:用于处理重定向HTTPCookieProcessor:用于处理cookiesProxyHandler:用于设置代理,默认代理为空HTTPPasswordMgr:永远管理密码,它维护用户名和密码表HTTPBasicAuthHandler:用户管理认证,如果一个链接打开时需要认证,可以使用它来实现验证功能build_opener(*handlers)方法用于构建一个自定义的OpenerDirector对象。之前的urlopen()方法就是urllib提供的一个Opener,通过Handler处理器来构建Opener实现Cookies处理,代理设置,密码设置等Opener的方法包括:add_handler(handler):添加处理程序到链接中open(url,data=None[,timeout]):打开给定的URL与urlopen()方法相同error(proto,*args):处理给定协议的错误设置全局后既可以用urlopen()方法, 也可以用opener.open() ,不安装的话只能用opener.open()方法HTTPPasswordMgrWithDefaultRealm()类创建一个密码管理对象,用来保存HTTP请求相关的用户名和密码,主要应用两个场景:验证代理授权的用户名和密码(ProxyBasicAuthHandler())验证web客户端的用户名和密码(HTTPBasicAuthHandler())在下面的方法中我们还用到了一个新的东西,即request.build_opener()方法,其实urlopen()就是通过构造好了的opener对象发送请求,在这里我们使用request.build_opener()方法重构了一个opener()对象,我们可以通过这个对象实现urlopen()实现的任何东西。使用爬虫来爬取数据的时候,如果过于频繁的访问,而且网站还设有限制的话,很有可能会禁封我们的ip地址,这个时候就需要设置代理,来隐藏我们的真实IP。urllib提供了urllib.request.ProxyHandler()方法可动态的设置代理IP池。将代理IP以字典形式传入该方法,然后通过urllib.reques.build_opener()创建opener对象,用该对象的open()方法向服务器发送请求。有时候当我们访问一些网站的时候需要进行翻页或者跳转等其它操作,为了防止无法访问我们想要的数据,需要让网站识别我们是同一个用户。这个时候我们就需要带上cookie进行访问。在设置cookie的时候由于urllib并没有很好的处理cookie的对象,所以在这里我们需要用到一个别的库,即http库,并使用里面的cookiejar来进行cookie的管理:CookieJar类关系:CookieJar —-派生—->FileCookieJar —-派生—–>MozillaCookieJar和LWPCookieJarcookies保存到文件:1、以Mozilla型浏览器的cookies格式:cookie=http.cookiejar.MozillaCookieJar(filename=fielname)
从文件中读取cookies:2、也可以保存为libwww-perl(LWP)格式的Cookies文件cookie=http.cookiejar.LWPCookieJar(filename=fielname)
当然,如果把上面这个生成的opener对象使用install_opener方法来设置为全局的,opener对象之后的每次访问都会带上这个cookie。通过添加忽略ssl证书验证关闭证书验证,由于urllib并没有很好的处理ssl的对象,所以在这里我们需要用到一个别的库,即ssl库,如下:当你 urllib.urlopen一个 https 的时候会验证一次 SSL 证书,当目标使用的是自签名的证书时就会出现一个URLError,如果是这样可以在开头加上urllib的error模块定义了由request模块产生的异常,如果出现问题,request模块便会抛出error模块中定义的异常。在urllib中主要设置了两个异常,一个是URLError,一个是HTTPError,HTTPError是URLError的子类。URLError类来自urllib库的error模块,它继承自OSError类,是error异常模块的基类,由request模块产生的异常都可以通过捕获这个类来处理它只有一个属性reason,即返回错误的原因reason如超时则返回一个对象它是URLError的子类,专门用来处理HTTP请求错误,比如认证请求失败,它有3个属性:code:返回HTTP的状态码,如404页面不存在,500服务器错误等reason:同父类,返回错误的原因headers:返回请求头举例:利用urllib的robotparser模块,我们可以实现网站Robots协议的分析也称为爬虫协议、机器人协议,它的全名叫做网络爬虫排除标准(Robots Exclusion Protocol),用来告诉爬虫和搜索引擎哪些网页可以抓取,哪些不可以抓取,它通常是一个robots.txt的文本文件,一般放在网站的根目录下。当搜索爬虫访问一个站点时,它首先会检查这个站点根目录下是否存在robots.txt文件,如果存在,搜索爬虫会根据其中定义的爬去范围来爬取,如果没有找到,搜索爬虫会访问所有可直接访问的页面我们来看下robots.txt的样例:它实现了对所有搜索爬虫只允许爬取public目录的功能,将上述内容保存为robots.txt文件放在网站根目录下,和网站的入口文件(index.html)放在一起1、User-agent描述了搜索爬虫的名称,将其设置为*则代表协议对任何爬虫有效,如设置为Baiduspider则代表规则对百度爬虫有效,如果有多条则对多个爬虫受到限制,但至少需要指定一条一些常见的搜索爬虫名称:BaiduSpider 百度爬虫 www.baidu.comGooglebot Google爬虫 www.google.com360Spider 360爬虫 www.so.comYodaoBot 有道爬虫 www.youdao.comia_archiver Alexa爬虫 www.alexa.cnScooter altavista爬虫 www.altavista.com2、Disallow指定了不允许抓取的目录,如上例中设置的/则代表不允许抓取所有的页面3、Allow一般和Disallow一起使用,用来排除单独的某些限制,如上例中设置为/public/则表示所有页面不允许抓取,但可以抓取public目录设置示例:用来解析robots.txt,该模块提供了一个类RobotFileParser,它可以根据某网站的robots.txt文件来判断一个抓取爬虫时都有权限来抓取这个网页robotparser类常用的方法:set_url():用来设置robots.txt文件的连接,如果在创建RobotFileParser对象是传入了连接,就不需要在使用这个方法设置了read():读取reobts.txt文件并进行分析,它不会返回任何内容,但执行那个了读取和分析操作parse():用来解析robots.txt文件,传入的参数是robots.txt某些行的内容,并安装语法规则来分析内容can_fetch():该方法传入两个参数,第一个是User-agent,第二个是要抓取的URL,返回的内容是该搜索引擎是否可以抓取这个url,结果为True或Falsemtime():返回上次抓取和分析robots.txt的时间modified():将当前时间设置为上次抓取和分析robots.txt的时间urllib3增加了连接池等功能,两者互相都有补充的部分。许多Python的原生系统已经开始使用urllib3。urllib3提供了很多python标准库urllib里所没有的重要特性:线程安全连接池客户端SSL/TLS验证文件分部编码上传协助处理重复请求和HTTP重定位支持gzip和deflate压缩编码支持HTTP和SOCKS代理100%测试覆盖率urllib3是一个第三方库,pip安装:通过urllib3访问一个网页,那么必须首先构造一个PoolManager对象,然后通过PoolMagent中的request方法或者 urlopen()方法来访问一个网页,两者几乎没有任何区别。生成一个PoolManager所需要的参数:num_pools 代表了缓存的池的个数,如果访问的个数大于num_pools,将按顺序丢弃最初始的缓存,将缓存的个数维持在池的大小。headers 代表了请求头的信息,如果在初始化PoolManager的时候指定了headers,那么之后每次使用PoolManager来进行访问的时候,都将使用该headers来进行访问。** connection_pool_kw 是基于connection_pool 来生成的其它设置当访问网页完成之后,将会返回一个HTTPResponse对象。使用request()或者urlopen(),获取GET请求的响应内容:使用request()或者urlopen(),进行 POST 请求:注意事项:urllib3 并没有办法单独设置cookie,所以如果你想使用cookie的话,可以将cookie放入到headers中urlopen()比request()有三个参数是不一样的,你会发现request()具有fields,headers两个参数。所以更多的也就使用 request() 方法了。推荐使用request()来进行访问的,因为使用request()来进行访问有两点好处,可以直接进行post请求,不需要将 data参数转换成JSON格式直接进行GET请求,不需要自己拼接url参数语法:request(self, method, url,fields=None,headers=None, **urlopen_kw)urlopen(self, method, url, redirect=True, **kw):如果你需要使用代理来访问某个网站的话, 那么你可以使用 ProxyManager 对象来进行设置ProxyManager和PoolManager的方法基本完全相同。“Python的HTTP客户端模块urllib与urllib3怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注百云主机网站,小编将为大家输出更多高质量的实用文章!
这篇文章主要介绍了如何实现JavaWeb文件上传的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何实现JavaWeb文件上传文章都会有所收获,下面我们一起来看看吧。java免费云主机域名代码:1.文件上传表单要用post方式提交,…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。