파이썬으로 기사 크롤링하기

2019. 4. 2. 22:13coding

  예전에도 장고랑 파이썬은 한번 공부할 기회가 있었는데, 그땐 장고를 다루기가 너무 어려워서.. (눈물) 포기했다가 학교에서 파이썬을 이번에 다시 공부하면서 재미를 느껴서 크롤러를 한번 만들어 보게 되었다.

 일단 내가 가져오려고 한건 한겨레 기술 미래&과학 페이지! 제목이랑, 링크랑 날짜를 가져올건데, 날짜는 내가 입력해서 입력한 날짜를 포함한 그 이후의 기사만 가져와서 CSV로 내보낼것이다. 이번에 알았는데 파이썬에는 좋은 패키지랑 모듈이 너무너무너~어무 많고 쓰기도 정말정말 쉽다. 왜 다들 파이썬 배우라는지 알겠어.. 사랑해 파이떤

가상환경 설정하기

 가상환경에 대해서는 나도 이번에 처음 알았는데, 파이썬에서는 한 라이브러리에 하나의 버전만 설치할 수 있어서 (다른 언어도 그런가..?)  여러개의 프로젝트를 진행하면 문제가 생긴다. 작업을 할때마다 다른 버전의 라이브러리를 설치해야 한다. 그래서 독립적으로 가상환경을 만들어서 프로젝트마다 다른 가상환경을 사용하는 것이다. 나는 venv를 사용했기 때문에 (3.3 버전 이후부터 기본 모듈에 포함되어 있음) 파이참 에디터랑 파이썬을 깔았더니 프로젝트를 만들때 마다 알아서 구동되었음.. 개이득!

BeautifulSoup 와 Request를 사용해서 크롤링하기

 일단 페이지를 크롤링해 오기 위해서 BeautifulsoupRequests를 사용했다. Requests로 내가 원하는 url get 요청 -> Beautifulsoup(bs4) 로 파싱해서 특정한 부분만 가져오는 형식.

$ npm install bs4 requests

 일단 Beautifulsoup 랑 requests 모듈을 다운로드 해주고 바로 파이썬에서 import 해주면 된다. Beautifulsoup를 import 할때는 from bs4 import Beautifulsoup 요렇게 해주면 된다.

url = "http://www.hani.co.kr/arti/science/technology/"
req = requests.get(url)
req.encoding = 'utf-8'

if req.ok:
   html = req.text
   soup = BeautifulSoup(html, 'html.parser')

dates = soup.select('span.date')
hrefs = soup.select('dd.desc > a')

그리고 request를 받아 html 로 파싱하고, 가져올 부분을 select로 지정했다. select 말고도 findAll 이나 find 같은 메서드도 있는데 select가 제일 잘 가져와지는 것 같아 select로 가져왔다. 이때 req.encoding을 'utf-8' 로 설정해주질 않았을때 한번씩 유니코드 문자가 나올때가 있었는데 이거 해결한다고 좀 헤맸다.. 파싱했더니 유니코드가 나올때도 있고 어쩔땐 이상한 로마자? 같은게 나올때도 있따..

pandas로 데이터프레임 만들어서 내보내기
$ npm install pandas

data = { 'TITLE': article_title, 
    'TEXT': article_text, 
    'LINK': article_href, 
    'DATE': article_date }
    
dataFrame = pandas.DataFrame(data)
dataFrame.to_csv('./' + nowDate + '.csv', mode='a', index=False)

 pandas 를 인스톨해서 importa 해주고 위에서 select한 요소들은 get_text() 함수로 텍스트만 추출할 수 있다. 텍스트를 저렇게 data 객체로 정리해서 Dataframe을 만들면 csv로 내보내기가 편하다. 짱짱맨! 이거 말고 동적 웹사이트는 selenium 을 이용하면 또 쉽게 크롤링할 수 있다.. 로그인도 가능하구 검색도 가능하다!