精华内容
下载资源
问答
  • Python urllib urllib2 urllib模块安装说明
  • python urllib3 requests

    2017-10-03 17:32:07
    python urllib3 requests
  • python urllib3

    2014-04-19 14:56:46
    python urllib3 安装文件包
  • urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]]) 注: url表示目标网页地址,可以是字符串,也可以是请求对象Request req= urllib2.Request(url, data,headers) response =...
  • urllib 库 是 Python 内置的 HTTP 请求库。urllib 模块提供的上层接口,使访问 www 和 ftp 上的数据就像访问本地文件一样。 有以下几种模块: 1.urllib.request 请求模块 2. urllib.error 异常处理模块 3. urllib....
  • 使用Python URLLIB3下载文件

    千次阅读 2020-11-30 11:02:11
    urllib3是一个轻量级的python库,提供了线程安全,HTTP连接池和重用,文件发送等。为了演示urllib3的使用,我们这里将会从一个网站下载两个文件。首先,需要导入urllib3库:import urllib3这两个文件的源url为:url1...

    urllib3是一个轻量级的python库,提供了线程安全,HTTP连接池和重用,文件发送等。

    python-logo-master-v3-TM-300x101.png

    为了演示urllib3的使用,我们这里将会从一个网站下载两个文件。

    首先,需要导入urllib3库:

    import urllib3

    这两个文件的源url为:

    url1 = 'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_week.csv' url2 = 'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_month.csv'

    现在开始创建一个HTTP连接池:

    http = urllib3.PoolManager()

    然后请求第一个文件并写入到文件:

    response = http.request('GET', url1) with open('all_week.csv', 'wb') as f: f.write(response.data)

    然后是第二个文件:

    response = http.request('GET', url2) with open('all_month.csv', 'wb') as f: f.write(response.data)

    最后释放这个HTTP连接:

    response.release_conn()

    原文出处:tealscientific -> http://tealscientific.com/blog/?p=2373

    展开全文
  • python urllib2篇

    千次阅读 2020-11-30 08:10:36
    一、概述urllib2是Python的一个针对URLs的库。他以urlopen函数的形式提供了一个非常简单的接口,这是具有利用不同协议获取URLs的能力,他同样提供了一个比较复杂的接口来处理一般情况,例如:基础验证,cookies,代理...

    一、概述

    urllib2是Python的一个针对URLs的库。他以urlopen函数的形式提供了一个非常简单的接口,这是具有利用不同协议获取URLs的能力,他同样提供了一个比较复杂的接口来处理一般情况,例如:基础验证,cookies,代理和其他。它们通过handlers和openers的对象提供。

    urllib2支持获取不同格式的URLs(在URL的":"前定义的字串,例如:"ftp"是"ftp:python.ort/"的前缀),它们利用它们相关网络协议(例如FTP,HTTP)进行获取。这篇教程关注最广泛的应用--HTTP。

    对于简单的应用,urlopen是非常容易使用的。但当你在打开HTTP的URLs时遇到错误或异常,你将需要一些超文本传输协议(HTTP)的理解。

    二、快速上手

    最简单的使用urllib2

    代码实例:import urllib2

    response=urllib2.urlopen('http://python.org/')

    html=response.read()

    urllib2的很多应用就是那么简单(记住,除了"http:",URL同样可以使用"ftp:","file:"等等来替代)。但这篇文章是教授HTTP的更复杂的应用。

    HTTP是基于请求和应答机制的--客户端提出请求,服务端提供应答。urllib2用一个Request对象来映射你提出的HTTP请求,在它最简单的使用形式中你将用你要请求的地址创建一个Request对象,通过调用urlopen并传入Request对象,将返回一个相关请求response对象,这个应答对象如同一个文件对象,所以你可以在Response中调用.read()。import urllib2

    req=urllib2.Request('http://www.pythontab.com')

    response=urllib2.urlopen(req)

    the_page=response.read()

    记得urllib2使用相同的接口处理所有的URL头。例如你可以像下面那样创建一个ftp请求。req = urllib2.Request('ftp://example.com/')

    在HTTP请求时,允许你做额外的两件事。首先是你能够发送data表单数据,其次你能够传送额外的关于数据或发送本身的信息("metadata")到服务器,此数据作为HTTP的"headers"来发送。

    接下来让我们看看这些如何发送的吧。

    三、Data数据

    有时候你希望发送一些数据到URL(通常URL与CGI[通用网关接口]脚本,或其他WEB应用程序挂接)。在HTTP中,这个经常使用熟知的POST请求发送。这个通常在你提交一个HTML表单时由你的浏览器来做。

    并不是所有的POSTs都来源于表单,你能够使用POST提交任意的数据到你自己的程序。一般的HTML表单,data需要编码成标准形式。然后做为data参数传到Request对象。编码工作使用urllib的函数而非urllib2。

    代码实例:import urllib

    import urllib2

    url='http://www.pythontab.com'

    values={

    'name':'Michael Foord',

    'location':'pythontab',

    'language':'Python'

    }

    data=urllib.urlencode(values)

    req=urllib2.Request(url, data)

    response=urllib2.urlopen(req)

    the_page=response.read()

    记住有时需要别的编码(例如从HTML上传文件--看http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13 HTML Specification, Form Submission的详细说明)。

    如ugoni没有传送data参数,urllib2使用GET方式的请求。GET和POST请求的不同之处是POST请求通常有"副作用",它们会由于某种途径改变系统状态(例如提交成堆垃圾到你的门口)。

    尽管HTTP标准说的很清楚POSTs通常会产生副作用,GET请求不会产生副作用,但没有什么可以阻止GET请求产生副作用,同样POST请求也可能不产生副作用。Data同样可以通过在Get请求的URL本身上面编码来传送。

    代码实例:>>>import urllib2

    >>>import urllib

    >>> data={}

    >>> data['name']='Somebody Here'

    >>> data['location']='pythontab'

    >>> data['language']='Python'

    >>> url_values=urllib.urlencode(data)

    >>>printurl_values

    name=blueelwang+Here&language=Python&location=pythontab

    >>> url='http://www.pythontab.com'

    >>> full_url=url+'?'+url_values

    >>> data=urllib2.open(full_url)

    四、Headers

    我们将在这里讨论特定的HTTP头,来说明怎样添加headers到你的HTTP请求。

    有一些站点不喜欢被程序(非人为访问)访问,或者发送不同版本的内容到不同的浏览器。默认的urllib2把自己作为“Python-urllib/x.y”(x和y是Python主版本和次版本号,例如Python-urllib/2.5),这个身份可能会让站点迷惑,或者干脆不工作。浏览器确认自己身份是通过User-Agent头,当你创建了一个请求对象,你可以给他一个包含头数据的字典。下面的例子发送跟上面一样的内容,但把自身模拟成Internet Explorer。import  urllib

    import  urllib2

    url='http://www.pythontab.com'

    user_agent='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'

    values={'name':'Michael Foord',

    'location':'pythontab',

    'language':'Python'}

    headers={'User-Agent': user_agent }

    data=urllib.urlencode(values)

    req=urllib2.Request(url, data, headers)

    response=urllib2.urlopen(req)

    the_page=response.read()

    response应答对象同样有两个很有用的方法。看下面的节info and geturl,我们将看到当发生错误时会发生什么。

    五、Handle Exceptions处理异常

    当urlopen不能够处理一个response时,产生urlError(不过通常的Python APIs异常如ValueError,TypeError等也会同时产生)。

    HTTPError是urlError的子类,通常在特定HTTP URLs中产生。

    六、URLError

    通常,URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生。这种情况下,异常同样会带有"reason"属性,它是一个tuple,包含了一个错误号和一个错误信息。

    例如>>> req=urllib2.Request('http://www.pythontab.com')

    >>>try: urllib2.urlopen(req)

    >>>exceptURLError, e:

    >>>printe.reason

    >>>

    (4, 'getaddrinfo failed')

    七、HTTPError

    服务器上每一个HTTP 应答对象response包含一个数字"状态码"。有时状态码指出服务器无法完成请求。默认的处理器会为你处理一部分这种应答(例如:假如response是一个"重定向",需要客户端从别的地址获取文档,urllib2将为你处理)。其他不能处理的,urlopen会产生一个HTTPError。典型的错误包含"404"(页面无法找到),"403"(请求禁止),和"401"(带验证请求)。

    请看RFC 2616 第十节有所有的HTTP错误码

    HTTPError实例产生后会有一个整型'code'属性,是服务器发送的相关错误号。

    Error Codes错误码

    因为默认的处理器处理了重定向(300以外号码),并且100-299范围的号码指示成功,所以你只能看到400-599的错误号码。

    BaseHTTPServer.BaseHTTPRequestHandler.response是一个很有用的应答号码字典,显示了RFC 2616使用的所有的应答号。这里为了方便重新展示该字典。

    当一个错误号产生后,服务器返回一个HTTP错误号,和一个错误页面。你可以使用HTTPError实例作为页面返回的应答对象response。这表示和错误属性一样,它同样包含了read,geturl,和info方法。>>> req=urllib2.Request('http://www.python.org/fish.html')

    >>>try:

    >>>     urllib2.urlopen(req)

    >>>exceptURLError, e:

    >>>printe.code

    >>>printe.read()

    >>>

    4404

    Error 404: File Not Found

    ...... etc...

    八、Wrapping it Up包装

    所以如果你想为HTTPError或URLError做准备,将有两个基本的办法。我则比较喜欢第二种。

    第一个:from urllib2 import Request, urlopen, URLError, HTTPError

    req=Request(someurl)

    try:

    response=urlopen(req)

    except HTTPError, e:

    print'The server couldn/'t fulfill the request.'

    print'Error code: ', e.code

    exceptURLError, e:

    print'We failed to reach a server.'

    print'Reason: ', e.reason

    else:

    # everything is fine

    注意:except HTTPError 必须在第一个,否则except URLError将同样接受到HTTPError。

    第二个:from urllib2 import Request, urlopen, URLError

    req=Request(someurl)

    try:

    response=urlopen(req)

    exceptURLError, e:

    if hasattr(e,'reason'):

    print'We failed to reach a server.'

    print'Reason: ', e.reason

    elif hasattr(e,'code'):

    print'The server couldn/'t fulfill the request.'

    print'Error code: ', e.code

    else:

    # everything is fine

    九、info and geturl

    urlopen返回的应答对象response(或者HTTPError实例)有两个很有用的方法info()和geturl()

    geturl -- 这个返回获取的真实的URL,这个很有用,因为urlopen(或者opener对象使用的)或许会有重定向。获取的URL或许跟请求URL不同。

    info -- 这个返回对象的字典对象,该字典描述了获取的页面情况。通常是服务器发送的特定头headers。目前是httplib.HTTPMessage 实例。

    经典的headers包含"Content-length","Content-type",和其他。查看Quick Reference to HTTP Headers(http://www.cs.tut.fi/~jkorpela/http.html)获取有用的HTTP头列表,以及它们的解释意义。

    十、Openers和Handlers

    当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例,urllib2.OpenerDirector可能名字可能有点让人混淆。)正常情况下,我们使用默认opener -- 通过urlopen,但你能够创建个性的openers,Openers使用处理器handlers,所有的“繁重”工作由handlers处理。每个handlers知道如何通过特定协议打开URLs,或者如何处理URL打开时的各个方面,例如HTTP重定向或者HTTP cookies。

    如果你希望用特定处理器获取URLs你会想创建一个openers,例如获取一个能处理cookie的opener,或者获取一个不重定向的opener。

    要创建一个 opener,实例化一个OpenerDirector,然后调用不断调用.add_handler(some_handler_instance).

    同样,可以使用build_opener,这是一个更加方便的函数,用来创建opener对象,他只需要一次函数调用。

    build_opener默认添加几个处理器,但提供快捷的方法来添加或更新默认处理器。

    其他的处理器handlers你或许会希望处理代理,验证,和其他常用但有点特殊的情况。

    install_opener 用来创建(全局)默认opener。这个表示调用urlopen将使用你安装的opener。

    Opener对象有一个open方法,该方法可以像urlopen函数那样直接用来获取urls:通常不必调用install_opener,除了为了方便。

    十一、Basic Authentication 基本验证

    为了展示创建和安装一个handler,我们将使用HTTPBasicAuthHandler,为了更加细节的描述本主题--包含一个基础验证的工作原理。

    请看Basic Authentication Tutorial(http://www.voidspace.org.uk/python/articles/authentication.shtml)

    当需要基础验证时,服务器发送一个header(401错误码) 请求验证。这个指定了scheme 和一个‘realm’,看起来像这样:Www-authenticate: SCHEME realm="REALM".

    例如

    Www-authenticate: Basic realm="cPanel Users"

    客户端必须使用新的请求,并在请求头里包含正确的姓名和密码。这是“基础验证”,为了简化这个过程,我们可以创建一个HTTPBasicAuthHandler的实例,并让opener使用这个handler。

    HTTPBasicAuthHandler使用一个密码管理的对象来处理URLs和realms来映射用户名和密码。如果你知道realm(从服务器发送来的头里)是什么,你就能使用HTTPPasswordMgr。

    通常人们不关心realm是什么。那样的话,就能用方便的HTTPPasswordMgrWithDefaultRealm。这个将在你为URL指定一个默认的用户名和密码。这将在你为特定realm提供一个其他组合时得到提供。我们通过给realm参数指定None提供给add_password来指示这种情况。

    最高层次的URL是第一个要求验证的URL。你传给.add_password()更深层次的URLs将同样合适。

    # 创建一个密码管理者

    password_mgr=urllib2.HTTPPasswordMgrWithDefaultRealm()

    # 添加用户名和密码

    # 如果知道 realm, 我们可以使用他代替 ``None``.

    top_level_url="http://example.com/foo/"

    password_mgr.add_password(None, top_level_url, username, password)

    handler=urllib2.HTTPBasicAuthHandler(password_mgr)

    # 创建 "opener" (OpenerDirector 实例)

    opener=urllib2.build_opener(handler)

    # 使用 opener 获取一个URL

    opener.open(a_url)

    # 安装 opener.

    # 现在所有调用 urllib2.urlopen 将用我们的 opener.

    urllib2.install_opener(opener)

    注意:以上的例子我们仅仅提供我们的HHTPBasicAuthHandler给build_opener。默认的openers有正常状况的handlers--ProxyHandler,UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler, FileHandler, HTTPErrorProcessor。

    top_level_url 实际上可以是完整URL(包含"http:",以及主机名及可选的端口号)例如:http://example.com/,也可以是一个“authority”(即主机名和可选的包含端口号)例如:“example.com” or “example.com:8080”(后者包含了端口号)。权限验证,如果递交的话不能包含"用户信息"部分,例如:“joe@password:example.com”是错误的。

    Proxies代理urllib 将自动监测你的代理设置并使用他们。这个通过ProxyHandler这个在正常处理器链中的对象来处理。通常,那工作的很好。但有时不起作用。其中一个方法便是安装我们自己的代理处理器ProxyHandler,并不定义代理。这个跟使用Basic Authentication 处理器很相似。>>> proxy_support=urllib.request.ProxyHandler({})

    >>> opener=urllib.request.build_opener(proxy_support)

    >>> urllib.request.install_opener(opener)

    注意:

    此时urllib.request不支持通过代理获取https地址。但,这个可以通过扩展urllib.request达到目的。

    Sockets and Layers

    Python支持获取网络资源是分层结构。urllib 使用http.client库,再调用socket库实现。

    在Python2.3你可以指定socket的等待回应超时时间。这个在需要获取网页的应用程序里很有用。默认的socket模型没有超时和挂起。现在,socket超时没有暴露给http.client或者urllib.request层。但你可以给所有的sockets设置全局的超时。

    补充一句:python3中将urllib2改成了urllib,大部分功能在rullib.request下

    展开全文
  • Python urlliburllib2、urllib3用法及区别

    万次阅读 多人点赞 2019-02-18 01:06:08
    `urllib`、`urllib2`、`urllib3`介绍

    简介1

    在可供使用的网络库中,urlliburllib2可能是投入产出比最高的两个,是Python中操作url的官方标准库。它们让你能够通过网络访问文件,就像这些文件位于你的计算机中一样。只需一个简单的函数调用,就几乎可将统一资源定位符(URL)可指向的任何动作作为程序的输入。结合re模块使用将发挥强大威力!

    一个简单的例子:

    req = urllib2.Request(
    	url=url,
    	data=postdata,
    	headers=headers
    )
    result = urllib2.urlopen(req)
    

    模块urlliburllib2的功能差不多,简单来说urllib2urllib的增强——urllib2更好一些,但是urllib中有urllib2中所没有的函数。对于简单的下载, urllib绰绰有余。 如果需要实现HTTP身份验证Cookie亦或编写扩展来处理自己的协议,urllib2可能是更好的选择。在Python2.x中主要为urlliburllib2,这两个标准库是不可相互替代的。但是在Python3.x中将urllib2合并到了urllib,这一点值得注意。

    • urllib支持设置编码的函数urllib.urlencode,在模拟登陆的时候经常需要传递经过post编码之后的参数,如果不想使用第三方库完成模拟登录,就必须使用到标准库中的urlliburllib提供一些比较原始基础的方法而urllib2并没有,比如urllib中的urlencode方法用来GET查询字符串的产生。

    • urllib2比较有优势的地方在于urllib2.openurl中可以接受一个Request类的实例来设置Request参数,来修改/设置Header头从而达到控制HTTP Request的header部分的目的,也可以修改用户代理,设置cookie等,但urllib仅可以接受URL。这就意味着,如果你访问一个网站想更改User Agent(可以伪装你的浏览器),你就需要使用urllib2urllib2模块没有加入urllib.urlretrieve函数以及urllib.quote等一系列quote和unquote功能,这个时候就需要urllib的辅助。

    因此Python2.x中,urlliburllib2两者搭配使用。

    1、打开远程文件

    几乎可以像打开本地文件一样打开远程文件,差别是只能使用读取模式,以及使用模块urllib.request中的函数urlopen,而不是open(或file)。

    from urllib.request import urlopen
    webpage = urlopen('http://www.python.org')
    

    如果连接到了网络,变量webpage将包含一个类似于文件的对象,这个对象与网页http://www.python.org相关联。

    注意:要在没有联网的情况下尝试使用模块urllib,可使用以file:打头的URL访问本地文件,如file:c:\text\somefile.txt(别忘了对反斜杠进行转义)。

    urlopen返回的类似于文件的对象支持方法:close、 read、readline和readlines,还支持迭代等。

    假设要提取刚才所打开网页中链接About的相对URL, 可使用正则表达式 。

    >>> import re
    >>> text = webpage.read()
    # 注意:如果这个网页发生了变化,你可能需要修改使用的正则表达式。
    >>> m = re.search(b'<a href="([^"]+)" .*?>about</a>', text, re.IGNORECASE)
    >>> m.group(1)
    'about'
    
    02、获取远程文件

    函数urlopen返回一个类似于文件的对象,可从中读取数据。如果要让urllib替你下载文件并将其副本存储在一个本地文件中,可使用urlretrieve。这个函数不返回一个类似于文件的对象,而返回一个格式为(filename, headers)的元组,其中filename是本地文件的名称(由urllib自动创建),而headers包含一些有关远程文件的信息(这里不会介绍headers, 如果你想更深入地了解它,请在有关urllib的标准库文档中查找urlretrieve)。如果要给下载的副本指定文件名,可通过第二个参数来提供。

    urlretrieve('http://www.python.org', 'C:\\python_webpage.html')
    

    这将获取Python官网的主页,并将其存储到文件C:\python_webpage.html中。如果你没有指定文件名,下载的副本将放在某个临时位置,可使用函数open来打开。但使用完毕后,你可能想将其删除以免占用磁盘空间。要清空这样的临时文件,可调用函数urlcleanup且不提供任何参数,它将负责替你完成清空工作。

    一些实用的函数

    除了通过URL读取和下载文件外,urllib还提供了一些用于操作URL的函数,如下所示(这里假设你对URL和CGI略知一二)。

    • quote(string[, safe]) 返回一个字符串,其中所有的特殊字符(在URL中有特殊意义的字符)都已替换为对URL友好的版本(如将~替换为%7E),如果要将包含特殊字符的字符串用作URL很有用。参数safe是一个字符串(默认为'/'),包含不应像这样对其进行编码的字符

    • quote_plus(string[, safe]) 类似于quote,但也将空格替换为加号。

    • unquote(string):与quote相反。

    • unquote_plus(string):与quote_plus相反。

    • urlencode(query[, doseq]) 将映射(如字典)或由包含两个元素的元组(形如(key, value))组成的序列转换为“使用URL编码的”字符串。这样的字符串可用于CGI查询中(详细信息请参阅Python文档)。


    一、urllib

    urllib作为Python的标准库,基本上涵盖了基础的网络请求功能。

    1。 urllib.request

    urllib中,request这个模块主要负责构造和发起网络请求,并在其中加入Headers、Proxy等。

    1. 发起GET请求

    主要使用urlopen()方法来发起请求:

    from urllib import request
    
    resp = request.urlopen('http://www.baidu.com')
    print(resp.read().decode())
    

    urlopen()方法中传入字符串格式的url地址,则此方法会访问目标网址,然后返回访问的结果。

    返回的结果会是一个http.client.HTTPResponse对象,使用此对象的read()方法可以获取访问网页获得的数据。但是要注意的是,获得的数据会是bytes的二进制格式,所以需要decode()一下,转换成字符串格式。

    使用带参数的GET方法取回URL:

    >>> import urllib
    >>> params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
    >>> f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query?%s" % params)
    >>> print f.read()
    
    2. 发起POST请求

    urlopen()默认的访问方式是GET,当在urlopen()方法中传入data参数时,则会发起POST请求。注意:传递的data数据需要为bytes格式。timeout参数还可以设置超时时间如果请求时间超出,那么就会抛出异常。

    from urllib import request
    
    resp = request.urlopen('http://httpbin.org/post', data=b'word=hello', timeout=10)
    print(resp.read().decode())
    

    使用带参数的POST方法:

    >>> import urllib
    >>> params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
    >>> f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query", params)
    >>> print f.read()
    
    3. 添加Headers

    通过urllib发起的请求会有默认的一个Headers:"User-Agent":"Python-urllib/3.6",指明请求是由urllib发送的。
    所以遇到一些验证User-Agent的网站时,我们需要自定义Headers,而这需要借助于urllib.request中的Request对象。

    from urllib import request
    
    url = 'http://httpbin.org/get'
    headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'}
    
    # 需要使用url和headers生成一个Request对象,然后将其传入urlopen方法中
    req = request.Request(url, headers=headers)
    resp = request.urlopen(req)
    print(resp.read().decode())
    
    4. Request对象

    如上所示,urlopen()方法中不止可以传入字符串格式的url,也可以传入一个Request对象来扩展功能,Request对象如下所示。

    class urllib.request.Request(url, data=None, headers={},
                                 origin_req_host=None,
                                 unverifiable=False, method=None)
    

    构造Request对象必须传入url参数,data数据和headers都是可选的。
    最后,Request方法可以使用method参数来自由选择请求的方法,如PUT,DELETE等等,默认为GET。

    5. 添加Cookie

    为了在请求时能带上Cookie信息,我们需要重新构造一个opener。
    使用request.build_opener方法来进行构造opener,将我们想要传递的cookie配置到opener中,然后使用这个opener的open方法来发起请求。

    from http import cookiejar
    from urllib import request
    
    url = 'https://www.baidu.com'
    
    # 创建一个cookiejar对象
    cookie = cookiejar.CookieJar()
    
    # 使用HTTPCookieProcessor创建cookie处理器
    cookies = request.HTTPCookieProcessor(cookie)
    
    # 并以它为参数创建Opener对象
    opener = request.build_opener(cookies)
    
    # 使用这个opener来发起请求
    resp = opener.open(url)
    
    # 查看之前的cookie对象,则可以看到访问百度获得的cookie
    for i in cookie:
        print(i)
    

    或者也可以把这个生成的opener使用install_opener方法来设置为全局的,之后使用urlopen方法发起请求时,都会带上这个cookie

    # 将这个opener设置为全局的opener
    request.install_opener(opener)
    resp = request.urlopen(url)
    
    6. 设置Proxy代理

    使用爬虫来爬取数据的时候,常常需要使用代理来隐藏我们的真实IP。

    from urllib import request
    
    url = 'http://httpbin.org/ip'
    proxy = {'http':'218.18.232.26:80','https':'218.18.232.26:80'}
    
    # 创建代理处理器
    proxies = request.ProxyHandler(proxy)
    # 创建opener对象
    opener = request.build_opener(proxies)
    
    resp = opener.open(url)
    print(resp.read().decode())
    

    urllib官方文档的例子:

    # 使用HTTP代理,自动跟踪重定向
    >>> import urllib
    >>> proxies = {'http': 'http://proxy.example.com:8080/'}
    >>> opener = urllib.FancyURLopener(proxies)
    >>> f = opener.open("http://www.python.org")
    >>> f.read()
    
    # 不使用代理
    >>> import urllib
    >>> opener = urllib.FancyURLopener({})
    >>> f = opener.open("http://www.python.org/")
    >>> f.read()
    
    7. 下载数据到本地

    在我们进行网络请求时常常需要保存图片或音频等数据到本地,一种方法是使用python的文件操作,将read()获取的数据保存到文件中。
    而urllib提供了一个urlretrieve()方法,可以简单的直接将请求获取的数据保存成文件。

    from urllib import request
    
    url = 'http://python.org/'
    # urlretrieve()方法传入的第二个参数为文件保存的位置,以及文件名。
    request.urlretrieve(url, 'python.html')
    

    urlretrieve()方法是Python2.x直接移植过来的方法,以后有可能在某个版本中弃用。

    2。urllib.response

    在使用urlopen()方法或者opener的open()方法发起请求后,获得的结果是一个response对象。这个对象有一些方法和属性,可以让我们对请求返回的结果进行一些处理。

    read():获取响应返回的数据,只能使用一次。

    getcode():获取服务器返回的状态码。

    getheaders():获取返回响应的响应报头。

    geturl():获取访问的url。

    3。urllib.parse

    urllib.parseurllib中用来解析各种数据格式的模块。

    1. urllib.parse.quote

    在url中,是只能使用ASCII中包含的字符的,也就是说,ASCII不包含的特殊字符,以及中文等字符都是不可以在url中使用的。而我们有时候又有将中文字符加入到url中的需求,例如百度的搜索地址:https://www.baidu.com/s?wd=南北?之后的wd参数,则是我们搜索的关键词。那么我们实现的方法就是将特殊字符进行url编码,转换成可以url可以传输的格式,urllib中可以使用quote()方法来实现这个功能。

    >>> from urllib import parse
    >>> keyword = '南北'
    >>> parse.quote(keyword)
    '%E5%8D%97%E5%8C%97'
    

    如果需要将编码后的数据转换回来,可以使用unquote()方法。

    >>> parse.unquote('%E5%8D%97%E5%8C%97')
    '南北'
    
    2. urllib.parse.urlencode

    在访问url时,我们常常需要传递很多的url参数,而如果用字符串的方法去拼接url的话,会比较麻烦,所以urllib中提供了urlencode这个方法来拼接url参数。

    >>> from urllib import parse
    >>> params = {'wd': '南北', 'code': '1', 'height': '188'}
    >>> parse.urlencode(params)
    'wd=%E5%8D%97%E5%8C%97&code=1&height=188'
    

    4。urllib.error

    在urllib中主要设置了两个异常,一个是URLError,一个是HTTPErrorHTTPErrorURLError的子类。

    HTTPError还包含了三个属性:

    • code:请求的状态码
    • reason:错误的原因
    • headers:响应的报头

    例子:

    In [1]: from urllib.error import HTTPError
    
    In [2]: try:
       ...:     request.urlopen('https://www.jianshu.com')
       ...: except HTTPError as e:
       ...:     print(e.code)
    
    403
    

    二、urllib2

    Python2.x的一个例子:

    import urllib2
     
    # 设置浏览器请求头
    ua_headers={
        "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0"
    }
    
    #建立请求内容
    request=urllib2.Request("http://baidu.com/",headers=ua_headers)
    
    #获取响应
    response=urllib2.urlopen(request)
    
    #页面内容
    html=response.read()
    
    print html
    print response.getcode()	#返回响应码
    print response.geturl()		#返回实际url
    print response.info() 		#返回服务器响应的报头
    

    Python3.x(整合之后的urllib)的一个例子:

    from urllib import request
    
    url = r'https://www.baidu.com/'
    headers = {
        'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
        'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
        'Connection': 'keep-alive'
    }
    req = request.Request(url, headers=headers)
    html = request.urlopen(req).read()
    
    # 处理编码
    html = html.decode('utf-8')
    print(html)
    

    来自urllib2官方文档的几个例子:

    GET一个URL:
    >>> import urllib2
    >>> f = urllib2.urlopen('http://www.python.org/')
    >>> print f.read()
    
    使用基本的HTTP认证:
    import urllib2
    auth_handler = urllib2.HTTPBasicAuthHandler()
    auth_handler.add_password(realm='PDQ Application',
                              uri='https://mahler:8092/site-updates.py',
                              user='klem',
                              passwd='kadidd!ehopper')
    opener = urllib2.build_opener(auth_handler)
    urllib2.install_opener(opener)
    urllib2.urlopen('http://www.example.com/login.html')
    

    注:build_opener()默认提供很多处理程序,包括代理处理程序,代理默认会被设置为环境变量所提供的。

    一个使用代理的例子:
    proxy_handler = urllib2.ProxyHandler({'http': 'http://www.example.com:3128/'})
    proxy_auth_handler = urllib2.ProxyBasicAuthHandler()
    proxy_auth_handler.add_password('realm', 'host', 'username', 'password')
    
    opener = urllib2.build_opener(proxy_handler, proxy_auth_handler)
    opener.open('http://www.example.com/login.html')
    
    添加HTTP请求头部:
    import urllib2
    req = urllib2.Request('http://www.example.com/')
    req.add_header('Referer', 'http://www.python.org/')
    r = urllib2.urlopen(req)
    
    更改User-agent:
    import urllib2
    opener = urllib2.build_opener()
    opener.addheaders = [('User-agent', 'Mozilla/5.0')]
    opener.open('http://www.example.com/')
    

    注:httplibhttplib2httplib是http客户端协议的实现,通常不直接使用,urllib是以httplib为基础,httplib2是第三方库,比httplib有更多特性。httplib比较底层,一般使用的话用urlliburllib2即可。

    三、Python3.X中使用整合后的urllib

    Python2.x 有这些库名可用: urlliburllib2urllib3httplibhttplib2requests
    Python3.x 有这些库名可用: urlliburllib3httplib2requests


    若只使用Python3.x,记住有个urllib的库就行了。Pyhton2.x和Python3.x都有urllib3requests, 它们不是标准库。urllib3提供线程安全连接池和文件post等支持,与urlliburllib2的关系不大。requests 自称HTTP for Humans,使用更简洁方便。

    Python3.x中将urllib2合并到了urllib,之后此包分成了以下几个模块:

    • urllib.request 用于打开和读取URL

    • urllib.error 用于处理前面request引起的异常

    • urllib.parse 用于解析URL

    • urllib.robotparser用于解析robots.txt文件

    Python3.x中,随着urllib2合入urllib,一些常用的方法也发生了变化:2

    1. 在Python2.x中使用import urlparse——在Python3.x中会使用import urllib.parse

    2. 在Python2.x中使用urllib2.urlopenurllib.urlopen(已弃用)——在Python3.x中会使用urllib.request.urlopen

    3. 在Python2.x中使用urllib2.Request——在Python3.x中会使用urllib.request.Request

    4. 在Python2.x中使用urllib.quote——在Python3.x中会使用urllib.request.quote

    5. 在Python2.x中使用urllib.urlencode——在Python3.x中会使用urllib.parse.urlencode

    6. 在Python2.x中使用cookielib.CookieJar——在Python3.x中会使用http.CookieJar

    7. 异常处理:在Python2.x中使用urllib2.URLError,urllib2.HTTPError——在Python3.x中会使用urllib.error.URLError,urllib.error.HTTPError

    :在Python3.3后urllib2已经不能再用,所有urllib2全部用urllib.request来代替。


    urlliburllib2在Python2.x以及Python3.x的区别:

    Python2.x中:
    import urllib
    import urllib2
    

    1、共同点:都可以直接用urlopen(‘url’)请求页面

    2、不同点:urlliburlencode(dict)unquote()进行编码和解码

    3、对于error:

    try:
    	response = urllib2.urlopen("http://pythonsite.com/111341.html")
    except urllib2.HTTPError as e:
    	print(e.reason)
    	print(e.code)
    	print(e.headers)
    except urllib2.URLError as e:
    	print(e.reason)
    
    else:
    	print("reqeust successfully")
    
    Python3.x中:

    1、请求页面:urllib.request.urlopen(‘url’)

    2、对于error:

    from urllib import request,error
    try:
    	response = request.urlopen("http://pythonsite.com/113211.html")
    except error.HTTPError as e:
    	print(e.reason)
    	print(e.code)
    	print(e.headers)
    except error.URLError as e:
    	print(e.reason)
    
    else:
    	print("reqeust successfully")
    

    几个官方例子:

    GET一个URL:
    >>> import urllib.request
    >>> with urllib.request.urlopen('http://www.python.org/') as f:
    ...     print(f.read(300))
    
    PUT一个请求:
    import urllib.request
    DATA=b'some data'
    req = urllib.request.Request(url='http://localhost:8080', data=DATA, method='PUT')
    with urllib.request.urlopen(req) as f:
        pass
    print(f.status)
    print(f.reason)
    
    基本的HTTP认证:
    import urllib.request
    auth_handler = urllib.request.HTTPBasicAuthHandler()
    auth_handler.add_password(realm='PDQ Application',
                              uri='https://mahler:8092/site-updates.py',
                              user='klem',
                              passwd='kadidd!ehopper')
    opener = urllib.request.build_opener(auth_handler)
    urllib.request.install_opener(opener)
    urllib.request.urlopen('http://www.example.com/login.html')
    
    使用proxy:
    proxy_handler = urllib.request.ProxyHandler({'http': 'http://www.example.com:3128/'})
    proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
    proxy_auth_handler.add_password('realm', 'host', 'username', 'password')
    
    opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler)
    opener.open('http://www.example.com/login.html')
    
    添加头部:
    import urllib.request
    req = urllib.request.Request('http://www.example.com/')
    req.add_header('Referer', 'http://www.python.org/')
    r = urllib.request.urlopen(req)
    
    更改User-agent:
    import urllib.request
    opener = urllib.request.build_opener()
    opener.addheaders = [('User-agent', 'Mozilla/5.0')]
    opener.open('http://www.example.com/')
    
    使用GET时设置URL的参数:
    >>> import urllib.request
    >>> import urllib.parse
    >>> params = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
    >>> url = "http://www.musi-cal.com/cgi-bin/query?%s" % params
    >>> with urllib.request.urlopen(url) as f:
    ...     print(f.read().decode('utf-8'))
    ...
    
    使用POST时设置参数:
    >>> import urllib.request
    >>> import urllib.parse
    >>> data = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
    >>> data = data.encode('ascii')
    >>> with urllib.request.urlopen("http://requestb.in/xrbl82xr", data) as f:
    ...     print(f.read().decode('utf-8'))
    ...
    
    指定proxy:
    >>> import urllib.request
    >>> proxies = {'http': 'http://proxy.example.com:8080/'}
    >>> opener = urllib.request.FancyURLopener(proxies)
    >>> with opener.open("http://www.python.org") as f:
    ...     f.read().decode('utf-8')
    ...
    
    不使用proxy, 覆盖环境变量的proxy:
    >>> import urllib.request
    >>> opener = urllib.request.FancyURLopener({})
    >>> with opener.open("http://www.python.org/") as f:
    ...     f.read().decode('utf-8')
    ...
    

    注:Python2.X中的httplib被重命名为http.client

    使用2to3工具转换源码时, 会自动处理这几个库的导入.

    总的来说, 使用Python3.x, 记住只有urllib, 想要更简洁好用就用requests, 但不够通用。


    四、urllib33

    urllib3功能强大且易于使用,用于HTTP客户端的Python库。许多Python的原生系统已经开始使用urllib3

    urllib3提供了很多python标准库urllib里所没有的重要特性:

    • 线程安全
    • 连接池
    • 客户端SSL/TLS验证
    • 文件分部编码上传
    • 协助处理重复请求和HTTP重定位
    • 支持gzip和deflate压缩编码
    • 支持HTTP和SOCKS代理
    • 100%测试覆盖率

    1。安装

    urllib3是一个第三方库,pip安装:

    $ pip install urllib3
    

    或者,可以从GitHub获取最新的源代码:

    $ git clone git://github.com/shazow/urllib3.git
    $ python setup.py install
    

    2。使用

    urllib3主要使用连接池进行网络请求的访问,所以访问之前需要先创建一个连接池对象:

    # 导入urllib3模块:
    >>> import urllib3
    # 需要一个PoolManager实例来生成请求,由该实例对象处理与线程池的连接以及线程安全的所有细节,不需要任何人为操作:
    >>> http = urllib3.PoolManager()
    # 通过request()方法创建一个请求,该方法返回一个HTTPResponse对象:
    >>> r = http.request('GET', 'http://httpbin.org/robots.txt')
    >>> r.status
    200
    >>> r.data
    'User-agent: *\nDisallow: /deny\n'
    
    1.设置headers

    通过request()方法向请求(request)中添加一些其他信息:

    >>> r = http.request(
    ...     'POST',
    ...     'http://httpbin.org/post',
    ...     fields={'hello': 'world'})
    

    或者:在request()方法中,可以定义一个字典类型(dictionary),并作为headers参数传入:

    headers={'X-Something': 'value'}
    resp = http.request('GET', 'http://httpbin.org/headers', headers=headers)
    
    2.设置url参数

    对于GET等没有请求正文的请求方法,可以简单的通过设置fields参数来设置url参数。

    fields = {'arg': 'value'}
    resp = http.request('GET', 'http://httpbin.org/get', fields=fields)
    

    如果使用的是POST等方法,则会将fields作为请求的请求正文发送。
    所以,如果你的POST请求是需要url参数的话,那么需要自己对url进行拼接。

    fields = {'arg': 'value'}
    resp = http.request('POST', 'http://httpbin.org/get', fields=fields)
    
    3.设置代理
    >>> import urllib3
    >>> proxy = urllib3.ProxyManager('http://50.233.137.33:80', headers={'connection': 'keep-alive'})
    >>> resp = proxy.request('get', 'http://httpbin.org/ip')
    >>> resp.status
    200
    >>> resp.data
    b'{"origin":"50.233.136.254"}\n'
    

    urllib3中没有直接设置cookies的方法和参数,只能将cookies设置到headers中。

    4.官网的一些介绍

    请求(request)中的数据项(request data)可包括:

    Headers

    在request()方法中,可以定义一个字典类型(dictionary)并作为headers参数传入:

    >>> r = http.request(
    ...     'GET',
    ...     'http://httpbin.org/headers',
    ...     headers={
    ...         'X-Something': 'value'
    ...     })
    >>> json.loads(r.data.decode('utf-8'))['headers']
    {'X-Something': 'value', ...}
    
    Query parameters

    对于GET、HEAD和DELETE请求,可以简单的通过定义一个字典类型作为fields参数传入即可:

    >>> r = http.request(
    ...     'GET',
    ...     'http://httpbin.org/get',
    ...     fields={'arg': 'value'})
    >>> json.loads(r.data.decode('utf-8'))['args']
    {'arg': 'value'}
    

    对于POST和PUT请求(request),需要手动对传入数据进行编码,然后加在URL之后:

    >>> from urllib.parse import urlencode
    >>> encoded_args = urlencode({'arg': 'value'})
    >>> url = 'http://httpbin.org/post?' + encoded_args
    >>> r = http.request('POST', url)
    >>> json.loads(r.data.decode('utf-8'))['args']
    {'arg': 'value'}
    
    Form data

    对于PUT和POST请求(request),urllib3会自动将字典类型的field参数编码成表格类型.

    >>> r = http.request(
    ...     'POST',
    ...     'http://httpbin.org/post',
    ...     fields={'field': 'value'})
    >>> json.loads(r.data.decode('utf-8'))['form']
    {'field': 'value'}
    
    JSON

    在发起请求时,可以通过定义body参数并定义headers的Content-Type参数来发送一个已经过编译的JSON数据:

    >>> import json
    >>> data = {'attribute': 'value'}
    >>> encoded_data = json.dumps(data).encode('utf-8')
    >>> r = http.request(
    ...     'POST',
    ...     'http://httpbin.org/post',
    ...     body=encoded_data,
    ...     headers={'Content-Type': 'application/json'})
    >>> json.loads(r.data.decode('utf-8'))['json']
    {'attribute': 'value'}
    
    Files & binary data

    使用multipart/form-data编码方式上传文件,可以使用和传入Form data数据一样的方法进行,并将文件定义为一个元组的形式(file_name,file_data):

    >>> with open('example.txt') as fp:
    ...     file_data = fp.read()
    >>> r = http.request(
    ...     'POST',
    ...     'http://httpbin.org/post',
    ...     fields={
    ...         'filefield': ('example.txt', file_data),
    ...     })
    >>> json.loads(r.data.decode('utf-8'))['files']
    {'filefield': '...'}
    

    文件名(filename)的定义不是严格要求的,但是推荐使用,以使得表现得更像浏览器。同时,还可以向元组中再增加一个数据来定义文件的MIME类型:

    >>> r = http.request(
    ...     'POST',
    ...     'http://httpbin.org/post',
    ...     fields={
    ...         'filefield': ('example.txt', file_data, 'text/plain'),
    ...     })
    

    如果是发送原始二进制数据,只要将其定义为body参数即可。同时,建议对headerContent-Type参数进行设置:

    >>> with open('example.jpg', 'rb') as fp:
    ...     binary_data = fp.read()
    >>> r = http.request(
    ...     'POST',
    ...     'http://httpbin.org/post',
    ...     body=binary_data,
    ...     headers={'Content-Type': 'image/jpeg'})
    >>> json.loads(r.data.decode('utf-8'))['data']
    b'...'
    

    Response content

    The HTTPResponse object provides status, data, and header attributes:

    >>> r = http.request('GET', 'http://httpbin.org/ip')
    >>> r.status
    200
    >>> r.data
    b'{\n  "origin": "104.232.115.37"\n}\n'
    >>> r.headers
    HTTPHeaderDict({'Content-Length': '33', ...})
    
    JSON content

    JSON content can be loaded by decoding and deserializing the data attribute of the request:

    >>> import json
    >>> r = http.request('GET', 'http://httpbin.org/ip')
    >>> json.loads(r.data.decode('utf-8'))
    {'origin': '127.0.0.1'}
    
    Binary content

    The data attribute of the response is always set to a byte string representing the response content:

    >>> r = http.request('GET', 'http://httpbin.org/bytes/8')
    >>> r.data
    b'\xaa\xa5H?\x95\xe9\x9b\x11'
    

    Note: For larger responses, it’s sometimes better to stream the response.

    Using timeouts

    使用timeout,可以控制请求的运行时间。在一些简单的应用中,可以将timeout参数设置为一个浮点数:

    >>> http.request(
    ...     'GET', 'http://httpbin.org/delay/3', timeout=4.0)
    <urllib3.response.HTTPResponse>
    >>> http.request(
    ...     'GET', 'http://httpbin.org/delay/3', timeout=2.5)
    MaxRetryError caused by ReadTimeoutError
    

    要进行更精细的控制,可以使用Timeout实例,将连接的timeout和读的timeout分开设置:

    >>> http.request(
    ...     'GET',
    ...     'http://httpbin.org/delay/3',
    ...     timeout=urllib3.Timeout(connect=1.0))
    <urllib3.response.HTTPResponse>
    >>> http.request(
    ...     'GET',
    ...     'http://httpbin.org/delay/3',
    ...     timeout=urllib3.Timeout(connect=1.0, read=2.0))
    MaxRetryError caused by ReadTimeoutError
    

    如果想让所有的request都遵循一个timeout,可以将timeout参数定义在PoolManager中:

    >>> http = urllib3.PoolManager(timeout=3.0)
    # 或者这样
    >>> http = urllib3.PoolManager(
    ...     timeout=urllib3.Timeout(connect=1.0, read=2.0))
    

    当在具体的request中再次定义timeout时,会覆盖PoolManager层面上的timeout。

    请求重试(Retrying requests):

    urllib3可以自动重试幂等请求,原理和handles redirect一样。可以通过设置retries参数对重试进行控制。Urllib3默认进行3次请求重试,并进行3次方向改变。

    给retries参数定义一个整型来改变请求重试的次数:

    >>> http.requests('GET', 'http://httpbin.org/ip', retries=10)
    

    关闭请求重试(retrying request)及重定向(redirect)只要将retries定义为False即可:

    >>> http.request(
    ...     'GET', 'http://nxdomain.example.com', retries=False)
    NewConnectionError
    >>> r = http.request(
    ...     'GET', 'http://httpbin.org/redirect/1', retries=False)
    >>> r.status
    302
    

    关闭重定向(redirect)但保持重试(retrying request),将redirect参数定义为False即可:

    >>> r = http.request(
    ...     'GET', 'http://httpbin.org/redirect/1', redirect=False)
    >>> r.status
    302
    

    要进行更精细的控制,可以使用retry实例,通过该实例可以对请求的重试进行更精细的控制。

    例如,进行3次请求重试,但是只进行2次重定向:

    >>> http.request(
    ...     'GET',
    ...     'http://httpbin.org/redirect/3',
    ...     retries=urllib3.Retry(3, redirect=2))
    MaxRetryError
    

    You can also disable exceptions for too many redirects and just return the 302 response:

    >>> r = http.request(
    ...     'GET',
    ...     'http://httpbin.org/redirect/3',
    ...     retries=urllib3.Retry(
    ...         redirect=2, raise_on_redirect=False))
    >>> r.status
    302
    

    如果想让所有请求都遵循一个retry策略,可以在PoolManager中定义retry参数:

    >>> http = urllib3.PoolManager(retries=False)
    # 或者这样:
    >>> http = urllib3.PoolManager(
    ...     retries=urllib3.Retry(5, redirect=2))
    

    当在具体的request中再次定义retry时,会覆盖 PoolManager层面上的retry。

    Errors & Exceptions

    urllib3 wraps lower-level exceptions, for example:

    >>> try:
    ...     http.request('GET', 'nx.example.com', retries=False)
    >>> except urllib3.exceptions.NewConnectionError:
    ...     print('Connection failed.')
    

    See exceptions for the full list of all exceptions.

    Logging

    If you are using the standard library logging module urllib3 will emit several logs. In some cases this can be undesirable. You can use the standard logger interface to change the log level for urllib3’s logger:

    >>> logging.getLogger("urllib3").setLevel(logging.WARNING)
    

    五、requests

    requests使用的是urllib3,它继承了urllib2的所有特性。requests有很大功能特性:

    • 支持HTTP连接保持和连接池;
    • 支持使用cookie保持会话;
    • 支持文件上传;
    • 支持自动确定响应内容的编码;
    • 支持国际化的URL和POST数据自动编码。

    requests是第三方类库,需要另外安装。

    简单使用:
    import requests
     
    r = requests.get(url='http://www.baidu.com')    # 最基本的GET请求
    print(r.status_code)    # 获取返回状态
    
    #带参数的GET请求,http://dict.baidu.com/s?wd=python
    r = requests.get(url='http://dict.baidu.com/s', params={'wd':'python'})   
    print(r.url)
    print(r.text)   #打印解码后的返回数据
    

    关于requests更详细的介绍,请参阅 https://blog.csdn.net/jiduochou963/article/details/87564359


    参考:
    python中urllib, urllib2,urllib3, httplib,httplib2, request的区别 https://blog.csdn.net/permike/article/details/52437492
    Python网络请求urllib和urllib3详解 https://www.jianshu.com/p/f05d33475c78
    Python–urllib3库详解1 https://www.cnblogs.com/KGoing/p/6146999.html
    urllib2库.官方文档翻译 https://blog.csdn.net/u014343243/article/details/49308043


    1. 部分内容参考Python基础教程 ↩︎

    2. 进一步了解urllib2,参见中文版翻译文档:http://blog.csdn.net/u014343243/article/details/49308043 ↩︎

    3. urllib3官方文档: https://urllib3.readthedocs.io/en/latest/
      urllib3其他参考文档: https://pypi.org/project/urllib3/ ↩︎

    展开全文
  • python urlliburllib3包使用

    千次阅读 2019-06-21 16:28:54
    urlliburllib是一个包含几个模块来处理请求的库。分别是: urllib.request 发送http请求 urllib.error 处理请求过程中,出现的异常。 urllib.parse 解析url urllib.robotparser 解析robots.txt 文件 urllib....

    urllib包

    urllib是一个包含几个模块来处理请求的库。分别是:

    urllib.request 发送http请求

    urllib.error 处理请求过程中,出现的异常。

    urllib.parse 解析url

    urllib.robotparser 解析robots.txt 文件

    urllib.request

    urllib当中使用最多的模块,涉及请求,响应,浏览器模拟,代理,cookie等功能。

    1. 快速请求

    urlopen返回对象提供一些基本方法:

    read 返回文本数据

    info 服务器返回的头信息

    getcode 状态码

    geturl 请求的url

     

    2.模拟PC浏览器和手机浏览器

    需要添加headers头信息,urlopen不支持,需要使用Request

    PC

     

    手机

     

    3.Cookie的使用

    客户端用于记录用户身份,维持登录信息

     

    4.设置代理

    当需要抓取的网站设置了访问限制,这时就需要用到代理来抓取数据。

     


    urllib.error

    urllib.error可以接收有urllib.request产生的异常。urllib.error中常用的有两个方法,URLError和HTTPError。URLError是OSError的一个子类,

    HTTPError是URLError的一个子类,服务器上HTTP的响应会返回一个状态码,根据这个HTTP状态码,我们可以知道我们的访问是否成功。

    URLError

    URLError产生原因一般是:网络无法连接、服务器不存在等。

    例如访问一个不存在的url

     

    HTTPError

    HTTPError是URLError的子类,在你利用URLopen方法发出一个请求时,服务器上都会对应一个应答对象response,其中他包含一个数字“状态码”,

    例如response是一个重定向,需定位到别的地址获取文档,urllib将对此进行处理。其他不能处理的,URLopen会产生一个HTTPError,对应相应的状态码,

    HTTP状态码表示HTTP协议所返回的响应的状态。

     


    urllib.parse

    urllib.parse.urljoin 拼接url

    基于一个base URL和另一个URL构造一个绝对URL,url必须为一致站点,否则后面参数会覆盖前面的host

     

    urllib.parse.urlencode 字典转字符串

     

    urllib.parse.quote url编码

    urllib.parse.unquote url解码

    Url的编码格式采用的是ASCII码,而不是Unicode,比如

    http://so.biquge.la/cse/search?s=7138806708853866527&q=%CD%EA%C3%C0%CA%C0%BD%E7

     


    urllib3包

    Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用urllib3。Urllib3提供了很多python标准库里所没有的重要特性:

    1.线程安全

    2.连接池

    3.客户端SSL/TLS验证

    4.文件分部编码上传

    5.协助处理重复请求和HTTP重定位

    6.支持压缩编码

    7.支持HTTP和SOCKS代理

    安装:

    Urllib3 能通过pip来安装:

    $pip install urllib3

    你也可以在github上下载最新的源码,解压之后进行安装:

    $git clone git://github.com/shazow/urllib3.git

    $python setup.py install

    urllib3的使用:

    request GET请求

     

    request GET请求(添加数据)

     

    post请求

     

     

    发送json数据

     

    上传文件

     

    使用Timeout

     

    对重试和重定向进行控制

     

    展开全文
  • 报错信息:RequestsDependencyWarning: urllib3 (1.26.7) or chardet (3.0.4) doesn’t match a supported version! warnings.warn("urllib3 ({}) or chardet ({}) doesn’t match a supported " 原因:requests和...
  • Python urllib.urlencode

    千次阅读 2020-04-27 17:34:15
    urllib.urlencode 小笔记
  • python模块urllib3.zip

    2020-03-22 11:45:04
    使用Python 3.x版本运行py文件时报错 No module named 'urllib3' 一开始参照网上的安装方法通过pip来安装,未成功pip install urllib3 后面找到了这个文件,分享给大家。 使用方法是下载解压后,cmd里切换到解压...
  • 主要介绍了Python urlliburllib2、httplib抓取网页代码实例,本文直接给出demo代码,代码中包含详细注释,需要的朋友可以参考下
  • 主要介绍了python urllib爬虫模块使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 本文整理汇总了Python中requests.packages.urllib3.disable_warnings方法的典型用法代码示例。如果您正苦于以下问题:Python urllib3.disable_warnings方法的具体用法?Python urllib3.disable_warnings怎么用?...
  • python urllib模块的urlopen()的使用方法

    千次阅读 2019-07-10 21:57:37
    Python urllib 库提供了一个从指定的 URL 地址获取网页数据,然后对其进行分析处理,获取想要的数据。 1、urllib模块urlopen()函数: urlopen(url, data=None, proxies=None) 它可以创建一个表示远程url的类文件对象...
  • 问题描述 访问一个接口,需要跳转到另一个...参考文献 python 字典字符串转字典——urllib.request.Request发送get,post请求 python3 urlopen打开包含中文的url urllib.request — Extensible library for opening URLs
  • Python urllib urllib模块

    2017-02-25 20:53:36
    Python urllib urllib2 urllib模块
  • 主要介绍了python urllib中的编码处理示例,本文直接给出几个处理实例,需要的朋友可以参考下
  • 本篇文章主要介绍了python urllib爬取百度云连接的实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 六、python urllib2请求json数据

    千次阅读 2017-08-31 11:26:52
    需要从别的内部网站上获取数据,使用了python自带的urllib2 def getIssue(self, viewId): ''' 根据指定的viewId 获取该需求的完整信息 @param viewId: 需求的ViewId,例如:XXX-1 @return: 如果没有符合条件的...
  • Python urllib CRLF 命令注入漏洞 1【靶标分类】 通用漏洞组件 2【漏洞分类】 命令注入 3【漏洞等级】 高 4【漏洞简介】 PythonPython软件基金会的一套开源的、面向对象的程序设计语言。...
  • >>> import urllib >>> urllib.quote( '编码坑爹' ) '%B1%E0%C2%EB%BF%D3%B5%F9' 这样我就得到了GBK的url编码,用这个编码直接传递给URL就能直接解释出中文。不需要我们再处理了 >>> urllib.quote( '编码坑爹' ....
  • python urllib 库下载 http文件

    千次阅读 2019-06-01 18:21:57
    直接看demo,运行就可以看到.../usr/bin/env python3 # -*- coding: utf-8 -*- import urllib def download_http_source(source_path, output_file): try: if source_path.startswith("http://") or source_pa...
  • python urllib3 multipart/form-data 的坑

    万次阅读 2018-05-12 16:08:23
    python urllib3 multipart/form-data 的坑 ################################3.上传文件时带了个header与urllib3.request.py不兼容 传header的Content-Type时,应区分大小写 def request_encode_body(self, ...
  • python 2.7 urllib2的详细使用教程
  • python urllib/urllib2 get/post使用详解

    万次阅读 2015-08-12 14:51:54
    1、urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,你不可以伪装你的User Agent字符串等。2、urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 125,890
精华内容 50,356
关键字:

pythonurllib

python 订阅