본문 바로가기

파이썬(python3)/기타

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

  벌써 3번째 글이네요. 앞에 001, 002 글에서 이어지는 글이라서 관심있는 분들은 한 번 읽고 이번 글을 읽으시면 더 이해가 쉬울 것 같습니다. 아래 링크로 달아둘게요.

2020/04/19 - 파이썬 크롤링 001 - 구성요소, 구현방법

2020/04/26 - 파이썬 크롤링 002 - 크롤러 구현

 

  이번 포스팅은 제목에도 나와있지만 파서를 구현하는 내용입니다. 정확하게는 멋진 라이브러리를 사용해서 크롤링한 데이터에서 원하는 내용만 뽑아내보는 것이죠. 002 포스팅 예제에서 주식 정보가 나와있는 사이트를 예로 들었는데 이번 포스팅에서도 이어서 사용해봅니다. 

 

예제 대상

  위 그림에서 오른쪽에 박스 그려둔 곳 보이시나요? 저곳에 있는 정보를 파싱하는 대상으로 설정해보죠. 그렇다면 아래와 같은 코드로 가능합니다. 코드를 실행하기 전에 2번째 줄을 보시면 from bs4 import BeautifulSoup 라고 적혀있죠. 파싱에 사용할 라이브러리인데요. 설치는 아래와 같은 코드로 가능합니다. 

pip install beautifulsoup4

  설치가 완료되었다면 아래 코드를 실행해보세요. 

import requests
from bs4 import BeautifulSoup

crawling_target_urls = [
    'https://finance.naver.com/item/main.nhn?code=000660',
    '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))

    soup = BeautifulSoup(resp.text, 'html.parser')
    for div_tab_con1 in soup.find_all('div', class_='tab_con1'):
        for em in div_tab_con1.find_all('em'):
            print (em.getText())

  기존 코드에서 몇 줄 추가 안했죠? 그렇지만 원하는 부분을 어설프지만 파싱을 할 수 있습니다. 이 부분을 설명드리려면 조금 복잡해요. 그래도 간단하게 말씀 드릴게요. 

 

  아래 문장에서 우리가 설치하고 추가한 BeautifulSoup 라이브러리 객체를 하나 생성합니다. 왜 이런 코드냐고? 물으신다면 라이브러리 문서를 링크해드릴테니 참고하세요. https://www.crummy.com/software/BeautifulSoup/bs4/doc/

  첫 번째 인자로 resp.text가 들어갔다는 것이 중요합니다. 우리가 앞선 포스팅에서 크롤러을 구현했고 그 크롤러가 수집한 데이터가 파서의 인자로 들어간 것이죠. 크롤러가 수집한 데이터는 html, css, javascript가 포함된 데이터라서 두 번째 인자를 html.parser로 설정했습니다.

soup = BeautifulSoup(resp.text, 'html.parser')

  아래 3개의 라인에서 첫 번째 라인은 위에서 생성한 객체에서 find_all 합니다. div 중에서 tab_con1 이라는 클래스를 가진 div를 모두 찾아오죠. 그 div를 for 문을 돌면서 두 번째 라인을 수행합니다. 찾은 div 중에서 em 이라는 태그를 모두 찾습니다.  찾은 em이라는 태그를 for문을 돌면서 getText() 로 태그의 값을 읽어오죠. 그것을 print () 하는 코드입니다.

for div_tab_con1 in soup.find_all('div', class_='tab_con1'):
	for em in div_tab_con1.find_all('em'):
		print (em.getText())

   이런 코드들이 실행되면 결과는 아래와 비슷할거에요. 파싱하는 부분의 숫자가 매일 혹은 일정 기간마다 달라지는 부분이라 아래 결과와 조금 다를 수 있습니다.

파싱한 결과 예시

  이번 예제에서는 파싱할 대상이 너무 쉽게 접근이 가능해서 이런 짧은 코드로도 가능했지만, 대상이 복잡한 경우에는 코드가 더 길어질 수 있습니다. 다음 포스팅에서는 파싱한 대상들을 정리해서 파일에 저장해보는 내용을 작성해보겠습니다. 자세한 내용은 다음 포스팅에서 이야기 드릴게요 !

 

 

http://cchart.xyz/

 

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

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

cchart.xyz