zoukankan      html  css  js  c++  java
  • urllib2使用初探

      在入门urllib2之前,我想应该先调研一下urllib与urllib2的区别[1].首先我们要明白的是,这两个模块不可以相互替代.两者都是接受URL请求的模块,但是提供了不同的功能,两个显著的区别是:

    1. 对于一个URL的request,urllib2.urlopen可以接受一个request类的实例作为参数, 从而设置HTTP请求的headers; 而urllib却只可以接受一个URL,这意味着你用urllib不能伪装user agent字符串(伪装成浏览器请求).

    2. urllib提供了一个urlencode方法,用来产生GET请求字符串,而urllib2却没有提供这个函数,这也是我们还需要urllib来配合urllib2进行使用的原因之一.

      此外,urllib.urlretrieve和urllib.quote等一系列quote和unquote函数没有被假如到urllib2里面,因此也需要urllib的协助.

      还有一点需要注意的是: requests模块可能urllib2模块要好用,两者可能学一即可.

    1. urllib2.urlopen()函数的使用

      urllib2为我们提供了一个很基础的函数: urlopen(url[,data,[timeout]]), 来帮助我们通过给定的URL来获取网页数据(网页源代码), 返回该对象(从里面可以读数据); 参数url: 可以是包含url的字符串, 也可以是urllib2.Request类的实例. 参数data: 是经过编码的POST数据(可以使用urllib.urlencode()编码, 注意是urllib里面的函数). 参数timeout: 是可选的超时时间(单位秒), 供所有阻塞操作内部使用.

    import urllib2  # 
     
    url = 'https://www.zhihu.com/people/vihu'   # 待访问的url
    response = urllib2.urlopen(url)  # 请求访问/打开这个url
    urlContent = response.read()    # 读取内容

    读取的部分内容如下图所示:

    再看下面的代码, 得到的结果和上面是相同的. HTTP基于请求-应答的机制. 由主机发出请求(Request), 然后由服务器端提供应答(urlopen). urllib2.Request(url[,data][,headers][,origin_req_host][,unverifiable]), 参数url: 请求的网址; 参数data: POST data; 参数headers: 头部

    import urllib2
    
    url = 'https://www.zhihu.com/people/vihu'
    req = urllib2.Request(url)  # 创建一个请求对象
    response = urllib2.urlopen(req)  # 返回一个相关请求的response对象
    urlContent = response.read()

    2. Cookielib模块 

    cookielib主要用于提供可存储cookie的对象, 以便于urllib2模块进行配合来访问网页的数据. jar的中文翻译为"文件" 

                       CookieJar

                             |

                    FileCookieJar

                /                    

            MozillaCookieJar    LWPCookieJar

    1) CookieJar()

        管理HTTP cookie的值, 存储HTTP请求得到的cookie, 向传出的HTTP请求添加cookie对象.

    2) FileCookieJar

    3) MozilaCookieJar(filename, delayload=None, policy=None)

        Mozila的中文翻译为"浏览器", 创建于浏览器cookies.txt兼容的FileCookieJar实例.

    4) LWPCookieJar(filename, delayload=None, policy=None)

        创建与libwww-perl的Set-Cookie3文件格式相兼容的FileCookieJar实例.

    下面是从网上找到的登录人人网的代码:

    #! /usr/bin/env python
    #coding=utf-8
    import urllib2
    import urllib
    import cookielib
    # 你的用户名和登录密码
    data = {"email":"passbye@126.com","password":"123456"}
      
    # 生成的post_data为: password=123456&email=passbye%40126.com
    post_data = urllib.urlencode(data)
    # 用假如header,需要使用Request对象; 对有些header要注意,服务器会对其进行检查; 下面伪装成Microsoft IE 6.0 见[2]
    headers = {"User-agent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1"}
    # 发出请求
    req = urllib2.Request("http://www.renren.com/PLogin.do",post_data,headers)
    
    # 生成一个带cookie的opener, opener是urllib2.OpenerDirector的一个实例
    cj
    = cookielib.CookieJar() # 创建一个CookieJar, 还没有存Cookie handler = urllib2.HTTPCookieProcessor(cj) # 利用HTTPCookieProcessor对象来创建cookie处理器
    opener
    = urllib2.build_opener(handler) # 利用build_opener来创建opener

    # 这里的open方法和urlopen使用类似 content
    = opener.open(req) print content2.read().decode("utf-8").encode("gbk")

    headers: 两个词之间用 - 分隔.

    • User-agent: 有些服务器或者Proxy(代理)会通过该值来判断是否是浏览器发出的请求.(有的服务端拒绝程序来访问, 这时候需要将程序伪装成浏览器来访问, 请求的方式包含在header中). User-agent的中文名为用户代理, 是一个特殊字符串头, 使得服务器能够识别客户使用的操作系统及版本, CPU类型, 浏览器版本, 浏览器渲染引擎, 浏览器语言, 浏览器插件等等. Mozilla/Version (Platform; Encryption; 
    • Content-Type: 在使用REST接口时, 服务器会检查该值, 用来确定HTTP Body中的内容应该怎么解析! 常见的如: 'text/html','image/jpeg'等.

    post_data:

    个人信息(账号/密码)写在post_data里面, 键的命名要跟你你的网页来定义, 下面是人人网的, 用email, password关键词.

    参考: 

    [1] Python:difference between urllib and urllib2: http://www.hacksparrow.com/python-difference-between-urllib-and-urllib2.html

    [2] Python标准库urllib2使用细节(文章): http://zhuoqiang.me/python-urllib2-usage.html

    [3] 总结整理时下流行的浏览器User-Agent大全: http://www.360doc.com/content/12/1012/21/7662927_241124973.shtml

    [4] urllib-URL handling modules: https://docs.python.org/3/library/urllib.html

  • 相关阅读:
    jsf+ejb
    java CDI
    Android5.0新特性——阴影和剪裁(shadow)
    Android5.0新特性——图片和颜色(drawable)
    Android5.0新特性——全新的动画(animation)
    Android SDK Tools和Android SDK Platform-tools
    Android5.0新特性——Material Design简介
    emulator: ERROR: x86 emulation currently requires hardware acceleration!
    Android应用与系统安全防御
    JSON数据解析(转)
  • 原文地址:https://www.cnblogs.com/zhao441354231/p/5968699.html
Copyright © 2011-2022 走看看