Python 爬虫库 urllib 使用详解.docx
Python爬虫库urllib使用详解一、Pythonurllib库Pythonurllib库用于操作网页URL,并对网页的内容进行抓取处理。Python3的urllibourllib包包含以下几个模块:urllib.request-打开和读取URLo urllib.error-包含UrIlib.request抛出的异常。 urllib.parse-解析URLo urllib.robotparser-解析robots.txt文件。需要用的就是每个模块的内置方法和函数。大概方法如下图:readOdecodeOgeturlQinfoOgetcodeOerror.URLErrorOreasonreasoncodeheaderseror.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,capath=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(ur!read()-decode(lutf-8,)#"»获取所有信息,并decode。命令将网页的信息进行解码运行结果:<!DOCTYPEhtml><!-STATUSOK-XhtmIxheadxmetahttp-Squiv=nContent-Type"content="text/html;charset=utf-8"><metahttp-equiv=X-UA-CompatibIe"content="IE=edgezchrome=1"><metacontent="always"name="htmlcolor:#000;overflow-y:scroll;overtlow:-moz-scrollbarsbody,button,input,select,textareafont-size:12px;font-family:AriaI,sans-serifhl,h2,h3,h4,h5,h6font-size:100%)emfont-style:normalsmallfont-size:12pxolfullist-stylemoneatext-decoration:nonea:hovertext-decoration:underlinelegendcolor:#000fieldsetimgborderObutton,inputzselect,t×tareafont-size:100%response对象是http.client.HTTPResponse类型,主要包含read、readinto>getheadergetheadersfileno等方法,以及msg>versionstatus>reason>debuglevekclosed等属性。常用方法:read():是读取整个网页内容,也可以指定读取的长度,如read(300)o获取到的是二进制的乱码,所以需要用到decode。命令将网页的信息进行解码。 readline()-读取文件的一行内容。 readlines()-读取文件的全部内容,它会把读取的内容赋值给一个列表变量。 info():返回HTTPMeSSage对象,表示远程服务器返回的头信息。 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:发送到服务器的其他数据对象,默认为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/8003987122SaFari53736"# 定义headers,模拟浏览器访问req=urllibrequest-Requesturl=urlfheadersheaders)# 模拟浏览器发送,访问网页response=IArIIib-requestirlopen(req)# 获取页面信息printCresponseread()decode(,utf-8n)三、UrHib.error模块urllib.error模块为urllib.request所引发的异常定义了异常类,基础异常类是URLErrorourllib.error包含了两个方法,URLError和HTTPErroroURLError是OSErrOr的一个子类,用于处理程序在遇到问题时会引发此异常(或其派生的异常),包含的属性reason为引发异常的原因。HTTPError是URLError的一个子类,用于处理特殊HTTP错误例如作为认证请求的时候,包含的属性code为HTTP的状态码,reason为引发异常的原因,headers为导致HTTPError的特定HTTP请求的HTTP响应头。区别:URLError封装的错误信息一般是由网络引起的,包括UH错误。HTTPError封装的错误信息一般是服务器返回了错误状态码。关系:URLErrOr是OSERROR的子类,HTTPElTOr是URLErTOr的子类。1.URLError示例fromurllibimportrequestfromurllibimporterrorif_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.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代码字典中的某个值。reason这通常是一个解释本次错误原因的字符串。headers导致HTTPError的特定HTTP请求的HTTP响应头。3.URLEITOr和HTTPErTOr混合使用注意:由于HTTPError是URLError的子类,所以捕获的时候HTTPError要放在URLError的上面。示例:fromurllibimportrequestfromurllibimporterrorif_name_="_main_,t:# 网站服务器上不存在资源url="h七七p:/www,baiduComnoh七ml"req=request*Request(url)try:response=request-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)elifhasattr(ef,reason1):Prin七("URWror")print(ereason)执行结果:HTTPError404U!urllib.parse 模块模块定义的函数可分为两个主要门类:URL解析和URL转码。4.1URL解析urllib.parse用于解析URL,格式如下:allow_fragments=True)UrIlib.parse.urlparse(uristring,SCheme二urlstring为字符串的Url地址,scheme为协议类型。allow.fragments参数为false,则无法识别片段标识符。相反,它们被解析为路径,参数或查询组件的一部分,并fragment在返回值中设置为空字符串。标准链接格式为:SCheme:netlocPath;Params?quer对象中包含了六个元素,分别为:协议(SCheme)、域名(netloc)、路径(Path)、路径参数(ParamS)、查询参数(query)、片段(fragment)。示例:fromIArIIib-parseimportUrIParSeo=urlparse(uhttps:/docs-python-or/z.h-cn3libraryurllibparse"七ml#module-Urllibparse")print(,schemeotscheme)print(,net!oconet!oc)print(lpatho,ath)print(,paramsoparams)PrintCqUery0.query)Prin七CFragmer)七ofragment)Print(%os七name:',ohostname)执行结果:scheme:httpsnetloc:docs.python.orgpath:zh-cn3libraryurllib.parse.htmlparams:query:fragment:module-urllib.parsehostname:docs.python.org以上还可以通过索引获取,如通过SSlE(o0)rint(o5)4.1.2 urlunparse()UrlUnParSe()可以实现URL的构造。(构造URL)UrIUnParSe()接收一个是一个长度为6的可迭代对象,将URL的多个部分组合为一个URL。若可迭代对象长度不等于6,则抛出异常。示例:fromUrHibparseimportUrlUr)ParSeUrLCOmPoS=,http,f,iLVLvbaiducom,t,indexhtm!,t,user=test,i,a-6,i'comment1print(ur!unparse(UrLComPoS)结果:http:WWW4.1.3 urlsplit()urlsplit()函数也能对URL进行拆分,所不同的是,urlsplit()并不会把路径参数(ParamS)从路径(Path)中分离出来。当URL中路径部分包含多个参数时,使用UrIparseQ解析是有问题的,这时可以使用UrIspIitO来解析.4.1.4 UrIspIitOUrIUnSPlit()与UrIUnParSe()类似,(构造URL),传入对象必须是可迭代对象,且长度必须是5。示例:fromurllibparseimportUrlunsplitUrLComPoS=Ch七七p'wwwbaiducom','indeh七ml','user=test,i,a=2,print(UrIUrJSPIi七(UrLCOmPoS)urlunsplit()结果:http:WWW4.1.5 urljoin()同样可以构造URLo传递一个基础链接,根据基础链接可以将某一个不完整的链接拼接为一个完整链接.注:连接两个参数的url,将第二个参数中缺的部分用第一个参数的补齐,如果第二个有完整的路径,则以第二个为主。4.2URL转码python中提供urllib.parse模块用来编码和解码,分别是urlencode()与unquote()o4.2.1 编码quote(string)URL转码函数的功能是接收程序数据并通过对特殊字符进行转码并正确编码非ASCII文本来将其转为可以安全地用作URL组成部分的形式。它们还支持逆转此操作以便从作为URL组成部分的内容中重建原始数据,如果上述的URL解析函数还未覆盖此功能的话语法:IUrllib.parse.quote(string, Safe= 7'encoding = None, errors = None)使用%xx转义符替换string中的特殊字符。字母、数字和等字符一定不会被转码。在默认情况下,此函数只对URL的路径部分进行转码。可选的safe形参额外指定不应被转码的ASCII字符-其默认值为7,ostring可以是Str或bytes对象。示例:fromUrllibimportparseurl="卜七七p:/WWWbaiducoms?Wd=O"words=爬虫#的。匕只能对字符串进行编码query_strifig=parse-quote(words)url=UrlForma七(query_s七ring)print(url)执行结果:http:WWWs7wd=%E7%88%AC%E8%99%AB4.2.2编码UrlenCode()quote。只能对字符串编码,而UrIenCOde()可以对查询字符串进行编码。#导入ParSe模块fromurllibimportparse#调用parse模块的urecode进行编码query_s七ring=f'wd'飕虫?result=parse-ur!encode(query_strin)#函数格式化字符串,进行Ur/拼接url='h七七p:/7wwwbaiduComs7'FOrma七(result)print(url)结果:IhttP:/WWW4.2.3解码Unquote(String)解码就是对编码后的url进行还原。示例:fromUrllibimportparsestring=,%7%88%C%E8%99%B,result=ParSeunquo七e(s七ring)print(result)执行结果:爬虫五、UrHibrobotparser模块(在网络爬虫中基本不会用到,使用较少,仅作了解)urllib.robotparser用于解析robots.txt文件。robots.txt(统一小写)是一种存放于网站根目录下的robots协议,它通常用于告诉搜索引擎对网站的抓取规则。RobotS协议也称作爬虫协议,机器人协议,网络爬虫排除协议,用来告诉爬虫哪些页面是可以爬取的,哪些页面是不可爬取的。它通常是一个robots.txt的文本文件,一般放在网站的根目录上。当爬虫访问一个站点的时候,会首先检查这个站点目录是否存在robots.txt文件,如果存在,搜索爬虫会根据其中定义的爬取范围进行爬取。如果没有找到这个文件,搜索爬虫会访问所有可直接访问的页面。urllib.robotparser提供了RobotFiIeParser类,语法如下:CIaSSUrIlib.robotparser.RobotFiIeParser(url=这个类提供了一些可以读取、解析robots.txt文件的方法:set_url(url)-设置robots.txt文件的URL0 read()-读取robots.txtURL并将其输入解析器。 parse(lines)-解析行参数。 can_fetch(useragent,url)-如果允许useragent按照被解析robots.txt文件中的规则来获取Url则返回Trueo mtime()-返回最近一次获取robots.txt文件的时间。这适用于需要定期检查robots.txt文件更新情况的长时间运行的网页爬虫。 modified()-将最近一次获取robots.txt文件的时间设置为当前时间。 CraWLdelay(USeragent)-为指定的useragent从robots.txt返回Crawl-delay形参。如果此形参不存在或不适用于指定的useragent或者此形参的robots.txt条目存在语法错误,则返回Noneo request_rate(useragent)-以namedtupleRequestRate(requests,seconds)的形式从robots.txt返回Request-rate形参的内容。如果此形参不存在或不适用于指定的useragent或者此形参的robots.txt条目存在语法错误,则返回None0 site_maps()-以list()的形式从robots.txt返回Sitemap形参的内容。如果此形参不存在或者此形参的robots.txt条目存在语法错误,则返回Noneo