*Udacity - Intro to Computer Science 를 따라가고 있습니다.
https://classroom.udacity.com/courses/cs101
1. 이번엔 진짜 웹 크롤러(web cralwer)를 만들어보자
한 페이지에 있는 링크들을 모조리 뽑아오는 것이 바로 크롤러의 기능이다. HTML 언어를 미리 배웠으니 링크를 할당하는 키워드가 <a href= 라는 것을 알고 있을 것이다. (a 앵커 - 즉 웹상에 닻을 내린다는 뜻이고, 어디에 닻을 내리고 하니 h하이퍼링크 ref레퍼런스의 줄임말로 해서 원하는 '페이지'를 이안에 넣으면 링크가 성립된다 => html 언어에서 배울 수 있으니 참고https://brunch.co.kr/@writeraaa/119)
그럼 여태까지 배웠던 것으로 토대로 아래와 같이 크롤러 제작계획을 수립해보자
1) page = 웹페이지 내용을 할당
: 링크들을 뽑아올 페이지의 텍스트를 page 안에 넣어주자. 원하는 웹페이지에 오른쪽 클릭>>페이지 소스보기(크롬기준)을 보면 가져올 수 있다.
2)start_link = page.find('<a href=') //html 코드에서 링크를 꽂아주는 텍스트를 찾는다
3) start_quote = page.find('"', start_link) //페이지 url이 분명 저 a href 뒤에 "" 쌍따움표 안에 있을 테니 a href 바로 다음에 나오는 "시작하는 부분을 찾도록 한 뒤,
4)end_quote = page.find('"'start_quate+1) // 앞에는 "의 시작부분을 찾았으니 이번에는 그것 다음으로나오는 쌍따음표"를 찾아주고
5)url = page[start_quote+1:end_quote]
:여태까지 정의한 것을 바탕으로 첫 쌍따움표 바로 다음에 나오는 글자부터 끝나는 쌍따움표 전까지에 적힌 url을 추출하여
6) print url
해주면 간단하게 첫 url을 프린트 할 수 있다.
하지만 우리의 목표는 이 페이지에 나오는 모든 url을 추출하는 크롤러를 만드는 것. 그러므로 우리는 뒤에 뭔가를 더 추가해야하여 두번째로 url이 찾는 프로시저를 반복해서 수행시켜 모든 url을 가져올 수 있다. 이를테면 여태까지 찾은 텍스트 다음텍스트 부터 찾도록 정의해주면 어떨까?
7)page= page[end_qute:]
:우리가 여태까지 작업했던 url 마지막 따음표 기준으로 시작되는 텍스트로 페이지를 재할당 하는 것이다.
8) 그리고 다시 처음부터...
start_link...
start_quote...
으으 반복되다니 코드에 반복은 있을 수 없다. 게다가 페이지 마다 품고 있는 링크의 갯수가 다른데 어떻게 알고 수동으로 이것들을 복붙하여 알아낸단 말인가!
2. 반복되는 것을 묶어주자
보아하니 반복 되는 부분은 다음과 같다. 뭔가를 넣어주는 부분이다.
page = www....
start_link = page.find('<a href=')
start_quote = page.find('"', start_link)
end_quote = page.find('"'start_quate+1)
url = page[start_quote+1:end_quote]
그리고 이 아래가 바로 우리가 원하는 output과 텍스트를 재정리 해주는 것이 이싿.
print url
page= page[end_qute:]
이제 이걸 묶어보자. 먼저 input할 것을 묶어서 프로시저를 만들어보자
def get_next_target(page):
page = www....
start_link = page.find('<a href=')
start_quote = page.find('"', start_link)
end_quote = page.find('"'start_quate+1)
url = page[start_quote+1:end_quote]
이렇게 되면 get_next_target이라는 프로시저(procedure)가 만들어진다. 이제 결과(output)을 소환하자 싶다면 return을 사용한다. 이때 우리는 이 프로시저를 통해 '찾으려고 했던 것' 그리고 이것을 '반복할 때 필요한 것'을 불러내면 된다. 이 아래에서 리턴(앞서 말한 문법으로 따지면 <block>에 해당하는 부분) 해주면 된다.
return url, end_quote
이걸로, 우리가 뽑아내려던 url을 얻을 수 있고, 이제 이 url 바로 다음부터 또 검색할 수 있도록 end_quote를 얻을 수 있다.
짜잔. 이제 우리가 링크를 뽑아 내고 싶은 페이지의 소스만 page = www... 에 입력하면 모든 링크를 뽑아올 수 있다. 말로만 듣던 크롤러 라는 것을 직접 작성한 것이다. 바로 구글이나 네이버 같은 모든 검색 엔진의 기초를 직접 만들어 낸 것이나 마찬가지다!
축하한다!!