본문 바로가기

Programming/Python Web Crawler for intermediate learners

Web Crawler 010 - Gather_Links 함수 만들기


이번 시간에는 앞 시간에서 코딩한 부분중 정의하지 못한 gather_links() 부분을 만들어 주도록 하겠습니다. 


웹페이지의 url 값을 넣어주면 해당 페이지에서 링크를 포함하고 있는 html 값을 찾게 되는데, 여기에서 링크 값만을 추출하게 하여 리스트에 넣어 주어야 그 값으로 링크들의 웹페이지를 다시 크롤링 할 수 있게 됩니다.


우선, 아래와 같이 정의를 해 주었습니다. ▼

여기에서 하나의 문제가 있는데, 파이썬에서 urlopen 모듈을 사용해서 웹페이지를 연결하면, 인간이 읽을 수 있는 형태의 문자를 받아 오는게 아니라, 컴퓨터(기계)가 이해할 수 있는 바이트(bytes: 0 or 1) 단위로 데이터를 가지고 옵니다. 질문을 주시는 많은 분들이 파이썬으로 크롤링할 때, 내가 지금 무엇을 크롤링하는지 혹은 웹페이지를 크롤링 하려고 하는데 html 태그값이 막힌 것 같다는 반응을 보이는데, 이는 바이트 형태로 데이터를 가지고 오기에 사람이 읽을 수 없을 뿐 해당 웹페이지의 거의(?) 모든 데이터를 이미 다 가지고 있습니다. 이를 잘 활용할 스킬(!)만 터득하면 되는 것입니다.


각설하고 다시 돌아가겠습니다.

그래서 인간이 읽을 수 있는 형태로 컨버팅을 해 주면 어떤 데이터가 있는지 확인할 수 있습니다. 고로 컨버팅을 해주기 위해서 아래와 같이 스트링 값으로 변환해 줄 변수 하나를 초기화 해 줍니다.▼ 


파이썬에서 네트웍을 이용할 경우에는 try, except 를 사용하는 것이 좋습니다. 예기치 못한 에러나, 오류로 부터 전체 코드가 먹통이 되는 것을 방지해 줄 수 있기 때문입니다.


그래서 아래와 같이 try: 형태로 사용을 하겠습니다.

해당 page_url 을 urlopen 으로 읽어와서 그 값을 response 변수에 저장을 합니다.▼

이 response 의 헤더값이 오른쪽의 값과 같다면 다음을 수행하게 합니다. ▼

response를 읽어들여 html_bytes 값에 넣어 줍니다.

그리고 그 값을 'utf-8' 을 이용해 decode 해 줍니다. 그 결과를 html_string 에 넣어주겠습니다.

이제 LinkFinder 의 Object 를 만들어 줍니다. LinkFinder Object 를 만들때 2개의 인자가 필요했었습니다. 앞 부분의 LinkFinder 클래스 코드를 참조하시면 됩니다. 

필요한 인자는 base_url, page_url 이었습니다. 그래서 여기에서는 홈페이지 url 값에 해당하는 Spider.base_url 을 넣어주고, 현재 크롤링 할 해당 url 에는 page_url 을 넣어 주었습니다.▼

스트링 값을 이용해서 feed() 함수를 호출해 줍니다. 이렇게 해줍으로서 page_links() 함수를 일일이 호출해 줄 필요가 없어집니다. 

그리고 except: 를 사용해 오류가 나는 경우에 대비해 사용자에게 알려주는 부분을 넣어주겠습니다.

그리고 크롤링할 페이지가 존재하지 않거나 하는 경우에 빈 set() 을 반환하게 합니다.

최종적으로 page_links() 를 리턴하게 해줍니다.