《Python 爬虫库 urllib 使用详解.docx》由会员分享,可在线阅读,更多相关《Python 爬虫库 urllib 使用详解.docx(19页珍藏版)》请在第壹文秘上搜索。
1、Python爬虫库urllib使用详解一、Pythonurllib库Pythonurllib库用于操作网页URL,并对网页的内容进行抓取处理。Python3的urllibourllib包包含以下几个模块:urllib.request-打开和读取URLo urllib.error-包含UrIlib.request抛出的异常。 urllib.parse-解析URLo urllib.robotparser-解析robots.txt文件。需要用的就是每个模块的内置方法和函数。大概方法如下图:readOdecodeOgeturlQinfoOgetcodeOerror.URLErrorOreasonrea
2、soncodeheaderseror.ContetToSho11ErrorOrobotparser.RobotFiIeParserQset_url(urreadOsite_map二、UrHib.request模块urllib.request定义了一些打开URL的函数和类,包含授权验证、重定向、浏览器Ce)OkieS等。urllib.request可以模拟浏览器的一个请求发起过程。这里主要介绍两个常用方法,urlopen和Requesto1. urlopen函数语法格式如下:urllib.request.urlopen(url,data=None,timeout,*lCafiIe=None,ca
3、path=None,CadefauIt=FaIse,Context=None)url:url地址。data:发送到服务器的其他数据对象,默认为None0timeout:设置访问超时时间。cafile和capath:cafile为CA证书,capath为CA证书的路径,使用HTTPS需要用到。cadefault:已经被弃用。context:SSLSSLCOnteXt类型,用来指定SSL设置。示例:importurllibrequest#导入UHlibreques七模块UrI=UrIIib-requestarlopen(h七七ps:/wwwbaiducomu)#打开读取baidu信息print(u
4、r!read()-decode(lutf-8,)#获取所有信息,并decode。命令将网页的信息进行解码运行结果:getheadergetheadersfileno等方法,以及msgversionstatusreasondebuglevekclosed等属性。常用方法:read():是读取整个网页内容,也可以指定读取的长度,如read(300)o获取到的是二进制的乱码,所以需要用到decode。命令将网页的信息进行解码。 readline()-读取文件的一行内容。 readlines()-读取文件的全部内容,它会把读取的内容赋值给一个列表变量。 info():返回HTTPMeSSage对象,表
5、示远程服务器返回的头信息。 getcode():返回HttP状态码。如果是http请求,200请求成功完成;404网址未找到。 geturl():返回请求的UrI。2、Request类我们抓取网页一般需要对headers(网页头信息)进行模拟,否则网页很容易判定程序为爬虫,从而禁止访问。这时候需要使用到urllib.request.Request类:classurllib.request.Request(url,data=Noe,headers=,origin_req_host=None,UnverifiabIe=FaIse,method=None) url:url地址。data:发送到服务器
6、的其他数据对象,默认为None0headers:HTTP请求的头部信息,字典格式。origin_req_host:请求的主机地址,IP或域名。unverifiable:很少用整个参数,用于设置网页是否需要验证,默认是False0。method:请求方法,如GET、POST、DELETE.PUT等。示例:importurllibrequest#导入模块url=卜七七awwwbaidaCom”#网页连接headers=“UseLAgent:用。ZJlIa50(WindowsNT100;UJin64;x64)APPIeuJebKi七53736(KHTHJHkeGeCkO)Chrome/8003987
7、122SaFari53736# 定义headers,模拟浏览器访问req=urllibrequest-Requesturl=urlfheadersheaders)# 模拟浏览器发送,访问网页response=IArIIib-requestirlopen(req)# 获取页面信息printCresponseread()decode(,utf-8n)三、UrHib.error模块urllib.error模块为urllib.request所引发的异常定义了异常类,基础异常类是URLErrorourllib.error包含了两个方法,URLError和HTTPErroroURLError是OSErrO
8、r的一个子类,用于处理程序在遇到问题时会引发此异常(或其派生的异常),包含的属性reason为引发异常的原因。HTTPError是URLError的一个子类,用于处理特殊HTTP错误例如作为认证请求的时候,包含的属性code为HTTP的状态码,reason为引发异常的原因,headers为导致HTTPError的特定HTTP请求的HTTP响应头。区别:URLError封装的错误信息一般是由网络引起的,包括UH错误。HTTPError封装的错误信息一般是服务器返回了错误状态码。关系:URLErrOr是OSERROR的子类,HTTPElTOr是URLErTOr的子类。1.URLError示例fro
9、murllibimportrequestfromurllibimporterrorif_name_=_main_:#一个不存在的连接url=h七七p:/wwwbaiiiduuuu,com/req=requestRequest(ur!)try:response=requestur!open(req)htm!=responseread()decode(,utf8,)print(htm!)excepterror-URLErrorase:print(ereason)返回结果:Errno-2Nameorservicenotknownreason:此错误的原因。它可以是一个消息字符串或另一个异常实例。2.
10、HTTPError示例fromurllibimportrequestIfromUrlIibimporterror-namemainurl=“http:WWWreq=request.Request(url)try:response=request.urlopen(req)html=response,read().decode(Utf-8l面Q(html)excepterror.HTTPErrorase:Q(e.code)返回结果:code一个HTTP状态码,具体定义见RFC2616o这个数字的值对应于存放在http.server.BaseHTTPRequestHandler.responses代
11、码字典中的某个值。reason这通常是一个解释本次错误原因的字符串。headers导致HTTPError的特定HTTP请求的HTTP响应头。3.URLEITOr和HTTPErTOr混合使用注意:由于HTTPError是URLError的子类,所以捕获的时候HTTPError要放在URLError的上面。示例:fromurllibimportrequestfromurllibimporterrorif_name_=_main_,t:# 网站服务器上不存在资源url=h七七p:/www,baiduComnoh七mlreq=request*Request(url)try:response=reque
12、st-urlopen(req)# html=response-read()decode(,utf8,)excepterror-HTTPErrorase:print(ecode)excepterror-URLErrorase:print(ecode)如果不用上面的方法,可以直接用判断的形式。fromurllibimportrequestfromurllibimporterrorif_name_=_main_z,;# 网站服务器上不存在资源url=,httptwAbaiducom/nohtm!nreq=request*Request(url)try:response=requestur!open(req)# html=response-read()decode(tutf8,)excepterror-URLErrorase:ifhasattr(e,code,):Prin七(HTTPError)print(ecode)el