urllib的使用

urllib库是python内置的HTTP请求库。

包含以下四个模块:

1) request 最基本的HTTP请求模块,可以用来模拟发送请求。

2)error 异常处理模块

3)parse 一个工具模块,提供了许多URL处理方法,比如拆分,解析,合并等。

4)robotparser 用来识别网站的robots.txt文件,从而判断哪些网站可以爬,哪些网站不可以爬。

1.request 模块

1.1 urlopen()

import urllib.request

response = urllib.request.urlopen(url)

得到的response是一个HTTPResponse类型的对象,主要包含read(),readinto(),getheader(name),getheaders(),fileno()等方法,以及msg,version,status,reason等属性。

通过urlopen()得到response这个对象后,就可以调用上面提到的这些方法和属性,从而得到返回结果的一系列对象,

  • urlopen函数的API

    Urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,cadefault=False,context=None)

    • data 参数
      data参数是可选的,如果要添加这个参数,就需要使用bytes()方法将参数转化为字节流编码格式的内容,即bytes类型。如果使用了这个参数就不在是GET请求而是POST请求了。

      import urllib.parse
      import urllib.request
      
      data = bytes(urllib.parse.urlencode({'word':'hello'}),encoding='utf8')
      response = urllib.request.urlopen(url,data=data)
      print(response.read())
      

      在这里我们传递了一个参数为word,值是hello。它需要被转码成bytes类型,采用的方法就是bytes()方法,该方法的第一个参数需要的是str类型,需要使用urllib.parse模块里的urlencode方法来将参数字典转换为字符串,第二个参数指定编码格式,这里指定为utf8。

    • timeout参数

      该参数用于设置超时时间,单位为秒,超过设置的这个时间还没有得到响应就会抛出异常,如果不指定,就会使用全局默认时间。

1.2 Request

urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
  • URL用来请求URL,必传参数,其他的都是可选参数

  • data如果要传,就必须传bytes类型的,如果参数为字典,可以先用urllib.parse模块里的urlencode编码。

  • headers是一个字典,请求头,可以在构造请求是通过headers参数直接构造,也可以通过调用请求实例的add_header()方法添加re。

  • Method是一个字符串,用来指示请求使用的方法

1.3高级用法

  • 代理

    from urllib.error import UELError
    from urllib.request import ProxyHandler,build_opener
    
    proxy_handler = ProxyHandler({
        'http':'http://',
        'https':'https://'
    })
    
    opener = build_opener(proxy_handler)
    try:
      response = opener.open(url)
      print(response.read().decode('utf-8'))
    except URLError as e:
      print(e.reason)
    

    这里使用了ProxyHandler其参数是一个字典,键名是协议类型(http或者https),键值是代理链接,可以添加多个代理IP。

    然后利用这个Handler以及build_opener()方法构造了一个Opener,之后发送即可。

  • Cookies

    • 获取网站的Cookies

      import http.cookiejar,urllib.request
      
      cookie = http.cookiejar.CookieJar()
      handler = urllib.request.HTTPCookieProcessor(cookie)
      opener = urllib.request.build_opener(handler)
      response = opener.oepn(url)
      for item in cookie:
          print(item.name+"="+item.value)
      

      首先声明一个CookieJar对象,然后利用HTTPCookieProcessor来构建一个Handler,最后利用build_opener()方法来构建出opener,执行open即可。

    • 以文件形式获取Cookie

      filename = 'cookies.txt'
      cookie = http.cookiejar.MozillaCookieJar(filename)
      handler = urllib.request.HTTPCookieProcessor(cookie)
      opener = urllib.request.build_opener(handler)
      response = opener.oepn(url)
      cookie.save(ignore_discard=True,ignore_expires=True)
      

2.处理异常

urllib的error模块定义了由request模块产生的异常。

2.1URLError

URLError类来自urllib库的error模块,它继承自OSError类,是error异常模块的基类,由request模块产生的异常都可以通过捕获和这个类来处理

这个类具有一个reason属性,即返回的错误的原因。

from urllib import request,error
try:
    .....
except error.URLError as e:
    print(e.reason)

2.2HTTPError

它是URLError的子类,专门用来处理HTTP请求错误。它有三个属性

  • code 返回HTTP状态码

  • reason 返回错误信息

  • headers 返回请求头

3解析链接

urllib库里提供了一个parse模块,定义处理URL的标准接口,例如实现URL各部分的抽取,合并以及链接转换

3.1 urlparse(urlstring,shcme='',allow_fragments=True)

  • urlstring 必填项 待解析的url
  • Scheme 默认的协议,如果这个链接没有带协议信息,会将这个作为默认的协议。
  • allow_fragments 即是否忽略fragment,如果设置为False,则fragment部分就会被忽略,会成为其他的一部分,而fragment则为空
from urllib.parse import urlparse

result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(result),result)
 ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')

从打印的结果可以看出,返回的是一个ParseResult类型的对象,它包含了6个部分,分别是scheme(协议,比如http,https),netloc(域名),path(访问路径),params(参数),query(问号后面的查询条件),fragment(#后面的内容).

一个标准的链接格式: scheme://netloc/path;params?query#fragment

3.2urlunparse()

与urlparse()方法的对立。它接受的参数是一个可迭代对象,长度必须为6,即传入6个参数,返回的结果是组装好的URL.

data = ['http','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(data))

得到的结果为

http://www.baidu.com/index.html;user?a=6#comment

3.3urlsplit()与urlunsplit()

这个方法和urlparse()方法类似,只不过不在解析parms这个部分,只返回五个结果。parms部分会合并到path中。

3.4 urljoin()

使用URLjoin方法 需要提供一个base_url作为第一参数,将新的链接作为第二个参数,然后会合成一个新的链接。

Base_url 提供了三项内容,scheme,netloc,path.如果这三项在新的链接中不存在就补充,如果新的链接存在,就使用新的链接中的部分。

3.5 urlencode() 与 parse_qs()

from urllib.parse import urlencode

params = {
    'name':'germey',
    'age':22
}
base_url = 'http://www.baidu.com?'
url = base_url + urlencode(params)
print(url)

结果为:

http://www.baidu.com?name=germey&age=22

将字典类型转换为GET请求参数。

如果我们有一串GET请求参数,利用parse_qs()方法,就可以将参数转换为字典

3.5 quote()与unquote()

Quote将中文转化为URL编码的格式

from urllib.parse import quote

url_word = quote(keyword)

unquote将URL编码解码成中文

你可能感兴趣的:(urllib的使用)