이번 시간에는 앞 시간에서 코딩한 부분중 정의하지 못한 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() 를 리턴하게 해줍니다.▼
'Programming > Python Web Crawler for intermediate learners' 카테고리의 다른 글
Web Crawler 012 - Domain Name Parsing - 도메인 네임 파싱하기. (0) | 2016.04.06 |
---|---|
Web Crawler 011 - Adding Links to Queue - 링크를 웨이팅 리스트에 추가하기. (0) | 2016.04.04 |
Web Crawler 009 - Crawling Pages You want to crawl - 크롤링 하고자 하는 페이지 링크들 크롤링하기. (1) | 2016.04.04 |
Web Crawler 008 - Making the Spider boot up. - 스파이더 구동하기. (0) | 2016.03.25 |
Web Crawler 007 - Initialize the Spider information - 스파이더 초기화. (0) | 2016.03.25 |