본문 바로가기

Programming/Python Web Crawler for intermediate learners

Web Crawler 005 - Parsing HTML and Find Links - HTML 파싱 및 링크 찾기.

이번 시간에는 HTML 을 파싱하고 웹페이지에서 링크들을 찾는 것 까지 다루어 보도록 하겠습니다.

우선 HTML을 파싱하기 위해 관련 모듈을 불러오겠습니다. ▼

urllib 에서 parse 도 불러오겠습니다. 

링크를 찾는 클래스를 정의해 주도록 하겠습니다. 

초기화를 아래와 같이 하고 HTMLParser를 종속하게 하였습니다. 

웹페이지에서 tag 를 다루는 함수를 정의하고 찾게 될 tag를 확인할 용도로 print() 하도록 하였습니다. 

에러는 아래와 같이 우선 정의해 주었습니다.

클래스 기초 정의는 끝났습니다. 그럼 이게 어떤 의미인지 알아보도록 하겠습니다. 


아래 코드를 보시면 finder 는 LinkFinder() 로부터 생성하였습니다.

그리고 웹페이지에서 찾을 태그가 feed() 안에 들어가게 되는데, 여기서는 기본적으로 이러한 태그값을 임의로 넣어주었습니다. 결과를 보시면 이해가 금방 갈 것입니다. ▼

상기 코드를 실행해 주면, 아래와 같이 태그 값들만 쭈~욱 프린트가 되어 나옵니다.

이제 이렇게 나오는 태그값을 어떻게 활용할지를 고민해야 합니다.


상기 코드를 아래와 같이 수정하겠습니다. 만약에 웹페이지에서 a 태그가 있으면 tag == a 라는 부분과 맞닥드리게 됩니다. 이는 a (링크) 태그입니다. HTML 에서 어떤 값들에 링크를 걸 때는  <a   href= "   URL   ">  사용자에게 보여지는 부분   </a>    , 이렇게 구성되어 있습니다.

즉, 여기서 a 는 태그명, href 는 attribute(우리말로는 속성(?)쯤 될겁니다.)이라고 합니다. 그리고 "   URL  "  값이 value 에 해당합니다.

이렇게 attribute 와 value 값은 attrs 에 이미 들어가 있습니다. 왜냐하면 HTMLParser로 파싱을 하면 이 값들을 이미 불러오기 때문입니다. 이제 이 값들을 적절하게 처리하여 얻고자 하는 데이터만 찾으면 됩니다. 

loop 을 돌려서 attrs 에서 attribute, value 값을 각각 반복합니다.▼ 

여기서 attribute 가 href 속성과 일치한다면, 

크롤링 할 URL 값을 얻을 수 있습니다. 그러나 여기에는 한가지 문제가 있습니다. 어떤 웹사이트는 절대경로 가령, 
https://creativeworks.tistory.com/265 와 같이 되어 있을 수 있습니다. 또 한가지 URL을 정의할 때 사용되는 상대경로, 여기서는 /265 인데, 이 값만 속성값을 가지고 있는 웹페이지들도 존재를 하고 있습니다. 

그래서 만약 절대경로를 사용하는 사이트라면 문제가 없겠지만, 상대경로를 사용하는 사이트라면 별도로 base_url 과 합쳐주는 과정이 필요합니다.

이 점을 해결하기 위해 아래 코드와 같이 url = parse.urljoin() 을 사용하여 기본 URL과 value 값을 합쳐주는 코드를 넣어주었습니다.▼

그리고 클래스의 초기화 부분에서 아래와 같이 수정을 하였습니다. base_url, page_url, 그리고 links 를 아래와 같이 넣어주었습니다.

이제 기본 URL 인 self.base_url 과 value 를 하나로 합치게 합니다. 만약 절대경로라면 같은 값이여서 괜찮고, 상대경로라면 두 값을 합쳐주어 절대 경로값을 url 에 넣어주게 됩니다. 이렇게 찾은 url 이 크롤링 할 link 값이 되는 것입니다.

이제 이렇게 찾은 url 값을 크롤링 할 links 에 넣어주게 하였습니다.

그리고 page_links 값을 반환하는 함수를 정의하였습니다. 


이제 기본적인 크롤링 부분은 마무리가 되어 갑니다. 수고하셨습니다.