본문 바로가기

Programming/Python Web Crawler for intermediate learners

Web Crawler 012 - Domain Name Parsing - 도메인 네임 파싱하기.


안녕하세요. 이번 시간에는 크롤러가 어느 웹사이트를 크롤링 할지를 정해주는 도메인 네임에 대해 알아보고자 합니다. 인터넷은 참으로 광범위한 공간이죠. 만약 이러한 공간을 특별한 조건없이 크롤링하게 한다고 하면 어떻게 될까요? 아마도 내 컴퓨터의 모든 자원은 전세계 인터넷을 뒤지고 다니느라 바빠질 것입니다. 이러한 무한 루프를 방지하기 위해서는 특정한 조건을 주어 이 범위를 만족하는 사이트들만 크롤링 하라고 명령을 내려야 할 것입니다. 그래서 필요한 것이 도메인 네임입니다. 


제 블로그를 기준으로 얘기를 하자면, 여기의 주소는 https://creativeworks.tistory.com 입니다. 여기에서 도메인 네임은 tistory.com 이 됩니다. 만약 tistory.com 을 제가 혼자 다 사용하고 있다면, 전체를 크롤링하는데 큰 제약이 없을 것입니다. 그러나 아시다시피 수 많은 사용자들이 각자의 아이디와 tistory.com 을 조합한 id.tistory.com 의 형태로 블로그를 운영중입니다. 그래서 전체 티스토리 블로그를 크롤링 하지 않기 위해서 도메인 네임에 자신의 블로그 주소만 크롤링하게 하는 조건을 하나 더 붙여줄 필요가 생깁니다.


언급하였듯이, 자신의 개인 웹사이트라면 도메인 네임만 규정해도 충분할 것입니다. 도메인 네임을 제한하지 않는다면...... 전세계를 유랑하겠죠? ^^;


글보다 코드로 얘기를 하겠습니다.


아래를 보시면 새로운 파이썬 파일을 만들어 주었습니다. domain.py 라고 하는 파일을 만들고 관련 모듈을 불러왔습니다. ▼

도메인 네임을 알아보려고 하는데 필요한 함수를 정의합니다. 받는 인자는 url 주소입니다. 

get_sub_domain_name 이라는 함수를 이용해서 콤마(.) 단위로 스플릿(나누기)를 하여 그 결과를 results 에 넣게 하였습니다. 이 get_sub_domain_name() 함수는 아래에서 다루어 줄 예정입니다. 

위에서 찾은 결과에서 결과 값에서 콤마를 기준으로 오른쪽 첫 번째와 두번째를 리턴하게 합니다. 예를 들자면, 'https://mail.google.com' 이라는 url 을 전달하면 google.com 값을 리턴하게 만드는 것입니다.

만약 오류가 발생한다면 '' 을 리턴하게 합니다. 

두 번째 함수는 도메인을 공유하는 블로그일 경우입니다. 여기 이 블로그와 같은 곳은 이 블로그 도메인 이름 함수를 사용하면 되겠죠. 방법은 위와 같습니다. 

설명은 상동입니다.

한가지 다른 점은, 오른쪽 첫 번째, 두 번째 뿐만 아니라 세번째 값까지 리턴하게 하는 것입니다. 블로그 주소는 ID + 도메인 네임이므로, ID 값까지 포함하게 하기 위함입니다. 'https://creativeworks.tistory.com' 이라고 한다면 creativeworks.tistory.com 까지 리턴을 하게 합니다. 

오류가 발생할 시에도 위와 같이 리턴값을 정해줍니다.

세 번째 함수는 get_sub_domain_name() 함수를 정의해 주도록 하겠습니다. 전달 인자 역시 url 주소입니다. 

try , except 을 사용해서 urlparse() 내장 메소드를 사용하고, network location 을 이용해서 그 값을 리턴하게 합니다. 

역시 오류가 발생하면 블랭크를 리턴하게 합니다. 

이제 제대로 구현이 되었는지, 테스트를 통해 알아보겠습니다. 아래 코드를 보면 프린트를 사용하여 다음(https://www.daum.net)의 url 을 전달하였습니다. 그 결과로 얻게 된 domain_name 은 daum.net 로 나오게 되었습니다. ▼

이번에는 개인 블로그를 대상으로 테스트를 진행해 보겠습니다. 아래와 같이 본 블로그 주소를 넣으니 블로그 아이디와 함께 도메인 네임이 표기되고 있네요. 테스트를 완료하였으니 프린트문을 삭제하시면 됩니다. 

위의 과정은 파이썬으로 크롤러를 만들었을 때, 크롤링 할 사이트의 범주를 정할 때 유용하게 사용할 수 있는 부분입니다. 보다 효율적인 코딩을 위해서 꼭 필요한 부분이라 할 수 있습니다.