파이썬 크롤링 스크래핑 간단 설명(예제)

파이썬 스크래핑

네이버나 구글에 크롤링으로 검색을 하면 파이썬으로 작성된 크롤링 또는 스크래핑 관련 문서들을 많이 볼 수 있는데, 문서마다 사용하는 모듈도 다르고 사용하는 방식도 조금씩 차이가 있다는 것을 알 수 있습니다. 파이썬이 처음 접하는 컴퓨터 언어인 분들은 상당히 혼란스러울 수도 있을 것 같아 네이버 실시간 검색어 스크래핑 실습을 통해 간단하게나마 설명하고자 합니다.

용어 정리 크롤링 VS 스크래핑

크롤링과 스크래핑은 동일한 의미인 것처럼 사용되며 대부분 크롤링으로 칭하는 경우가 많습니다. 사람마다 용어의 정의를 다르게 하고 있는데 어떤 이는 스크래핑이 크롤링의 상위 개념처럼 말씀하시는 분도 계시고 서로 완전히 다른 개념이라고 말씀하시는 분도 있습니다. 용어가 중요한 것은 아니지만 개념 정도는 알고 있는 게 좋을 것 같습니다.

제 주관적인 생각으로 정의를 하자면
크롤링은 인터넷 상에 있는 불특정 웹 사이트를 방문해 어떤 링크에 어떤 정보가 있는지 수집하고 색인하는 즉, 검색 사이트의 봇(구글 봇)이 하는 행위

스크래핑은 정해진 특정 웹사이트에서 특정 데이터를 추출하고 가공하는 작업으로 필요한 정보 만을 스크랩하는 행위 참고로 파싱은 스크래핑의 상위 개념 정도 아닐까 생각합니다.

모듈(라이브러리)

파이썬으로 스크래핑을 하는 데 있어 가장 간단하고 간편한 방법을 선택했습니다. http 웹 클라이언트는 파이썬에 내장된 표준 라이브러리인 urllib 보다 사용이 편한고 간단한 3rd party 라이브러리인 requests를 사용합니다. 참고로 urllib2는 파이썬 2.7버전용입니다.

html 페이지를 긁어오기 위한 파서는 사용이 간편한 Beautiful Soup을 사용합니다.(뷰티풀 수프 외에 Scrapy 또는 selenium을 이용할 수 있다.) 또한 뷰티풀 수프에서는 find(find_all) 대신 사용이 간단한 CSS 선택자인 select_one(select)를 사용합니다.

requests DOChttps://requests.readthedocs.io/en/master/
Beautiful Soup DOC : https://www.crummy.com/software/BeautifulSoup/bs4/doc/

실습전 모듈 설치

  • requests : pip install requests
  • beautifulsoup4 : pip install beautifulsoup4

실행 환경

OS : 윈도우 10
IDE : VScode
Python : 3.7
beautifulsoup4 : 4.6.3
requests : 2.19.1

네이버 실시간 검색어 스크래핑


import requests
from bs4 import BeautifulSoup

resp = requests.get('https://www.naver.com/')
soup = BeautifulSoup(resp.text, 'html.parser')
titles = soup.select('.ah_roll .ah_k')  # 타이틀(제목)을 가지고 있는 클래스 명

for title in titles:
    print(title.get_text())

  1. requests와 BeautifulSoup을 임포트 한다.
  2. 요청할 웹 사이트의 주소를 입력하고 응답 값을 변수(resp)에 담는다.
  3. 요청 사이트로부터 응답받은 값을(resp.text) 뷰티풀 수프의 html 파서를 이용해 html로 정렬 시킨 후 변수(soup)에 저장한다.
  4. 저장된 HTML(soup)에서 검색어 제목만 변수(titles)에 담는다.
  5. 저장된 실시간 검색어를 루프 문을 이용해 하나씩 출력한다.

살펴보기

브라우저의 개발자 도구(F12)를 통해 소스를 보면 실시간 검색어에 대한 코드가 두 군데에 있습니다. 하나는 클래스 명이 ah_roll 시작하는 곳이고 또 하나는 클래스 명이 ah_list로 시작합니다.

html 소스

우리가 가지고 오려고 하는 것은 검색어 즉, 제목이 필요한데 두 군데다 제목 클래스 명이 ah_k로 똑같습니다. ah_k로만 선택하게 되면 1위부터 20위까지 20개의 제목이 아니라 40개의 중복된 제목을 가져옵니다.

html 코드

중복되지 않게 한곳에서만 데이터를 가져오려면 ah_k 클래스의 상위 클래스를 이용해야 합니다. 여기서는 첫 번째에 있는 ah_roll 클래스를 이용하도록 하겠습니다.

select VS find_all

위 예제를 보면 select를 사용 했습니다. 만약 find_all을 이용 한다면 titles = soup.find_all(class_="ah_roll")) 하나에 클래스 명만 넣을 수 있습니다. 즉, 자손이나 자식 요소를 직접 선택 할 수는 없고 한 번 더 변수에 담든지 아니면 루프 문을 이용해야 합니다.

반면 select를 이용할 경우 CSS 선택자를 이용하는 것처럼 사용할 수 있습니다. 예를 들어 자손을 직접 선택하거나 두 번째 자식만을 선택할 수도 있고 마지막 자식 요소만을 선택 할 수도 있습니다. 위 예제에서 사용된 코드를 보면 클래스 명 ah_roll의 자손인 ah_k 클래스를 바로 선택했습니다. 참고로 자손 요소를 선택 할 때는 한 칸 띄기를 이용하면 됩니다.

find(find_all)보다 select_one(select)가 사용이 더 편한것 같습니다.

뷰티풀 수프 셀렉트 사용법 : https://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors

반응형