搜索引擎学习笔记——定义URL类和Page类
来源:互联网 发布:某酒店2000w数据 编辑:程序博客网 时间:2024/05/18 00:20
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中对于网页内容的链接提取区分了搜索引擎提取和为历史网页存档提取两种。因为对于通常意义下的搜索引擎而言,图片链接,网页格式链接是没有用处的,如果不区分开,会增加程序运行的负担,增肌存储空间。而且区分开后,可以单独保存下来,便于以后单独搜集这些信息。
- 搜索引擎学习笔记——定义URL类和Page类
- TSE-定义Page类
- 搜索引擎学习笔记——数据处理和天网格式
- URL类学习笔记
- jsp学习笔记——Page命令
- 搜索引擎-信息检索实践—page rank
- 《从零开始学Swift》学习笔记(Day 25)——类和结构体定义
- 《从零开始学Swift》学习笔记(Day 25)——类和结构体定义
- java Url类学习笔记
- ASP.NET学习笔记(17)--Page类详解和Application对象
- TSE-定义URL类
- Java学习笔记8 —— Java的类定义
- C#学习笔记-定义类
- C++ Primer学习笔记——变量声明和定义
- C++ Primer学习笔记:类定义和使用
- c++ primer 学习笔记:类之类的声明和定义
- Python学习笔记2:类的定义和继承
- python学习笔记(二)--语法和类基本定义
- 搜索引擎学习笔记-第二章 Web搜索引擎工作原理和体系结构
- 最笨的孩子去读书【转】
- sublime text3 快捷键
- 刀片服务器的春天将何时到来?【转】
- 搜索引擎学习笔记——第三章 Web 信息的搜集
- 搜索引擎学习笔记——定义URL类和Page类
- Android 动画浅谈
- 搜索引擎学习笔记——与服务器建立连接
- 基于讯飞语音,百度语音,图灵机器人树莓派的智能语音机器人毕业设计第三天
- 太聪明了也不好
- 现在笔记本啥行情?
- 外国的小说好晦涩啊!
- 搜索引擎学习笔记——数据处理和天网格式
- C++的属性指示符