精华内容
下载资源
问答
  • urllib3

    2018-11-28 20:15:16
    首先,导入urllib3模块: >>> import urllib3 您需要一个PoolManager实例来发出请求。此对象处理连接池和线程安全的所有详细信息,因此您不必: >>> ...

    首先,导入urllib3模块:

    >>> import urllib3
    

    您需要一个PoolManager实例来发出请求。此对象处理连接池和线程安全的所有详细信息,因此您不必:

    >>> http = urllib3.PoolManager()
    

    要发出请求,请使用request()

    >>> r = http.request('GET', 'http://httpbin.org/robots.txt')
    >>> r.data
    b'User-agent: *\nDisallow: /deny\n'
    

    request()返回一个HTTPResponse对象, 响应内容部分解释了如何处理各种响应。

    您可以使用request()任何HTTP动词来发出请求:

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

    请求数据部分涵盖发送其他类型的请求的数据,包括JSON,文件和二进制数据。

    响应内容

    HTTPResponse对象提供 statusdata和 header属性:

    >>> 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内容

    可以通过解码和反序列data化请求的属性来加载JSON内容 :

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

    二进制内容

    data响应的属性始终设置为表示响应内容的字节字符串:

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

    注意

    对于更大的响应,有时更好地传输 响应。

    请求数据

    标题

    您可以在headers参数中将标题指定为字典request()

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

    查询参数

    对于GETHEADDELETE请求,您只需将参数作为参数中的字典传递fieldsrequest()

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

    对于POSTPUT请求,您需要在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'}
    

    表格数据

    对于PUTPOST请求,urllib3将自动对fields提供的参数中 的字典进行格式编码request()

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

    JSON 

    您可以通过将编码数据指定为body 参数并Content-Type在调用时设置标头来 向JSON发送请求request()

    >>> 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'}
    

    文件和二进制数据

    要使用multipart/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': '...'}
    

    虽然不严格要求指定文件名,但建议使用它来匹配浏览器行为。您还可以传递元组中的第三个项目以明确指定文件的MIME类型:

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

    要发送原始二进制数据,只需指定body参数即可。还建议设置Content-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'...'
    

    证书验证

    强烈建议始终使用SSL证书验证。 默认情况下,urllib3不验证HTTPS请求

    为了启用验证,您需要一组根证书。最简单,最可靠的方法是使用提供Mozilla根证书包的certifi包:

    pip install certifi
    

    您还可以使用secure 额外的安装与urllib3一起安装certifi :

    pip install urllib3[secure]
    

    警告

    如果您使用的是Python 2,则可能需要其他软件包。有关详细信息,请参阅以下部分

    获得证书后,您可以创建PoolManager 在发出请求时验证证书的证书:

    >>> import certifi
    >>> import urllib3
    >>> http = urllib3.PoolManager(
    ...     cert_reqs='CERT_REQUIRED',
    ...     ca_certs=certifi.where())
    

    PoolManager会自动处理证书验证,并会提高SSLError,如果验证失败:

    >>> http.request('GET', 'https://google.com')
    (No exception)
    >>> http.request('GET', 'https://expired.badssl.com')
    urllib3.exceptions.SSLError ...
    

    注意

    如果需要,您可以使用OS提供的证书。只需指定证书包的完整路径作为ca_certs参数而不是 certifi.where()。例如,大多数Linux系统都存储证书/etc/ssl/certs/ca-certificates.crt。其他操作系统可能很难

    Python 2中的证书验证

    较旧版本的Python 2使用ssl缺少SNI支持的模块 构建,并且可能落后于安全更新。由于这些原因,建议使用 pyOpenSSL

    如果你使用secure额外的安装urllib3,将安装Python 2上所有必需的证书验证包:

    pip install urllib3[secure]
    

    如果您想要手动安装的软件包,您需要pyOpenSSL, cryptographyidna,和certifi

    注意

    如果您不使用macOS或Windows,请注意加密需要额外的系统包进行编译。有关 所需软件包的列表,请参阅在Linux上构建加密

    安装完成后,您可以通过以下方式告诉urllib3使用pyOpenSSL urllib3.contrib.pyopenssl

    >>> import urllib3.contrib.pyopenssl
    >>> urllib3.contrib.pyopenssl.inject_into_urllib3()
    

    最后,您可以创建一个PoolManager在执行请求时验证证书:

    >>> import certifi
    >>> import urllib3
    >>> http = urllib3.PoolManager(
    ...     cert_reqs='CERT_REQUIRED',
    ...     ca_certs=certifi.where())
    

    如果你不想使用pyOpenSSL,你可以简单地省略对它的调用urllib3.contrib.pyopenssl.inject_into_urllib3()。urllib3将回退到标准库ssl模块。执行此操作时,您可能会遇到 几个警告

    警告

    如果您不使用pyOpenSSL,则必须使用ssl支持编译Python以使证书验证起作用。这种情况并不常见,但可以在没有SSL支持的情况下编译Python。有关 更多详细信息,请参阅此 Stackoverflow线程

    如果您使用的是Google App Engine,则必须在以下位置明确启用SSL支持app.yaml

    libraries:
    - name: ssl
      version: latest
    

    使用超时

    超时允许您控制在中止之前允许运行的请求的时间。在简单的情况下,您可以将超时指定float 为request()

    >>> 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 实例,它允许您指定单独的连接和读取超时:

    >>> 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
    

    如果您希望所有请求都受到相同的超时,您可以在PoolManager级别指定超时:

    >>> http = urllib3.PoolManager(timeout=3.0)
    >>> http = urllib3.PoolManager(
    ...     timeout=urllib3.Timeout(connect=1.0, read=2.0))
    

    您仍然通过指定timeoutto来 覆盖此池级超时request()

    重试请求

    urllib3可以自动重试幂等请求。同样的机制也处理重定向。您可以使用retries参数to 控制重试次数request()。默认情况下,urllib3将重试请求3次,并最多跟进3次重定向。

    要更改重试次数,只需指定一个整数:

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

    要禁用所有重试和重定向逻辑,请指定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=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
    

    您还可以禁用太多重定向的异常,只返回 302响应:

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

    如果您希望所有请求都遵循相同的重试策略,则可以在PoolManager级别指定重试:

    >>> http = urllib3.PoolManager(retries=False)
    >>> http = urllib3.PoolManager(
    ...     retries=urllib3.Retry(5, redirect=2))
    

    您仍然通过指定retriesto来 覆盖此池级重试策略request()

    错误和异常

    urllib3包含较低级别的异常,例如:

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

    有关exceptions所有例外的完整列表,请参阅。

    记录

    如果您使用的是标准库logging模块,则urllib3会发出几个日志。在某些情况下,这可能是不可取的。您可以使用标准记录器界面更改urllib3记录器的日志级别:

    >>> logging.getLogger("urllib3").setLevel(logging.WARNING)
    展开全文
  • Python urllib、urllib2、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报错pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out. 解决方法如下: pip --default-timeout...

    在安装第三方库的时候,Python报错pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.

    评论区提供的解决方法如下:

    输入指令:

    pip --default-timeout=100 install 库名称 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 

    2020.07.22更新:如果上面那个豆瓣依然不快(虽然还没出现过这种情况),可以换成下面的国内镜像网站。

    清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/

    中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 华中科技大学:http://pypi.hustunique.com/

    山东理工大学:http://pypi.sdutlinux.org/ 豆瓣:http://pypi.douban.com/simple/

    目前还是豆瓣的下载速度最有保障。
     

    展开全文
  • urllib和urllib3

    2019-10-18 21:30:35
    urllib和urllib3 一、urllib库 1.1 urllib库所包含的模块 1.2 urlopen方法 二、urllib3

    urllib和urllib3

    一、urllib库

    1.1 urllib库所包含的模块

    在这里插入图片描述
    在这里插入图片描述

    1.2 urlopen方法

    在这里插入图片描述

    1.3 添加请求头

    在这里插入图片描述

    1.4 cookie操作

    在这里插入图片描述

    1.5 代理设置

    在这里插入图片描述

    1.6 response对象

    在这里插入图片描述

    1.7 urllib.parse模块

    在这里插入图片描述
    在这里插入图片描述

    1.8 urllib.error模块

    在这里插入图片描述

    1.9 robotparse模块

    在这里插入图片描述

    二、urllib3库

    2.1 简介

    在这里插入图片描述

    2.2 构造请求

    在这里插入图片描述

    2.3 response属性

    在这里插入图片描述

    2.4 json数据解析

    在这里插入图片描述

    2.5 大数据处理

    在这里插入图片描述

    2.6 代理

    在这里插入图片描述

    2.7 request参数

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    三、爬虫开发的基本流程

    在这里插入图片描述

    四、练习

    在这里插入图片描述

    import urllib3
    import re
    import os
    # 构造请求
    http = urllib3.PoolManager()
    url_list = ["http://www.weimeitupian.com", "http://www.weimeitupian.com/page/2", "http://www.weimeitupian.com/page/3"]
    for i in range(len(url_list)):
        res = http.request("GET", url_list[i])  # 循环发送请求
        res_str = res.data.decode()  # 将响应的数据解码
        print("正在下载第{}页的数据".format(i+1))
        # 匹配创建文件夹时所需要的文本并筛选出所需要的文本
        dir_name = re.findall(r'title="(.+?)"', res_str, re.S)[9:-10]
        # 匹配每个图片的url并筛选出所需要的url
        img_url = re.findall(r'<!--<img src="(.+?)"', res_str, re.S)[:45]
        # print(dir_name, len(dir_name))
        # print(img_url, len(img_url))
        for i in range(len(img_url)):
            try:
                res_img = http.request("GET", img_url[i])
                # res_img = http.request("GET", img_url[i], preload_content=False)  # 分段存储必须要带上preload_content=False
            except Exception as e:
                print("url出错!", e)
                res_img = http.request("GET", "http://www.weimeitupian.com"+img_url[i])
                # res_img = http.request("GET", "http://www.weimeitupian.com" + img_url[i], preload_content=False)
            # 拼接一个路径,用来创建文件夹
            dir_path = os.path.join(r"D:\Python学院学习环境\pachong\img", dir_name[i])
            # 判断该路径是否存在,不存在则创建
            if not os.path.exists(dir_path):
                os.mkdir(dir_path)
            # 拼接一个文件路径
            file_path = os.path.join(dir_path, "{}".format(img_url[i].split("/")[-1]))
            with open(file_path, "wb")as f:
                print("正在下载第{}条数据".format(i+1))
                f.write(res_img.data)
                # for chunk in res_img.stream(32):  # 分段写入,每次写入32个字节
                #     f.write(chunk)
    
    

    效果图
    在这里插入图片描述

    展开全文
  • urllib3

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

    2020-12-27 22:10:20
    urllib和urllib3
  • 相关链接: 《Python urllib、urllib2、urllib3用法及区别》 《urllib2库.官方文档翻译》 《urllib3官方文档》 《urllib3的基本用法》 《详解 python3 urllib》
  • Python网络请求urllib和urllib3详解urllib是Python中请求url连接的官方标准库,在Python2中主要为urllib和urllib2,在Python3中整合成了urllib。而urllib3则是增加了连接池等功能,两者互相都有补充的部分。urllib...
  • 本篇就urllib和urllib3这两种库为大家带来介绍,分析其基本的用法、不同点、使用注意和实例,希望能对大家在数据请求的学习有所帮助。1、说明在可供使用的网络库中,urllib和urllib3可能是投入产出比最高的两个。...
  • python3中也有urllib和urllib3两个库,其中urllib几乎是python2.7中urllib和urllib2两个模块的集合,所以我们最常用的urllib模块,而urllib3则作为一个拓展模块使用。 python2.7中的urllib2 = python3中的urllib....
  • urllib3则是增加了连接池等功能,两者互相都有补充的部分。2. urlliburllib作为Python的标准库,基本上涵盖了基础的网络请求功能。2.1. urllib.requesturllib中,request这个模块主要负责构造...
  • 本篇就urllib和urllib3这两种库为大家带来介绍,分析其基本的用法、不同点、使用注意和实例,希望能对大家在数据请求的学习有所帮助。1、说明在可供使用的网络库中,urllib和urllib3可能是投入产出比最高的两个。...
  • python urllib3

    2014-04-19 14:56:46
    python urllib3 安装文件包
  • 为了演示urllib3的使用,我们这里将会从一个网站下载两个文件。首先,需要导入urllib3库:import urllib3这两个文件的源url为:url1 = 'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_week.csv'...
  • urllib3 version conflict

    2020-11-30 11:10:18
    <div><p>We are experiencing issues with urllib3 and error is pkg_resources.VersionConflict: (urllib3 1.25 (/usr/lib/python3.6/site-packages), Requirement.parse('urllib3<1.25.0,>=1.24.2&...
  • 我正在为一个作业编写一个程序,它使用urllib3下载一个网页并将其存储在词典中。(我用的是spyder 3.6)程序给了我一个“AttributeError”,我不知道我做错了什么。这是我的代码和我为作业编写的一步一步的注释。在#...
  • urllib3则是增加了连接池等功能,两者互相都有补充的部分。 1.urllib库 urllib 是一个用来处理网络请求的python标准库,它包含4个模块。 (1)urllib.request模块: *** request模块主要负责构造和发起网络请求,...
  • python3中把urllib和urllib合并为一个库了,urllib对应urllib.request 1.) python 中最早内置拥有的网络请求模块就是 urllib,我们可以看一下 urllib...3.) urllib3模块并非 python 内置,需要额外的安装,可以...
  • 本篇就urllib和urllib3这两种库为大家带来介绍,分析其基本的用法、不同点、使用注意和实例,希望能对大家在数据请求的学习有所帮助。1、说明在可供使用的网络库中,urllib和urllib3可能是投入产出比最高的两个。...
  • Py之urllib2:Python库之urllib、urllib2、urllib3系列简介、安装、使用方法之详细攻略 目录 urllib2简介 urllib2安装 urllib2使用方法 urllib2简介 urllib和urllib2之间PK 1、在python中,urllib和...
  • yum install python-urllib3报错内容如下:Installing : python-urllib3-1.10.2-3.el7.noarch ...
  • 此代码有效:requester = urllib3.PoolManager(maxsize = 10, headers = self.headers)thread_pool = workerpool.WorkerPool()thread_pool.map(grab_wrapper, [item['link'] for item in products])threa...
  • 而在Python 3中,重构了urllib和urllib2到标准库urllib,并另外提供了urllib3。1. urllib3的特性线程安全连接缓冲池客户端SSL/TLS验证文件上传请求重试HTTP重定向支持gzip和deflate encoding支持HT...
  • Python标准库—urllib和urllib3

    万次阅读 2019-06-04 21:04:54
    urllib是Python中请求url连接的官方标准库,在Python2中主要为urlliburllib2,在Python3中整合成了urlliburllib中一共有四个模块,分别如下: request:主要负责构造和发起网络请求,定义了适用于在各种复杂情况...
  • urllib3-1.23.tar

    2018-10-08 17:11:42
    Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用urllib3Urllib3提供了很多python标准库里所没有的重要特性
  • 我们在Pycharm编辑器新建的项目中如果发现无法使用urllib3库时,可以做以下操作:错误提示如下: 我们在pycharm项目的lib的site-packages里面也找不到这个urllib3文件。 那么,我们继续操作:1、先确认urllib3是否...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,934
精华内容 8,773
关键字:

urllib3