본문 바로가기

Programming/Python Tutorials

[PYTHON 3] Tutorials 25. 웹 크롤러(like Google) 만들기 2 - How to build a web crawler


안녕하세요. 지난 시간에 이어 웹 크롤러 만들기 2번째 시간입니다. 지난 시간에는 BeautifulSoup 를 이용해서 특정 사이트의 글 목록 리스트에서 URL, 제목을 파이썬으로 가지고 오는 방법에 대해 알아 보았습니다. 이번에는 그 연장선상으로 URL, 제목에 해당하는 글의 본문 내용을 가지고 오게 만들어 보겠습니다. 시작하겠습니다.

앞 시간의 코드에서 각 글의 본문 내용을 확인할 수 있도록 하는 함수 get_single_article(item_url) 을 만들어 주었습니다. 물론, 함수명은 원하는 이름으로 정하여도 무방합니다.

앞서 만든 코드에서 지금부터 만들어 줄 함수가 들어가는 위치에서 호출할 수 있도록 함수 호출 부분을 삽입합니다. page += 1 위에 함수 호출 코드를 넣어 주었습니다. 

이제 각 본문 데이터를 가지고 올 부분을 코딩해 보겠습니다. 앞에서 다룬 내용과 크게 차이가 나지 않습니다. url 값을 이용해서 해당 페이지의 데이터를 읽어오게하여 source_code 변수에 저장합니다. 

이 소스코드를 텍스트 변환하여 plain_text 에 넣어줍니다.

BeautifulSoup 를 이용해서 파싱을 하고 soup 에 저장을 합니다.

이렇게 해서 저장된 값에서 본문 내용에 해당하는 HTML 태그를 확인하여 선택하게 합니다. 이렇게해서 얻어진 태그를 반복문을 돌려 출력하게 합니다. 추후에는 파일의 형태로 저장을 하게 할 예정입니다. 

이제 결과를 확인해 보겠습니다. URL, Title 까지 확인 할 수 있었던 결과에서 본문 내용이 추가적으로 나오게 되었습니다. 만약 수만 페이지에 해당하는 사이트가 있다면 max_pages 와 URL 값, 각각의 데이터가 들어가는 HTML 태그를 수정하면 됩니다.

전체 코드

import request

from bs4 import BeautifulSoup


def spider(max_pages):

page = 1

while page < max_pages:

url = 'http://creativeworks.tistory.com/' + str(page)

source_code = requests.get(url)

plain_text = source_code.text

soup = BeautifulSoup(plain_text, 'lxml')

for link in soup.select('h2 > a'):

href = "http://creativeworks.tistory.com" + link.get('href')

title = link.string

print(href)

print(title)

get_single_article(href)

page += 1


def get_single_article(item_url):

source_code = requests.get(item_url)

plain_text = source_code.text

soup = BeautifulSoup(plain_text, 'lxml')


for contents in soup.select('p > span'):

print(contents.text)


spider(2)

지금까지 기초적인 웹 크롤러를 만들어 보았습니다. 사고를 조금만 확장한다면 이 크롤러를 이용한 다양한 애플리케이션(AP)를 만들어 활용할 수 있을 것입니다.  추후에 중급, 고급 과정도 만들 예정인데, 그 때에는 보다 고차원적인 크롤링에 대해서 알아보도록 하겠습니다. 수고 하셨습니다.