当前位置: 首页 > 科技观察

Python学习:urllib介绍

时间:2023-03-14 09:47:21 科技观察

Python3的urllib模块是一组可以处理URL的组件。如果您了解Python2,那么您会注意到Python2中有两个版本的模块urllib和urllib2。它们现在是Python3的urllib包的一部分。当前版本的urllib包括以下部分:urllib.requesturllib.errorurllib.parseurllib.rebotparser接下来我们将单独讨论urllib.error以外的部分。官方文档其实是推荐你试试第三方库requests,一个高级的HTTP客户端接口。但是,我仍然认为了解如何在不依赖第三方库的情况下打开URL并与之交互是很有用的,它还可以帮助您理解为什么requests包如此受欢迎。urllib.requesturllib.request模块最初用于打开和获取URL。让我们看看您可以使用函数urlopen做什么:>>>importurllib.request>>>url=urllib.request.urlopen('https://www.google.com/')>>>url.geturl()'https://www.google.com/'>>>url.info()>>>header=url.info()>>>header.as_string()('日期:周五,24Jun201618:21:19GMT\n''过期:-1\n''缓存控制:私有,最大年龄=0\n''内容类型:文本/html;字符集=ISO-8859-1\n''P3P:CP="ThisisnotaP3Ppolicy!See''https://www.google.com/support/accounts/answer/151657?hl=enformoreinfo."\n''Server:gws\n''X-XSS-Protection:1;mode=block\n''X-Frame-Options:SAMEORIGIN\n''Set-Cookie:''NID=80=tYjmy0JY6flsSVj7DPSSZNOuqdvqKfKHDcHsPIGu3xFv41LvH_Jg6LrUsDgkPrtM2hmZ3j9V76pS4K_cBg7pdwueMQfr0DFzw33SwpGex5qzLkXUvUVPfe9g699Qz4cx9ipcbU3HKwrRYA;''expires=Sat,24-Dec-201618:21:19GMT;path=/;domain=.google.com;HttpOnly\n''Alternate-Protocol:443:quic\n''Alt-Svc:quic=":443";ma=2592000;v="34,33,32,31,30,29,28,27,26,25"\n''Accept-Ranges:none\n''Vary:Accept-Encoding\n''Connection:close\n''\n')>>>url.getcode()200这里我们包含了所需的模块并告诉它打开Goog??le的URL现在我们有了一个交互式的HTTPResponse对象。我们需要做的第一件事就是调用geturl方法,它会返回根据URL获取的资源。这个可以让我们判断URL是否被重定向,接下来调用info,它会返回网页的元数据,比如请求头信息,因此我们可以将结果赋值给我们的headers变量,然后调用它的方法as_string,可以打印出我们从Google接收到的header信息,也可以通过getcode获取网页的HTTP响应码,目前的例子是200,代表正常工作,如果想看html的网页代码,可以调用变量url的read方法,这个过程我不复现,因为输出太长,请注意请求对象默认发起GET请求,除非您指定其数据参数。如果你给它传递数据参数,那么请求对象就会变成一个POST请求。下载文件urllib一个典型的应用场景就是下载文件。让我们看看完成这个任务的几种方法:>>>importurllib.request>>>url='http://www.blog.pythonlibrary.org/wp-content/uploads/2012/06/wxDbViewer.zip'>>>response=urllib.request.urlopen(url)>>>data=response.read()>>>withopen('/home/mike/Desktop/test.zip','wb')asfobj:...fobj。write(data)...在这个例子中,我们打开一个保存在我的博客URL上的zip文件。然后我们读取数据并将数据写入磁盘。另一种方法是使用urlretrieve:>>>importurllib.request>>>url='http://www.blog.pythonlibrary.org/wp-content/uploads/2012/06/wxDbViewer.zip'>>>tmp_file,header=urllib.request.urlretrieve(url)>>>withopen('/home/mike/Desktop/test.zip','wb')asfobj:...withopen(tmp_file,'rb')astmp:。..fobj.write(tmp.read())方法urlretrieve将网络对象复制到本地文件。除非你使用urlretrieve的第二个参数来指定你想要保存文件的路径,否则文件将被复制到临时文件夹中一个随机命名的文件中。这为您节省了一步并使代码看起来更简单:>>>importurllib.request>>>url='http://www.blog.pythonlibrary.org/wp-content/uploads/2012/06/wxDbViewer.zip'>>>urllib.request.urlretrieve(url,'/home/mike/Desktop/blog.zip')('/home/mike/Desktop/blog.zip',)如你所见,它返回保存文件的路径,以及来自请求的标头。设置您的用户代理当您使用浏览器访问网页时,浏览器会告诉网站它是谁。这就是所谓的用户代理(UserAgent)字段。Python的urllib将自己引用为Python-urllib/x.y,其中x和y是您正在使用的Python的主要和次要版本号。有些网站不识别此用户代理字段,然后该网站可能会出现异常或根本无法运行。幸运的是,您可以轻松设置自己的用户代理字段。>>>importurllib.request>>>user_agent='Mozilla/5.0(X11;Ubuntu;Linuxx86_64;rv:47.0)Gecko/20100101Firefox/47.0'>>>url='http://www.whatsmyua.com/'>>>headers={'User-Agent':user_agent}>>>request=urllib.request.Request(url,headers=headers)>>>withurllib.request.urlopen(request)asresponse:...withopen('/home/mdriscoll/Desktop/user_agent.html','wb')asout:...out.write(response.read())这里我们将用户代理设置为MozillaFireFox,然后访问http://www.whatsmyua.com/,它将告诉我们它识别为我们的用户代理字段的内容。然后我们将url和我们的标头传递给urlopen以创建一个Request实例。***我们保存这个结果。如果你打开结果,你会看到我们已经成功修改了我们的用户代理字段。用这段代码尝试不同的值,看看它是如何变化的。urllib.parseurllib.parse库是用于拆分和组合URL字符串的标准接口。例如,您可以使用它将相对URL转换为绝对URL。让我们尝试使用它来转换包含查询的URL:>>>fromurllib.parseimporturlparse>>>result=urlparse('https://duckduckgo.com/?q=python+stubbing&t=canonical&ia=qa')>>>resultParseResult(scheme='https',netloc='duckduckgo.com',path='/',params='',query='q=python+stubbing&t=canonical&ia=qa',fragment='')>>>结果。netloc'duckduckgo.com'>>>result.geturl()'https://duckduckgo.com/?q=python+stubbing&t=canonical&ia=qa'>>>result.portNone这里我们导入了函数urlparse,并把一个URL包含搜索查询字符串的duckduckgo作为参数传递给它。我的查询字符串是搜索关于“pythonstubbing”的文章。如您所见,它返回一个ParseResult对象,您可以使用它来了解有关URL的更多信息。例如,您可以获得端口信息(在本例中没有端口信息)、网络位置、路径和许多其他信息。提交Web表单该模块还有一个方法urlencode,可以将数据传输到URL。urllib.parse的一个典型用例是提交Web表单。我们通过搜索引擎duckduckgo搜索Python,看看这个特性是如何工作的。>>>importurllib.request>>>importurllib.parse>>>data=urllib.parse.urlencode({'q':'Python'})>>>data'q=Python'>>>url='http://duckduckgo.com/html/'>>>full_url=url+'?'+data>>>response=urllib.request.urlopen(full_url)>>>withopen('/home/mike/Desktop/results.html','wb')asf:...f.write(response.read())这个例子很简单。基本上我们使用Python而不是浏览器向duckduckgo提交查询。为此,我们需要使用urlencode来构建我们的查询字符串。然后我们将这个字符串和URL拼接成一个完整正确的URL,然后使用urllib.request提交表单。***我们得到结果并将其保存到磁盘。urllib.robotparserrobotparser模块由一个类RobotFileParser组成。此类回答诸如特定用户代理是否为设置了robot.txt的站点获取URL等问题。robot.txt文件告诉爬虫或机器人当前网站的哪些部分是不允许访问的。让我们看一个简单的例子:>>>importurllib.robotparser>>>robot=urllib.robotparser.RobotFileParser()>>>robot.set_url('http://arstechnica.com/robots.txt')None>>>robot.read()无>>>robot.can_fetch('*','http://arstechnica.com/')True>>>robot.can_fetch('*','http://arstechnica.com/cgi-bin/')False这里我们导入机器人分析器类并创建一个实例。然后我们将一个URL传递给它,指示该站点的robots.txt的位置。接下来我们告诉分析器读取这个文件。完成后,我们给了它一组不同的URL来确定我们可以抓取哪些,哪些不能抓取。我们很快发现我们可以访问主站点但不能访问cgi-bin路径。所以总而言之,您现在可以使用Python的urllib包了。在本节中,我们学习了如何下载文件、提交Web表单、修改我们自己的用户代理以及访问robots.txt。urllib有一大堆这里没有提到的附加功能,例如网站身份验证。您可能会考虑在使用urllib进行身份验证之前切换到requests库,因为requests已经以一种更可用和更可调试的方式实现了这些功能。我还想提醒您,Python已经通过http.cookies模块支持cookie,尽管这个功能很好地封装在request包中。您可能应该考虑尝试两者来决定哪种最适合您。