파이썬 웹 크롤링 본문

프로젝트/파이썬

파이썬 웹 크롤링

뚜스머리 2017. 6. 26. 22:26

<이전 사이트에서 작성된 글>


저번 문자인식 프로젝트를 종료하고,

이번학기부터 EPL의 승부를 예측하는 프로젝트를 시작한다.

프로젝트를 진행하기 위한 필수적으로 선수들의 데이터와 경기내용 경기결과등의 정보등이 필요하다.

그래서 우선적으로 웹크롤러를 만들어, 자동으로 데이터를 수집하는 프로그램을 제작해보았다.


처음에는 C/C++을 통해서 구현하려 했으나, 너무 방대한 소스와, 지식이 필요하다.

그래서 파이썬을 활용하는 것으로 방향을 선회했다. 왜냐하면 파이썬은 어렵지 않고, 지원되는 모듈이 많아 크롤러 제작해 적합했기 때문파이썬의 기본 문법은 다른 언어를 익혀본 사람이라면 , 적어도 2일 많으면 4~5일이면 익숙해질 수 있을 것이라 생각한다. 


파이썬에는 다양한 모듈들이 지원되고 있다. 그 중에서 우리가 활용할 핵심 모듈은

BeautifulSoup

BeautifulSoup을 이용하면 정리도 되고, 태그 찾기도 굉장히 쉽다.


내가 이용하는 라즈베리파이 (혹은 리눅스)를 기준으로

BeautifulSoup 모듈을 설치하는 방법은 간단하다.

콘솔창에서 아래의 명령을 입력해주면 된다.

$sudo apt-get install python-beautifulsoup


자 그럼 .py 파일을 하나 만들고, 소스를 입력해보자.

제일먼저 우리가 사용할 requests 와 beautifulsoup 모듈을 import 해준다.


import requests

from bs4 import BeautifulSoup


다음으로 url 변수를 생성해준다.

url 변수에는 내가 크롤링 하기 원하는 페이지를 넣어주면 된다.

나는 네이버 뉴스를 기준으로 특정 기간 동안 EPL의 기사 크롤링을 진행했다.

그래서 해당 검색페이지를 들어가, 소스 url을 복사해 넣어주었다.


url = 'http://news.naver.com/main/search/~~~~'


그럼 url로부터 페이지 html 소스코드를 얻어야 한다. 

여기서 request.get을 사용한다.


source = requests.get(url)

text_file = source.text


위의 소스를 거치게 되면 파이썬에서 url로 들어가 페이지 소스를 받아, source에 넣고

이것을 text 변환을 하여, text_file에 넣어주게 된다.


                     (text_file) 굉장히 가독성이 좋지않다. 바로 BeautifulSoup을 이용하자

다음으로 추출된 소스를 분석하기 위해 BeautifulSoup에 우리가 얻은 홈페이지 소스를 넣어주자.

soup = BeautifulSoup(text_file,'lxml')


이제부터가 진짜 크롤링의 시작이다.

우선 아까 url의 주소를 받아온 페이지로 들어간다.

(http://news.naver.com/main/search/search.nhn?query=epl&st=news.all&q_enc=EUC-KR&r_enc=UTF-8&r_format=xml&rp=none&sm=all.basic&ic=all&ie=MS949&so=rel.dsc&stDate=range:20110813:20110827&detail=0&pd=4&r_cluster2_start=1&r_cluster2_display=10&start=1&display=5&startDate=2011-08-13&endDate=2011-08-27&page=)


위의 url을 들어가보면 제일 처음으로 나오는 기사는




상단에 보이는 기사인데, 이를 소스에서 분석하여, 태그를 찾아보면






보게되면 a > class = "tit" 인 부분에 기사제목이 있다.

그리고 그 하위메뉴중에 span class = "time" 태그안에 기사가 올라온 날짜가 들어있다.

그럼 이 태그만 검색하면 모든 것이 끝난다.

그러나 나는 하나의 기사가 아닌 전체 기사를 모두 크롤링하고 싶다.

이런 경우 find_all을 활용하여, 소스안에서 태그를 모두 찾아내는 방식을 이용한다.






소스를 보게 되면 for 루프를 돌면서 , a > class = "tit" 인 부분을 차례로 찾아 나선다.

그리고 각각의 tit 태그 안에서 href -> 기사링크 text -> 기사제목을 추출하고

다음으로 find_next를 사용, 하위메뉴안에 span > class = "time" 을 찾아

해당 기사가 올라온 날짜를 추출하게 된다.


그리고 크롤러로 저장된 내용을 csv나, txt로 저장해주면 된다.

아래는 내가 추출한 자료의 모습이다.


<결과>