• python2核心类库:urllib、urllib2的区别和使用


    urllib/urllib2都是接受URL请求的相关模块
    区别:
    1.urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,你不可以伪装你的User Agent字符串等。
    2.urllib提供urlencode方法用来产生GET的查询字符串,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。
    目前的大部分http请求都是通过urllib2来访问的

    urllib2简单用法

    最简单的形式:
    import urllib2
    response=urllib2.urlopen('http://www.douban.com')
    html=response.read()
    实际步骤:
    1、urllib2.Request()的功能是构造一个请求信息,返回的req就是一个构造好的请求
    2、urllib2.urlopen()的功能是发送刚刚构造好的请求req,并返回一个文件类的对象response,包括了所有的返回信息。
    3、通过response.read()可以读取到response里面的html,通过response.info()可以读到一些额外的信息。

    如下:
    #!/usr/bin/env python
    import urllib2
    req = urllib2.Request("http://www.douban.com")
    response = urllib2.urlopen(req)
    html = response.read()
    print html

    添加header头信息
    有时会碰到服务器拒绝你的访问。这是为什么呢?问题出在请求中的头信息(header)。 有的服务端有洁癖,不喜欢程序来触摸它。这个时候需要将你的程序伪装成浏览器来发出请求。请求的方式就包含在header中。

    常见的情形:
    import urllib
    import urllib2
    url = 'http://www.someserver.com/cgi-bin/register.cgi'
    # 将user_agent写入头信息
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    values = {'name' : 'who','password':'123456'}
    headers = { 'User-Agent' : user_agent }
    data = urllib.urlencode(values)
    req = urllib2.Request(url, data, headers)
    response = urllib2.urlopen(req)
    the_page = response.read()

    或者:
    import urllib
    import urllib2
    url = 'http://www.someserver.com/cgi-bin/register.cgi'
    values = {'name' : 'who','password':'123456'}
    data = urllib.urlencode(values)
    req = urllib2.Request(url, data)
    # 添加user_agent头信息
    req.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')
    response = urllib2.urlopen(req)
    the_page = response.read()

    GET方法
    例如百度:
    百度是通过http://www.baidu.com/s?wd=XXX 来进行查询的,这样我们需要将{‘wd’:’xxx’}这个字典进行urlencode

    代码:
    #coding:utf-8
    import urllib
    import urllib2
    url = 'http://www.baidu.com/s'
    values = {'wd':'D_in'}
    data = urllib.urlencode(values)
    print data
    url2 = url+'?'+data
    response = urllib2.urlopen(url2)
    the_page = response.read()
    print the_page

    POST方法
    代码:
    import urllib
    import urllib2
    url = 'http://www.someserver.com/cgi-bin/register.cgi'
    # 将user_agent写入头信息
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    # post数据
    values = {'name' : 'who','password':'123456'}
    headers = { 'User-Agent' : user_agent }
    # 对post数据进行url编码
    data = urllib.urlencode(values)
    req = urllib2.Request(url, data, headers)
    the_page = urllib2.urlopen(req).read()

    urllib2带cookie的使用
    代码:
    #coding:utf-8
    import urllib2,urllib
    import cookielib
    url = r'http://www.someserver.com/ajaxLogin'
    #创建一个cj的cookie的容器
    cj = cookielib.CookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
    #将要POST出去的数据进行编码
    data = urllib.urlencode({"email":email,"password":pass})
    r = opener.open(url,data)
    print cj

    python3中urllib库和urilib2库合并成了urllib库。

    导入模块:
    import urllib
    import urllib2
    变成了
    import urllib.request

    urllib2中的方法使用:
    urllib2.urlopen()变成了urllib.request.urlopen()
    urllib2.Request()变成了urllib.request.Request()
    urllib2.URLError 变成了urllib.error.URLError

    而当你想使用urllib 带数据的post请求时,
    在python2中
    urllib.urlencode(data)
    而在python3中变成了
    urllib.parse.urlencode(data)

    Ps:

    1.有的时候会出现返回结果乱码的情况,一般是网页经过压缩导致的。
    这个时候要判断该网页是否经过压缩,如果经过压缩则先进行解压操作。

    import gzip
    import StringIO
    r = urllib2.urlopen(req).read()
    # 判断该网页是否经过压缩,如果经过压缩则先进行解压操作
    r = StringIO.StringIO(r)
    r = gzip.GzipFile(fileobj=r).read()

    done!

  • 相关阅读:
    Delphi Class of 类引用
    Class-reference types 类引用类型--快要失传的技术
    最简单的TabHost
    修改一些IntelliJ IDEA 11的设置,使Eclipse的使用者更容易上手(转)
    uva 10494
    uva748
    uva 465
    高精度
    uva 694
    uva414
  • 原文地址:https://www.cnblogs.com/zqifa/p/python-urllib-2.html
Copyright © 2020-2023  润新知