gimmesilver's blog

Agbird.egloos.com

포토로그



여러분의 robots.txt 는 안녕하십니까? 기타등등

 혹시 robots.txt가 무엇인지 모르시는 분은 다음 링크를 참고 바랍니다. 

http://korea.internet.com/channel/content.asp?kid=17&cid=175&nid=1544
http://www.eznetsol.com/site/bbs_view.php?code=data&idx=9&page=1

 여하튼 이 robots.txt는 비록 강제 규격은 아니지만 대부분의 웹 로봇은 이 표준을 준수하고 있습니다. 그런데 크롤링을 해보면 잘못된 형식의 robots.txt 가 너무 많더군요. 여기 몇 가지 예를 들어 보겠습니다.(이 예들은 실제 사이트들에서 수집한 내용입니다.)

예1)
// All Web Search Engine 에 대한 페이지 자동추출 방지
User-agent: *
 
// 거부 디렉토리
Disallow: /

 빨간색 부분이 잘못되었습니다. 아마도 주석 처리를 한 것일텐데 robots.txt 규격에서 한줄 주석은 // 가 아니라 # 입니다.

예2)
User-Agent : Googlebot, Disallow : /_ver2006
User-Agent : Googlebot, Disallow : /bbs
User-Agent : Googlebot, Disallow : /board
User-Agent : Googlebot, Disallow : /board2003
User-Agent : Googlebot, Disallow : /default
User-Agent : Googlebot, Disallow : /doc
User-Agent : Googlebot, Disallow : /enter2002
User-Agent : Googlebot, Disallow : /food
User-Agent : Googlebot, Disallow : /food2
User-Agent : Googlebot, Disallow : /gong
User-Agent : Googlebot, Disallow : /gong2002
User-Agent : Googlebot, Disallow : /gong2003
User-Agent : Googlebot, Disallow : /guest
User-Agent : Googlebot, Disallow : /images
User-Agent : Googlebot, Disallow : /login
User-Agent : Googlebot, Disallow : /menu
User-Agent : Googlebot, Disallow : /money
User-Agent : Googlebot, Disallow : /poll
User-Agent : Googlebot, Disallow : /prog2003
User-Agent : Googlebot, Disallow : /qm2
User-Agent : Googlebot, Disallow : /room
User-Agent : Googlebot, Disallow : /security
User-Agent : Googlebot, Disallow : /temp
User-Agent : Googlebot, Disallow : /update
User-Agent : Googlebot, Disallow : /upload_del
User-Agent : Googlebot, Disallow : /

 구글봇에 무슨 원수가 졌는지 주저리 주저리 많이도 막아놨습니다만 안타깝게도 저 경로들은 모두 크롤링 대상이 됩니다. 왜냐하면 robots.txt 표준에는 한 줄에 여러 개의 레코드를 기술할 수 있도록 정의되어 있지 않기 때문입니다. 심지어 좀 더 엄중히 따지자면 User-Agent 나 Disallow 같은 필드명과 콜론(:) 사이에는 공백이 없어야 합니다.
 어쨌든 관용을 가지고 해석을 한다 하더라도 저 문서는 'Googlebot, Disallow : '로 시작하는 30개의 웹 크롤러를 정의해놓은 것이 됩니다. 그러므로 원래 의도대로라면 아래와 같이 해야 합니다.
User-Agent: Googlebot
Disallow: /_ver2006
Disallow: /bbs
...

예3)
User-agent : *
Disallow : *

아마도 위 문서를 정의한 사이트 관리자의 의도는 모든 크롤러에 대해서 모든 문서 수집을 막겠다는 것이였으리라 생각합니다.  그러나 저 문서는 이전 예와 마찬가지로 필드명과 콜론 사이에 공백이 있는 점이 잘못되었으며, User-agent 필드에서는 * 가 모든 웹 로봇을 의미하지만 Disallow 나 Allow 필드에 *(와일드카드) 표시를 하는 것은 모든 경로를 의미하지 않기 때문에 의도와 다르게 동작합니다. 즉, 저 문서가 의미하는 것은 모든 웹 로봇에 대해서 *로 시작하는 경로나 파일에 대한 접근을 막겠다는 뜻입니다. 원래 의도대로라면 아래와 같이 했어야 합니다.
User-agent: *
Disallow: /

