brunch

You can make anything
by writing

C.S.Lewis

by 아무나 Jul 17. 2019

Python - 4. 웹 크롤러 만들기(3)

*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... 에 입력하면 모든 링크를 뽑아올 수 있다. 말로만 듣던 크롤러 라는 것을 직접 작성한 것이다. 바로 구글이나 네이버 같은 모든 검색 엔진의 기초를 직접 만들어 낸 것이나 마찬가지다!


축하한다!!


매거진의 이전글 Python - 3. 웹 크롤러 만들기(2)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari