zoukankan      html  css  js  c++  java
  • 一、Python爬虫

    一、urllib2库介绍

    urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件。他以urlopen函数的形式提供了一个非常简单的接口。

    这是具有利用不同协议获取URLs的能力,他同样提供了一个比较复杂的接口来处理一般情况,例如:基础验证,cookies,代理和其他。

    它们通过handlers和openers的对象提供。

    二、urllib2库使用

    1、最简单:直接用urlopen函数打开URL获取HTML

    import urllib2
    response = urllib2.urlopen('http://www.cnblogs.com/xin-xin/p/4297852.html')
    html = response.read()

    2、使用Requset,将请求包装为request

    HTTP是基于请求和应答机制的--客户端提出请求,服务端提供应答。urllib2用一个Request对象来映射你提出的HTTP请求,在它最简单的使用形式中你将用你要请求的

    地址创建一个Request对象,通过调用urlopen并传入Request对象,将返回一个相关请求response对象,这个应答对象如同一个文件对象,所以你可以在Response中调用.read()。

    request=urllib2.Request('http://www.cnblogs.com/xin-xin/p/4297852.html')
    response=urllib2.urlopen(request)
    html=response.read()
    

    记得urllib2使用相同的接口处理所有的URL头。例如你可以像下面那样创建一个ftp请求。

    req = urllib2.Request('ftp://example.com/')

    在HTTP请求时,允许你做额外的两件事。首先是你能够发送data表单数据,其次你能够传送额外的关于数据或发送本身的信息("metadata")到服务器,此数据作为HTTP的"headers"来发送。

    3、包装Data数据 POST请求 带DATA

    url = 'http://www.cnblogs.com/xin-xin/p/4297852.html'
    values = {'name' : 'Michael Foord',
              'location' : 'pythontab',
              'language' : 'Python' }
    data = urllib.urlencode(values)
    req = urllib2.Request(url, data)
    response = urllib2.urlopen(req)
    the_page = response.read()

    4、包装Data数据 Get请求 把DataURL

    data['name'] = 'Somebody Here'
    data['location'] = 'pythontab'
    data['language'] = 'Python'
    url_values = urllib.urlencode(data)
    print url_values
    url = 'http://www.baidu.com'
    full_url = url + '?' + url_values
    data = urllib2.urlopen(full_url)

    关于 urlencode 和 urldecode

    http://blog.csdn.net/wuwenjunwwj/article/details/39522791

    5、Headers

    我们将在这里讨论特定的HTTP头,来说明怎样添加headers到你的HTTP请求。有一些站点不喜欢被程序(非人为访问)访问,或者发送不同版本的内容到不同的浏览器。默认的urllib2把自己作为“Python-urllib/x.y”(x和y是Python主版本和次版本号,例如Python-urllib/2.5),这个身份可能会让站点迷惑,或者干脆不工作。浏览器确认自己身份是通过User-Agent头,当你创建了一个请求对象,你可以给他一个包含头数据的字典。下面的例子发送跟上面一样的内容,但把自身模拟成Internet Explorer。

    爬虫3元素:URL Data 和 Header
    url = 
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers = { 'User-Agent' : user_agent }
    values = {'name' : 'Michael Foord',
              'location' : 'pythontab',
              'language' : 'Python' } 
    data = urllib.urlencode(values)
    req = urllib2.Request(url, data, headers)
    response = urllib2.urlopen(req)
    the_page = response.read()
    
    

    6、异常处理

    req = urllib2.Request('') 
    try: urllib2.urlopen(req) 
       except URLError, e: 
    print e.reason

    Handle Exceptions处理异常

    当urlopen不能够处理一个response时,产生urlError(不过通常的Python APIs异常如ValueError,TypeError等也会同时产生)。HTTPError是urlError的子类,通常在特定HTTP URLs中产生。

    URLError:通常,URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生。这种情况下,异常同样会带有"reason"属性,它是一个tuple,包含了一个错误号和一个错误信息。

    HTTPError:服务器上每一个HTTP 应答对象response包含一个数字"状态码"。有时状态码指出服务器无法完成请求。默认的处理器会为你处理一部分这种应答(例如:假如response是一个"重定向",需要客户端从别的地址获取文档。

    典型的错误包含"404"(页面无法找到),"403"(请求禁止),和"401"(带验证请求)。

    Wrapping it Up包装

    所以如果你想为HTTPError或URLError做准备,将有两个基本的办法。我则比较喜欢第二种。

    第一个:

    from urllib2 import Request, urlopen, URLError, HTTPError 
    req = Request(someurl) 
    try: 
        response = urlopen(req) 
    except HTTPError, e: 
        print 'The server couldn/'t fulfill the request.' 
        print 'Error code: ', e.code 
    except URLError, e: 
        print 'We failed to reach a server.' 
        print 'Reason: ', e.reason 
    else: 
        # everything is fine


    注意:except HTTPError 必须在第一个,否则except URLError将同样接受到HTTPError。 

    第二个:

    from urllib2 import Request, urlopen, URLError 
    req = Request(someurl) 
    try: 
        response = urlopen(req) 
    except URLError, e: 
        if hasattr(e, 'reason'): 
            print 'We failed to reach a server.' 
            print 'Reason: ', e.reason 
        elif hasattr(e, 'code'): 
            print 'The server couldn/'t fulfill the request.' 
            print 'Error code: ', e.code 
    else: 
        # everything is fine

    7、Info & GetUrl

    urlopen返回的应答对象response(或者HTTPError实例)有两个很有用的方法info()和geturl()

    geturl -- 这个返回获取的真实的URL,这个很有用,因为urlopen(或者opener对象使用的)或许会有重定向。获取的URL或许跟请求URL不同。

    info -- 这个返回对象的字典对象,该字典描述了获取的页面情况。通常是服务器发送的特定头headers。目前是httplib.HTTPMessage 实例。

    8、没看懂

    Openers和Handlers
    当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例,urllib2.OpenerDirector可能名字可能有点让人混淆。)正常情况下,我们
    使用默认opener -- 通过urlopen,但你能够创建个性的openers,Openers使用处理器handlers,所有的“繁重”工作由handlers处理。每个handlers知道
    如何通过特定协议打开URLs,或者如何处理URL打开时的各个方面,例如HTTP重定向或者HTTP cookies。
    如果你希望用特定处理器获取URLs你会想创建一个openers,例如获取一个能处理cookie的opener,或者获取一个不重定向的opener。
    要创建一个 opener,实例化一个OpenerDirector,然后调用不断调用.add_handler(some_handler_instance).
    同样,可以使用build_opener,这是一个更加方便的函数,用来创建opener对象,他只需要一次函数调用。
    build_opener默认添加几个处理器,但提供快捷的方法来添加或更新默认处理器。
    其他的处理器handlers你或许会希望处理代理,验证,和其他常用但有点特殊的情况。
    install_opener 用来创建(全局)默认opener。这个表示调用urlopen将使用你安装的opener。
    Opener对象有一个open方法,该方法可以像urlopen函数那样直接用来获取urls:通常不必调用install_opener,除了为了方便。

    9、Basic Authentication 基本验证 没看看懂!!!!- - 

    HTTPBasicAuthHandler使用一个密码管理的对象来处理URLs和realms来映射用户名和密码。如果你知道realm(从服务器发送来的头里)是什么,你就能使用HTTPPasswordMgr。

    通常人们不关心realm是什么。那样的话,就能用方便的HTTPPasswordMgrWithDefaultRealm。这个将在你为URL指定一个默认的用户名和密码。这将在你为特定realm提供一个其他组合时

    得到提供。我们通过给realm参数指定None提供给add_password来指示这种情况。

    最高层次的URL是第一个要求验证的URL。你传给.add_password()更深层次的URLs将同样合适。

    10、Sockets and Layers

    Python支持获取网络资源是分层结构。urllib 使用http.client库,再调用socket库实现。

    在Python2.3你可以指定socket的等待回应超时时间。这个在需要获取网页的应用程序里很有用。默认的socket模型没有超时和挂起。现在,socket超时没有暴露

    给http.client或者urllib.request层。但你可以给所有的sockets设置全局的超时

        import socket
        timeout=10
        socket.setdefaulttimeout(timeout)
        # this call to urllib2.urlopen now uses the default timeout
        # we have set in the socket module
        req = urllib2.Request('http://www.voidsspace.org.uk')
        response = urllib2.urlopen(req)
  • 相关阅读:
    Fetch的使用
    if判断中的true和false
    分布式、微服务和集群的初步了解
    关于视频的知识点
    ajax请求
    jq的遍历关系元素方法集合
    docker安装Mysql
    设计模式系列之七大原则之——开闭原则
    设计模式系列之七大原则之——里式替换原则
    设计模式系列之七大原则之——依赖倒转原则
  • 原文地址:https://www.cnblogs.com/zzblee/p/5653263.html
Copyright © 2011-2022 走看看