예4)
User-agent: ia_archiver
User-agent: Mozilla/4.0 (compatible; Empas/0.9)
User-agent: Googlebot
Allow: /
Allow: /node/
Disallow: /taxomony/
Disallow: /tagadelic/
Disallow: /tracker/
Disallow: /ktracker/

 위 문서는 유명한 리눅스 커뮤니티의 robots.txt 내용 중 일부입니다. 역시 명성에 걸맞게 대부분의 사이트와는 달리 robots.txt 가 굉장히 꼼꼼하게 잘 정리되어 있습니다. 그러나 아쉽게도 위 내용은 비록 문법적으로는 하자가 없습니다만 의미적으로는 오류가 있습니다. 아마도 사이트 관리자의 의도는 ia_archiver, empas/0.9, googlebot 에 대해서 /taxomony/, /tagadelic/, /tracker/, /ktracker/ 로 시작하는 경로에 대해서는 문서 수집을 막고 그 외의 경로는 수집을 허용하려는 것이라 생각합니다. 하지만 실제 표준대로라면 위 문서는 모든 경로에 대한 문서 수집을 허용하고 있습니다.
 왜냐하면 robots.txt 표준에는 웹 로봇이 robots.txt 의 내용을 위에서부터 순서대로 확인하면서 가장 처음에 일치되는 패턴을 따르도록 정의되어 있습니다. 그런데 저 문서의 가장 처음에 있는 수집 룰은 Allow: / 이며 이것은 모든 문서에 대해 수집을 허용하는 것을 의미합니다. 아마도 웹 로봇은 처음 일치되는 룰에 의해 모든 문서를 수집할 것입니다. 따라서 수집룰을 입력할때는 하위경로에서부터 상위 경로 순서로 입력해야 합니다. 위 문서를 올바르게 수정하면 아래와 같습니다.

User-agent: ia_archiver
User-agent: Mozilla/4.0 (compatible; Empas/0.9)
User-agent: Googlebot
Disallow: /taxomony/
Disallow: /tagadelic/
Disallow: /tracker/
Disallow: /ktracker/
Allow: /node/     # 사실 이건 아~무 의미 없음...
Allow: /

비슷하게 아래 문서도 잘못되었습니다.

예5)
User-agent: *
Disallow: /

User-Agent:MSIECrawler
Disallow: /

User-Agent 필드 역시 먼저 매칭되는 것에 따르기 때문에 User-agent: * 에 해당하는 룰은 가장 아래쪽에 위치해야 합니다.

 잘된 robots.txt 의 예를 하나 든다면 http://slashdot.org/robots.txt 가 있습니다. 웹 로봇 별로 꼼꼼하게 잘 정리해서 정의해 놨더군요...

 robots.txt 가 강제 규격이 아니기 때문이겠지만 그래도 robots.txt 를 수집하다보면 잘못 정의된 사례가 굉장히 많습니다. robots.txt 를 크롤하면 메인 페이지가 크롤되는 경우도 상당히 많구요.(아마 없는 문서 요청 시 리다이렉트 처리가 되기 때문이라 생각됩니다만...) 어쨌든 어차피 피해입는 사람은 사이트 관리자 본인이므로 조금만 신경을 써서 관리한다면 좋겠다는 생각입니다.(사실 제가 이것 저것 예외 처리하기 힘들어요...ㅜㅡ)

 참고로 robots.txt 표준은 http://www.robotstxt.org 에서 확인하실 수 있습니다.

덧글

  • 지민아빠 2007/09/07 10:24 # 삭제 답글

    앗 참 자세하게정리해 놓으셨군요. ㅎㅎ
  • silverbird 2007/09/08 14:36 # 답글

    // 지민아빠
    그냥 이런 저런 예외 케이스를 정리하다보니...^^
  • 김민수 2007/09/17 03:14 # 삭제 답글

    근데 로봇규약은 법적강제가 아니니 서로 너무 각자 지키는거 같습니다.

    한쪽은 지키고 한쪽은 안지키고..

    내건 가져가지 말라고 하지만 상대방껀 갖고가는..

    국내 포탈들이 대표적이니..
  • silverbird 2007/09/18 00:05 # 답글

    // 김민수
    포탈의 배타적인 robots.txt 규칙은 뭐 정책상의 문제니 다른 문제이고...
    그냥 표준 문법이나 잘 지켰으면 좋겠습니다...^^
  • Frank 2007/10/03 14:37 # 삭제 답글

    좋은 글 잘 읽고 갑니다.
    아무 생각 없이 robots.txt를 작성했었는데 덕분에 이제껏 만들었던 robots.txt를 다시 한번 훑어봤습니다.
    정말 알기 쉽게 잘 정리해 주셨군요 :)
  • silverbird 2007/10/06 10:33 # 답글

    // Frank
    감사합니다...
  • 별가지 2011/03/16 11:27 # 삭제 답글

    좋은글 감사합니다
    주소 담아 가겠습니다
  • 휴먼 2013/04/15 01:28 # 답글

    좋은 글 잘 보았습니다.
    수준 높은 내용, 유익하고 소중한 글입니다.
    스크랩해가서 출처 링크 덧붙여서 간직하겠습니다.
    감사합니다.
댓글 입력 영역