Larbin源代码分析[10]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

From:jiangzy@rising.com.cn

posted on 2011-10-24 17:39  zhoulinhu  阅读(426)  评论(0编辑  收藏  举报

导航