본문 바로가기

파이썬(python3)/기타

파이썬 크롤링 002 - 크롤러 구현 / 데이터수집 자동화

  이전 포스팅에서 파이썬 크롤링 001 - 구성요소, 구현방법에 대해서 이야기 했습니다. 이어지는 포스팅이니까 혹시 1번을 안보신 분들은 보고 오시면 더 쉽게 이해되지 않을까 싶습니다.

 

  이번 포스팅에서는 크롤러를 구현해봅니다. 이게 크롤러가 끝이야? 장난해? 라고 하실 수 있겠습니다. 저는 비개발자 분들이 부르는 크롤링은 사실 크롤링과 파싱을 합친 개념이라고 보거든요. 그래서 원하시는 결과를 얻으려면 파싱까지도 하셔야 하는데 이번 포스팅에서는 크롤링만 해보도록 하겠습니다.

 

  어떤 예제가 좋을까? 고민을 했는데 주식쪽으로 예제를 만들어봤습니다. 주식을 투자하시다보면 회사들의 정보를 찾아보는 경우가 많죠. 간단하게는 요약정보부터 조금 더 자세하게는 재무제표까지 들여다 보는 것은 기본이라고 하죠. 이런 가정을 해봅시다. 

 

  (1) 100개의 회사에 투자하고 있거나 투자에 관심이 있다.

  (2) 일단 PBR과 PER가 어떻게 형성되어 있는지 엑셀로 보고싶다.

 

  만약 이런 일을 손으로 사람이 한다면? 매일 점심시간에 100개 회사를 들어가서 숫자를 보고 엑셀로 옮긴다. 정도가 되겠습니다. 여기에는 문제점이 있죠. 1. 오래 걸린다. 2. 사람이 하니까 에러가 포함될 확률이 높다. (휴먼 에러 라고도 하죠?) 3. 귀찮다. 4. 점심을 못먹는다. 등등이 있겠습니다. 크롤링으로 하면 어떻게 될까요? 1. 빠르다. 2. 에러 포함 확률이 낮다. (없다 아닙니다. 낮다) 3. 덜 귀찮다. 4. 점심 먹는다. 등등이 될 수 있겠네요. 그렇다면 답은 나온 것 같습니다. 크롤링 해보죠. 

 

  일단 3개 회사에 대해서 한 번 크롤링을 해보자 ! 이게 이번 포스팅의 목표가 되었습니다. 시작 전에 이전 포스팅의 내용을 간단하게 다시 이야기 하고 싶어졌어요. 아래 그림에서 이번 포스팅에서 다루는 내용은 Crawler --> URL 까지 입니다. 예상되는 결과는 URL에 있는 데이터죠. Parser는 다음 포스팅에서 다루도록 하겠습니다. 혹은 다다음 포스팅이 될 수도 있고요.

크롤링 개념.

  우리가 크롤링하고 싶은 대상 페이지 부터 구경해볼까요? 네이버 페이지에 있는 주식 관련 페이지죠. 기업은 임의로 정했습니다. 파싱이 아니기 때문에 크롤링 페이지가 어떻게 생겼는지는 많이 중요하진 않습니다. 크롤링을 위해서 제일 중요한 것은 URL이겠죠? 아래 페이지의 URL은 https://finance.naver.com/item/main.nhn?code=000660 입니다. 해당 페이지에서 페이지 소스보기 하시면 보이는 내용을 크롤링 하는 것입니다. 웹에 대한 기본적인 이해가 있어야 하는데요. 우리가 보고 있는 웹 페이지는 모두 HTML, CSS, Javascript 등으로 이루어져 있습니다. 그런 코드들을 웹브라우저(크롬, 사파리, 파이어폭스 등) 가 읽어서 보여주는 것이죠. 따라서 크롤링을 하게 되면 HTML, CSS, Javascript 등으로 이루어진 데이터를 받아오게 됩니다. 

 

SK하이닉스 : 네이버금융 사이트

 

  그럼 코드를 한 번 볼까요? 아래 코드를 실행하시면 requests 모듈이 없다고 에러가 나옵니다. pip install requests로 패키지를 설치해주고 코드를 돌려보세요. 그러면 html 코드가 쭉 ~~~~ 길게 나오는 것을 볼 수 있습니다.

  코드에 대해서도 간단하게 소개해드릴게요. crawling_target_urls 라는 리스트에 크롤링 하고 싶은 URL을 쭉 입력해둡니다. for 문을 통해서 URL 하나씩 requests.get 함수를 통해서 데이터를 수집합니다. resp 라는 변수에 담았고요. 우리가 진짜 원하는 정보는 resp.text에 담겨 있어서 그걸 프린트(print) 해봅니다. 끝이에요. 간단하죠? 최대한 간단하게 하고 넘어가죠. 나중에는 약간 복잡하게 구현하게 될거에요.

 

import requests

crawling_target_urls = [
    'https://finance.naver.com/item/main.nhn?code=000660', #SK하이닉스
    'https://finance.naver.com/item/main.nhn?code=263750', #펄어비스
    'https://finance.naver.com/item/main.nhn?code=123420', #선데이토즈
]

for idx, url in enumerate(crawling_target_urls):
    resp = requests.get(url)
    print ('idx={0}, response_data={1}'.format(idx, resp.text))

크롤링 결과 중에 일부 중에 진짜 일부

  크롤링 끝입니다. 데이터 가지고 왔으니까요. 크롤링된 데이터를 몽땅 저장하는 것은 불필요할 것 같습니다. 실제로 웹페이지는 텍스트만 있는게 아니거든요. 온갖 html 코드와 javascript, css 코드가 뒤엉켜있습니다. 그중에서 여러 분이 필요한 부분은 극히 일부분일거에요.

 

  포스팅 처음에도 말씀드렸지만, 엄격하게 분리하자면 비개발자가 말하는 크롤링은 크롤링과 파싱을 합친 것이죠. 이제 데이터를 가지고 왔으니까 내가 가지고 싶은 부분만 잘 잘라내서 사용하면 됩니다. 잘라내는 프로세싱을 파싱이라고 생각하시면 되고요.

 

  다음 포스팅에서는 파싱을 해볼게요.

 

 

http://cchart.xyz/

 

cchart.xyz / 데이터 수집,가공 서비스

반복적인 웹 데이터 수집, 가공서비스

cchart.xyz