[wbia 1.5] 根据获得的链接关系,计算抓取的覆盖率

  [wbia 1.4]中记录了如何得到链接关系的文件,那么从这个文件中可以轻松得到所有的url。评测抓取覆盖率的基本思想也很简单。假设我抓取的网页数为X,网页总数为N,那么覆盖率即为X/N。但是由于无法得到这个N,所以我们需要用取样的方法。从网页集合中随机取样,假设取样总数为n,这n中有x个网页在我们的抓取集合中有,那么,我们的覆盖率即为x/n。取样可以找不同的抓取过程得到的结果。我从同学那里索要了另一份Url链接关系,进行简单的处理后,作为上文说的随机取样结果进行覆盖率的计算。代码如下:

#include <iostream>
#include <fstream>
#include <time.h>
#include <set>
using namespace std;

set<string> myUrls;
set<string> otherUrls;

string nowTime()
{
    char outTime[64];
    time_t t = time(0);
    strftime(outTime, sizeof(outTime), "%Y/%m/%d %X", localtime(&t));
    return outTime;
}

bool isUseless(string urlStr)
{
        return urlStr.substr(urlStr.size()-4)==".css"||urlStr.substr(urlStr.size()-4)==".txt"||urlStr.substr(urlStr.size()-3)==".js";
}

int main()
{
        ifstream myIn("myLinkMap.txt");
        ifstream otherIn("otherLinkMap.txt");
        string urlStr;
        cout<<nowTime()<<": begin init my urls."<<endl;
        while(myIn>>urlStr)
        {
                if(isUseless(urlStr)) continue;
                myUrls.insert(urlStr);
        }
        cout<<nowTime()<<": begin init other's urls."<<endl;
        while(otherIn>>urlStr)
        {
                if(isUseless(urlStr)) continue;
                otherUrls.insert(urlStr);
        }
        int all=0, exist=0;

        cout<<nowTime()<<": begin calculate coverage."<<endl;
        for(set<string>::iterator it=otherUrls.begin();it!=otherUrls.end();it++)
        {
            all++;
            if(myUrls.find(*it)!=myUrls.end()) exist++;
        }
        cout<<"The coverage is "<<double(exist)/all*100<<"%"<<endl;
        return 0;
}

计算完成后,发现覆盖率为40.0702%,并没有想象中的那么高,仔细观察之后,总结了以下三个可能的原因。

1. 同学的结果中有很多的图片、doc、ppt等资源,而由于我在抓取过程中在Module中限制了文件类型,所以无法得到这部分内容。

2. 抓取边界不明,毕竟不是抓取全网,那么哪些网页属于深研院,哪些不属于,定义可能有所差异,他可能多抓了些我认为不属于深研院的网站。

3. 抓取的时间可能还有些短,有很多网页还没有抓取到。

由此看,覆盖率为这样一个值应该也算正常。下篇介绍Pagerank如何进行计算。

posted on 2012-04-16 16:51  liugoodness  阅读(608)  评论(0编辑  收藏  举报

导航