返回首页 我的新博客

Robots.txt 协议—百度之星

题目描述

搜 索引擎是靠 Web Robot (又称 Spider )来收集互联网上浩如烟海的网页的。 Spider 就像一个旅行家一般,不知疲倦地奔波于万维网的空间,将遇到的页面收集下来供搜索引擎索引。对于一个网站的管理员来说,如果希望搜索引擎只收录自己指定的 内容,或者指定某些不希望搜索引擎访问的内容,该如何去做呢?他需要的就是 Robots Exclusion Protocol 协议,这里简单的称它做 Robots.txt 协议。

Robots.txt 是一个放置在网站根目录下的纯文本文件。举例来说,当 Spider 访问一个网站(比如 http://www.example.com )时,首先会检查该网站中是否存在 http://www. example.com/robots.txt 这个文件,如果 Spider 找到这个文件,它就会根据这个文件的内容,来确定它访问权限的范围。

www.robotstxt.org 是 robots.txt 协议的 Home Page ,在这个站点上你可以找到很多 robots.txt 协议相关的资料。 Robots.txt 协议在 http://www.robotstxt.org/wc/norobots.html 上有比较详尽的描述。

你的任务就是编写 Spider 中的一个逻辑单元,这个单元的作用就是来判断一个网站的一些 URL 是否被禁止抓取。对方网站的站点在这里假设是 www.example.com , 这个 Spider 的 User-agent 当然是 Baiduspider 。注意,这个逻辑单元除了本身的判断逻辑要求与 robots.txt 协议一致外,还要注意容错的问题。互联网上纷繁芜杂,会出现很多意想不到的错误。如何能够对一个对错参半的 robots.txt 进行解析,把其中正确的挑拣出来、把错误的部分忽略掉,也是一个不小的挑战哦。都会遇到什么错误?在开始爬行互联网之前,谁都不知道。

 

输入格式

第一行是一个正整数 m ,表示 robots.txt 文件的行数,后面跟 m 行,是 robots.txt 的全文。下一行包含一个正整数 n , 表示 URL 的行数,后面跟 n 行 URL ,这个就是你要判断的 URL 的列表。

 

输出格式

每条 URL 输出一行,每行两列,第一列是一个数字,如果这条 URL 被禁止,则输出 0 ,否则输出 1 。第二列是这条 URL 本身。

 

输入样例

2

User-agent: *

Disallow: /tmp/

2

http://www.example.com/index.html

http://www.example.com/tmp/somepage.html

 

输出样例

1 http://www.example.com/index.html

0 http://www.example.com/tmp/somepage.html

 

评分方法

本题包含 20 组数据,均满足 0<=n,m<=100 。

 

 

这个题看上去简单,但是不容易考虑周全,robots.txt中可能有很多陷阱,当然我也没有心思去考虑周全,本来开始是读取文件的,后来认真读题发现是标准输入,又改了下,大致程序如下,只对正确的格式作出判断,有错误的地方以及多个robots就没办法了:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <map>

using namespace std;

int main(int argc, char *argv[])
{
    string s = "\n";
    vector<string> v;
    //ifstream fin("Robots.txt");

    int i;
    cin>>i;
    string first, second;
    int count = 0;
    while (count<i)
    {
        cin>>first>>second;
        if (first.find("Disallow")==0)
        {
            v.push_back(second);
            //cout<<"disallow: "<<word<<endl;
        }
        getline(cin, s);
        //cout<<s<<endl;
        count++;
    }
    count = 0;
    cin>>i;
    //cout<<i<<endl;
    vector<string> hv;
    string http;
    while (count<i)
    {
        cin>>http;
        hv.push_back(http);
        count++;
    }
    for (vector<string>::iterator h=hv.begin();h!=hv.end();++h )
    {
        int b = 1;
        for(vector<string>::iterator i=v.begin();i!=v.end();++i)
        {
            if((*h).find(*i)!=string::npos)
            {
                b = 0;
                break;
            }
        }
        cout<<b<<" "<<*h<<endl;
    }
   
       
       
    return 0;
}

对于如下的简单robots是没有问题的:

2
User-agent: *
Disallow: /tmp/
5
http://www.example.com/index.html
http://www.example.com/tmp/somepage.html
http://www.example.com/index.html
http://www.example.com/tmp/somepage.html
http://www.example.com/index.html

posted @ 2009-05-15 21:24  buffer的blogs  阅读(252)  评论(0编辑  收藏  举报