Linux企業級專案實踐之網路爬蟲(29)——遵守robots.txt

尹成發表於2014-09-04

Robots協議(也稱為爬蟲協議、機器人協議等)的全稱是“網路爬蟲排除標準”(Robots Exclusion Protocol),網站通過Robots協議告訴搜尋引擎哪些頁面可以抓取,哪些頁面不能抓取。

robots.txt檔案是一個文字檔案。robots.txt是搜尋引擎中訪問網站的時候要檢視的第一個檔案。robots.txt檔案告訴蜘蛛程式在伺服器上什麼檔案是可以被檢視的。

當一個搜尋蜘蛛訪問一個站點時,它會首先檢查該站點根目錄下是否存在robots.txt,如果存在,搜尋機器人就會按照該檔案中的內容來確定訪問的範圍;如果該檔案不存在,所有的搜尋蜘蛛將能夠訪問網站上所有沒有被口令保護的頁面。百度官方建議,僅當您的網站包含不希望被搜尋引擎收錄的內容時,才需要使用robots.txt檔案。如果您希望搜尋引擎收錄網站上所有內容,請勿建立robots.txt檔案。

如果將網站視為酒店裡的一個房間,robots.txt就是主人在房間門口懸掛的“請勿打擾”或“歡迎打掃”的提示牌。這個檔案告訴來訪的搜尋引擎哪些房間可以進入和參觀,哪些房間因為存放貴重物品,或可能涉及住戶及訪客的隱私而不對搜尋引擎開放。但robots.txt不是命令,也不是防火牆,如同守門人無法阻止竊賊等惡意闖入者。

 

Robots協議用來告知搜尋引擎哪些頁面能被抓取,哪些頁面不能被抓取;可以遮蔽一些網站中比較大的檔案,如:圖片,音樂,視訊等,節省伺服器頻寬;可以遮蔽站點的一些死連結。方便搜尋引擎抓取網站內容;設定網站地圖連線,方便引導蜘蛛爬取頁面。

檔案寫法

 

User-agent: * 這裡的*代表的所有的搜尋引擎種類,*是一個萬用字元

Disallow: /admin/ 這裡定義是禁止爬尋admin目錄下面的目錄

Disallow: /require/ 這裡定義是禁止爬尋require目錄下面的目錄

Disallow: /ABC/ 這裡定義是禁止爬尋ABC目錄下面的目錄

Disallow: /cgi-bin/*.htm 禁止訪問/cgi-bin/目錄下的所有以".htm"為字尾的URL(包含子目錄)。

Disallow: /*?* 禁止訪問網站中所有包含問號(?) 的網址

Disallow: /.jpg$ 禁止抓取網頁所有的.jpg格式的圖片

Disallow:/ab/adc.html 禁止爬取ab資料夾下面的adc.html檔案。

Allow: /cgi-bin/ 這裡定義是允許爬尋cgi-bin目錄下面的目錄

Allow: /tmp 這裡定義是允許爬尋tmp的整個目錄

Allow: .htm$ 僅允許訪問以".htm"為字尾的URL。

Allow: .gif$ 允許抓取網頁和gif格式圖片

Sitemap: 網站地圖 告訴爬蟲這個頁面是網站地圖

 

 

 

 

//解析robots文字
void parseRobots()
{
   char key [32];
   char value [100];
   int i,j;
   int posl = 0, posm = 0 ,posr =0;
   int len = strlen(robotstxt);
   bool hasAgent = false;
 
   while(posl<len && posm<len && posr<len)
    {
       //找到第一個不為空格和換行符的字元位置,確定posl
       while(posl<len && (robotstxt[posl]==' '
                || robotstxt[posl]=='\n' ||robotstxt[posl]=='\r')) posl++;
       //以#開頭的,直接過濾掉該行
       if(robotstxt[posl]=='#')
       {
           while(posl<len && robotstxt[posl]!='\n') posl++;
           continue;
       }
       //找‘:’,確定posm
       posm = posl+1;
       while(posm<len && robotstxt[posm]!=':') posm++;
       //找換行符位置,確定posr
       posr = posm+1;
       while(posr<len && robotstxt[posr]!='\n') posr++;
 
       for(j=0,i=posl;i<posm;i++)
       {
           if(robotstxt[i]!=''&&robotstxt[i]!='\t'&&robotstxt[i]!='\r'&&robotstxt[i]!='\n')
                key[j++] = robotstxt[i];
       }
       key[j] = '\0';
       for(j=0,i=posm+1;i<posr;i++)
       {
           if(robotstxt[i]!=''&&robotstxt[i]!='\t'&&robotstxt[i]!='\r'&&robotstxt[i]!='\n')
                value[j++] = robotstxt[i];
       }
       value[j]='\0';
       posl = posr;
 
       if(strcmp(strlwr(key),"user-agent")==0){
           if(strcmp(value,"*")==0||strcmp(value,"webcrawler")==0)
           {
                hasAgent = true;
           }
           else hasAgent = false;
       }
       if(hasAgent)
       {
           int len_val = strlen(value);
           if(len_val<=0) continue;
           if(strcmp(strlwr(key),"disallow")==0 &&disallow_size<MAXDISALLOW)
           {
                disallow[disallow_size] = newchar [len_val+1];
               strcpy(disallow[disallow_size],strlwr(value));
                disallow_size++;
           }
           else if (strcmp(strlwr(key),"allow")==0 &&allow_size<MAXDISALLOW)
           {
                allow[allow_size] = new char[len_val+1];
               strcpy(allow[allow_size],strlwr(value));
                allow_size++;
           }
           else if(strcmp(strlwr(key),"craw-delay")==0)
           {
                crawldelay = 0;
                int len_val = strlen(value);
                for(int i=0;i<len_val;i++)
                {
                    crawldelay = crawldelay *10 + value[i]-'0';
                }
           }
       }
    }
}


相關文章