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)
<class 'urllib.parse.ParseResult'> 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编码解码成中文

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容