搜索引擎学习笔记——定义URL类和Page类

来源:互联网 发布:某酒店2000w数据 编辑:程序博客网 时间:2024/05/18 00:20

1、定义URL类

TSE程序首先必须要做的一件事是根据一个给定的URL,组成消息体,发送给该URL指向的服务器。为此,定义Url类。
下面是URL类的定义,对应文件Url.h。

enum url_scheme{
       SCHEME_HTTP,
       SCHEME_FTP,
       SCHEME_INVALID
};
class CUrl
{
public:
        string   m_sUrl;                //URL字串
        enum url_scheme m_eScheme;      //协议名
        string  m_sHost;                //主机号
        int   m_nPort;                  //端口号
        string   m_sPath;               //请求资源
public:
        CUrl();
        ~CUrl();
        bool  ParseUrl(string strUrl);
private:
        void  ParseScheme (const  char *url);
};
URL可以是HTTP,FTP等协议开始的字符串,TSE主要是针对HTTP协议,为了不失一般性,在url_scheme 中定义了 SCHEME_HTTP,SCHEME_FTP,SCHEME_INVALID,分别对应HTTP协议,FTP协议和其他协议。一个URL由6部分组成:
<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>
除了scheme部分,其他部分可以不在URL中同时出现。
Scheme 表示协议名称,对应于URL类中的m_eScheme.
Net_loc 表示网络位置,包括主机名和端口号,对应于URL类中的m_sHost和m_nPort.
下面四个部分对应于URL类中的m_sPath.
Path  表示URL路径。
Params  表示对象参数。
Query  表示查询信息,也经常记为request。
Fragment  表示片断标识。

为了程序的简化,URL类的实现主要是解析出net_loc部分,用于组成消息体,发送给服务器。
其中 void CUrl::ParseUrlEx(const char * url,char *protocol, int lprotocol,char * host,int lhost, char *request,int lrequest,int *port)
执行具体的字符串匹配找出协议名,主机名,请求信息和端口号,找到后赋给Url类的成员变量保存。在URL类中还有些是TSE抓取过程中的细节函数,如char *CUrl::GetIpByHost(const char *host),CUrl::IsValidHost(const char *host),bool CUrl::IsVisitedUrl(const char *url)等,此处不就一一介绍了。

2、定义Page类

有了URL,搜集系统就可以按照URL标识抓取其所对应的网页,网页信息保存在Page类中。
下面是Page类的定义,对应文件Page.h。

class Cpage
{
public:
         string  m_sUrl;

          //网页头信息
         string m_sHeader;
         int m_nLenHeader;

         int  m_nStatusCode;
         int  m_nContentLength;
         string m_sLocation;
         bool  m_bConnectionState;    //如果连接关闭,是false,否则是true
         string m_sContentEncoding;
         string m_sContentType;
         string  m_sCharset;
        string   m_sTransferEncoding;
 
        //网页体信息
          string  m_sContent;
          int m_nLenContent;
          string m_sContentNoTags;
    
         //link,in a lash-up state
         string m_sContentLinkInfo;

         //为搜索引擎准备的链接,in a lash-up state
         string  m_sLinkInfo4SE;
          int m_nLenLinkInfo4SE;

          //为历史存档准备的链接,in a lash-up state
           string m_sLinkInfo4History;
           int m_nLenLinkInfo4History;

         //为搜索准备的链接,in a good state
          RefLink4SE m_RefLink4SE[MAX_URL_REFERECES];
          int m_nRefLink4SENum;

        //为历史存档准备的链接,in a good state
          RefLink4History m_RefLink4History[MAX_URL_REFERENCES/2];
          int m_nRefLink4HistoryNum;

        
         map<string,string>m_mapLink4SE;
         vector<string>m_vecLink4History;

       
        enum page_type m_eType;
public:
       Cpage();
       CPage::CPage(string strUrl,string strLocation,char *header,char *body, int nLenBody);
       ~CPage();
       void ParseHeaderInfo(string header);             //解析网页头信息
       bool  ParseHyperLinks();                         //从网页体中解析链接信息

         
       bool  NormalizeUrl(string& strUrl);
       bool  IsFilterLink(string plink);
private:
        //解析网页头信息
         void GetStatusCode(string header);
         void GetContentLength(string header);
         void GetConnectionState(string header);
         void GetLocation(string header);
         void GetCharset(string header);
         void GetContentEncoding(string header);
         void GetContentType(string header);
         void GetTransferEncoding(string header);


           //从网页体中解析链接信息
          bool GetContentLinkInfo();
          bool GetLinkInfo4SE();
          bool GetLinkInfo4History();
          bool FindRefLink4SE();
          bool FindRefLink4history();
};
一个网页是以URL作为标识的,所以Page类的第一个成员变量是m_sUrl。Page类主要完成两个任务:解析网页头信息和提取连接信息。
解析网页头信息包括获得状态码 m_nStatusCode,网页体长度m_nContentLength (内容字节数),转向信息m_sLocation,连接状态(如果没有关闭,下次请求同一个网站可以重新利用已建立好的socket,节约资源),网页体编码m_sContentEncoding(如果是gzip编码,要解压缩,然后提取链接信息。现在门户网站的首页有增大的趋势,为了加快传输速度,通常采用gzip编码压缩后传输),网页类型 m_sContentType,网页体字符集 m_sCharset,和传输编码方式 m_sTransferEncoding.
提取链接信息,是从获得的网页体中,根据HTML的规定,提取出链接信息和相应的链接描述信息,形成网页结构库,扩充URL库。在TSE中对于网页内容的链接提取区分了搜索引擎提取和为历史网页存档提取两种。因为对于通常意义下的搜索引擎而言,图片链接,网页格式链接是没有用处的,如果不区分开,会增加程序运行的负担,增肌存储空间。而且区分开后,可以单独保存下来,便于以后单独搜集这些信息。

原创粉丝点击