zoukankan      html  css  js  c++  java
  • 用python零基础写爬虫--编写第一个网络爬虫

    首先要说明的是,一下代码是在python2.7版本下检测的

    一.最简单的爬虫程序 --下载网页

    import urllib2
    request=urllib2.Request("http://www.baidu.com")
    response = urllib2.urlopen(request)
    print response.read()
    怎么样,很简单吧。
    urllib2是python中的一个标准库,以上代码会抓取一个特定的网页并将抓取的网页返回。urllib2这个库的使用要多加研究,这个是使用的基础。

    1、urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件。他以urlopen函数的形式提供了一个非常简单的接口,这是具有利用不同协议获取URLs的能力;它同样提供了一个比较复杂的接口来处理一般情况,例如:基础验证,cookies,代理和其他,它们通过handlers和openers的对象提供。

    2、urllib2.urlopen(url, data=None, timeout=None)
      参数
        url:打开一个url,可以是字符串(如同urllib.urlopen的url参数),或是一个Request对象(这是special的地方)
        data:向服务器传送的额外数据,仅http请求会用到这个参数。当data不为None时,说明此Http请求是Post,而不是Get。这个参数与urllib2.Request类的构造函数的data参数相同,详见urllib2.Request。一般不会设定这个参数,需要时会在urllib2.Request的构造函数处设置
        timeout:设置超时的时间,类型是整型,单位是秒;如果超过指定时间仍未得到所请求服务器的响应(例如由于网络环境差等原因),则抛出异常,而不会无限制等待。适用于HTTP, HTTPS, FTP, FTPS
      返回值
        返回一个类似于文件描述符号(file-like)的对象,与urllib.urlopen的返回值相同,通过返回值也可以使用geturl()和info()。

    3、urllib2.Request类,一般使用方法是使用其构造函数得到一个Request对象:class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])
      表示一个URL请求
      参数
        url:一个URL字符串
        data:向服务器传送的额外数据,仅http请求会用到这个参数。当data不为None时,说明此Http请求是Post,而不是Get。其类型应为字符串,一般使用urllib.urlencode()对一个dict或tuple进行处理,得到该字符串。
        headers:请求头,类型是dict。除此之外,请求头可以在创建完Request对象后,通过该对象调用add_header(key, val)添加到对象中。常用方法是添加User-Agent请求头,冒充浏览器请求,用于哄篇服务器,因为一些服务器不允许程序访问。
        后两个参数一般用不到,不再介绍
      返回值
        一个Request对象

    4、urllib2.OpenerDirector类
      当你获取一个URL时,你需要使用一个opener(OpenerDirector)。正常情况下我们一直使用默认的opener,被urlopen使用,但你也可以创建自定义的openers。opener使用handler处理任务,所有的重活都交给这些handlers来做。每一个handler知道怎么以特定的url协议打开url,或者怎么处理打开url的某些方面,如,HTTP重定向,或者HTTP cookie。

    5、def urllib2.build_opener([handler, ...])
      创建一个OpenerDirector对象,可以包含多个handlers
      参数
        handler, ...:urllib2提供很多handler来处理不同的请求,常用的HTTPHandler,FTPHandler都比较好理解。这里提一下HTTPCookieProcessor,HTTPCookieProcessor是处理cookie的,在很多需要身份验证的请求中cookie是必不可少的,python中对cookie的操作是由cookielib模块来完成的,而这个handler只是调用了其方法,在request和response过程中将cookie加到请求中和把cookie从响应中解析出来。
      返回值
        OpenerDirector对象

    6、def urllib2.install_opener(opener)
      install_opener能设置一个全局opener对象,这意味着调用urlopen将会都用你刚安装的opener。
      参数
        opener:OpenerDirector对象

    7、urllib2.HTTPCookieProcessor类,通常使用其构造函数得到一个对象,即一个handler:class urllib2.HTTPCookieProcessor([cookiejar])
      参数
        cookiejar:一个cookielib.CookieJar对象,通过构造函数cookielib.CookieJar()得到
      返回值
        HTTPCookieProcessor对象,即一个handler

    二.捕获下载异常

    import urllib2
    def download(url):
    print 'downloading:',url
    try:
    html=urllib2.urlopen(url).read()
    except urllib2.URLError as e:
    print 'download error:', e.reason
    html=None
    return html
    download('http://httpstat,us/500')

    我们引入了urllib2标准库,并且定义了一个download函数 ,其中用到了 try/except 处理异常的语法。

    三.网页出错与重试下载

    import urllib2

    def download(url,num_retries=2):
    print 'downloading:',url
    try:
    html=urllib2.urlopen(url).read()
    except urllib2.URLError as e:
    print 'download error:', e.reason
    html=None
    if num_retries>0:
    if hasattr(e, 'code') and 500<=e.code<600:
    #recursively retry 5XX http errors
    return download(url, num_retries-1)
    return html

     

     

     

    下载时遇到的错误经常是临时性的,比如服务器过载时返回的503 Service Unavilable 错误等。

    一般来说4xx错误发生在请求存在问题时候,5xx错误发生在服务器存在问题时。所以我们只需要确保在发生5xx错误时候重新下载。

    1xx-信息提示
    这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1xx响应。
    100-继续。
    101-切换协议。
    2xx-成功
    这类状态代码表明服务器成功地接受了客户端请求。
    200-确定。客户端请求已成功。
    201-已创建。
    202-已接受。
    203-非权威性信息。
    204-无内容。
    205-重置内容。
    206-部分内容。
    3xx-重定向
    客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。
    301-对象已永久移走,即永久重定向。
    302-对象已临时移动。
    304-未修改。
    307-临时重定向。
    4xx-客户端错误
    发生错误,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。400-错误的请求。
    401-访问被拒绝。IIS定义了许多不同的401错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在IIS日志中显示:
    401.1-登录失败。
    401.2-服务器配置导致登录失败。
    401.3-由于ACL对资源的限制而未获得授权。
    401.4-筛选器授权失败。
    401.5-ISAPI/CGI应用程序授权失败。
    401.7–访问被Web服务器上的URL授权策略拒绝。这个错误代码为IIS6.0所专用。
    403-禁止访问:IIS定义了许多不同的403错误,它们指明更为具体的错误原因:
    403.1-执行访问被禁止。
    403.2-读访问被禁止。
    403.3-写访问被禁止。
    403.4-要求SSL。
    403.5-要求SSL128。
    403.6-IP地址被拒绝。
    403.7-要求客户端证书。
    403.8-站点访问被拒绝。
    403.9-用户数过多。
    403.10-配置无效。
    403.11-密码更改。
    403.12-拒绝访问映射表。
    403.13-客户端证书被吊销。
    403.14-拒绝目录列表。
    403.15-超出客户端访问许可。
    403.16-客户端证书不受信任或无效。
    403.17-客户端证书已过期或尚未生效。
    403.18-在当前的应用程序池中不能执行所请求的URL。这个错误代码为IIS6.0所专用。
    403.19-不能为这个应用程序池中的客户端执行CGI。这个错误代码为IIS6.0所专用。
    403.20-Passport登录失败。这个错误代码为IIS6.0所专用。
    404-未找到。
    404.0-(无)–没有找到文件或目录。
    404.1-无法在所请求的端口上访问Web站点。
    404.2-Web服务扩展锁定策略阻止本请求。
    404.3-MIME映射策略阻止本请求。
    405-用来访问本页面的HTTP谓词不被允许(方法不被允许)
    406-客户端浏览器不接受所请求页面的MIME类型。
    407-要求进行代理身份验证。
    412-前提条件失败。
    413–请求实体太大。
    414-请求URI太长。
    415–不支持的媒体类型。
    416–所请求的范围无法满足。
    417–执行失败。
    423–锁定的错误。
    5xx-服务器错误
    服务器由于遇到错误而不能完成该请求。
    500-内部服务器错误。
    500.12-应用程序正忙于在Web服务器上重新启动。
    500.13-Web服务器太忙。
    500.15-不允许直接请求Global.asa。
    500.16–UNC授权凭据不正确。这个错误代码为IIS6.0所专用。
    500.18–URL授权存储不能打开。这个错误代码为IIS6.0所专用。
    500.100-内部ASP错误。
    501-页眉值指定了未实现的配置。
    502-Web服务器用作网关或代理服务器时收到了无效响应。
    502.1-CGI应用程序超时。
    502.2-CGI应用程序出错。application.
    503-服务不可用。这个错误代码为IIS6.0所专用。
    504-网关超时。
    505-HTTP版本不受支持。

  • 相关阅读:
    编写安全检测脚本
    编写监控脚本
    编写一键部署软件脚本
    awk扩展应用
    sed基本用法
    字符串截取及切割,正则表达式,expect预期交互
    For,while,case,shell循环结构
    mybatis使用associaton进行分步查询
    mybatis中封装结果集常见示例
    Mybatis获取数据库自增主键
  • 原文地址:https://www.cnblogs.com/mrruning/p/7636261.html
Copyright © 2011-2022 走看看