jake1036

larbin源码分析(十) IpSite站点的抽象类

              IpSite站点的抽象类

 一 该类的功能
     NamedSite中的类经过dns请求之后,就会将站点名转换为ip,然后将url transfer到Ipsite中,由Ipsite具体完成爬虫工作。
 二 类的具体成员参数
        time_t lastAccess; //该IP最后获取的时间
        bool isInFifo;         //当该对象完成了一次fetch之后,将其加入到oksites中,并将其置为true,或者将一个url加入进fifo中
        url *getUrl ();       //获取队列中的 url对象
        IPSite ();
        ~IPSite (); 
        Fifo<url> tab;      //队列中进行爬取的url列表
         int fetch ();        //具体执行爬取

   三 具体函数实现
       (1) 构造函数IPSite() 函数的具体实现为 lastAccess = 0 ; isInFifo = false ;
       (2)IPSite::putUrl (url *u) 
           将url放入IPSite的fifo队列中,然后将isInFifo设置为true。如果lastAccess+waitDuration <= now
           以及当期存在空闲的连接,则可以 调用fetch以进行爬取网页。
           否则将该IpSite加入进okSites中。
      (3)inline url *IPSite::getUrl ()  从fifo中获取一个url
       (4) fetch() 函数,用以爬取网页
             Connexion *conn = global::freeConns->get(); //首先获取一个空闲的连接
             url *u = getUrl();                                          //获取一个url
             char res = getFds(conn, &(u->addr), u->getPort()); //然后根据url建立一个连接
              if (res != emptyC) {       //下面则为一个具体发送http报文请求的过程
                lastAccess = global::now;
               conn->timeout = timeoutPage;
              conn->request.addString("GET ");
        if (global::proxyAddr != NULL) {
          char *tmp = u->getUrl();
          conn->request.addString(tmp);
        } else {
          conn->request.addString(u->getFile());
        }
        conn->request.addString(" HTTP/1.0\r\nHost: ");
        conn->request.addString(u->getHost());
#ifdef COOKIES
        if (u->cookie != NULL) {
          conn->request.addString("\r\nCookie: ");
          conn->request.addString(u->cookie);
        }
#endif // COOKIES
        conn->request.addString(global::headers);
        conn->parser = new html (u, conn); //建立页面解析类
        conn->pos = 0;                              //获取的数据中的下标位置 ,pos
        conn->err = success;
        conn->state = res;
        if (tab.isEmpty()) {
          isInFifo = false;
        } else {
          global::okSites->put(this);
        }
        return 0;
      }
   下面附带上一次http请求的头部的格式
  

GET /index.html HTTP/1.1

Accept:text/html

User-Agent:larbin

Host: ioa.rising.com.cn

Fromjiangzy@rising.com.cn


  四 总结:
       该类IpSite主要用来向http服务器发送连接请求,并构建出对应的文件解析类html,存储在conn中。


posted on 2011-06-16 14:13 kahn 阅读(533) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理