본문 바로가기
[python]데이터 분석/[python]웹 스크랩핑(scraping)

웹 스크랩핑 - 준비과정

by 코드몽규 2022. 1. 28.
반응형

 오늘은 네이버 뉴스의 카테고리별 페이지별 기사 제목을 불러오는 작업을 해보려고 한다.

  • 정치
  • 경제
  • 사회
  • 생활/문화
  • IT/과학

 등과 같은 페이지를 각각 선택하고 페이지 내에 기사 제목을 불러오는 작업을 하기 위해서는 우선 Web에 대해 이해를 해야 한다. 


Web의 이해 

  • HTTP - Hyper Text Transfer Protocol

- 서버와 클라이언트 사이에서 정보를 주고받기 위한 규약

- 시작 줄, 헤더(Header), 본문(Body)으로 이루어져 있음

- 9개의 메서드가 존재하지만 주로 GETPOST만 쓰인다.

 

GET

http의 GET

POST

http의 POST
RestAPI 요약


HTTP Client 모듈 - python

 

urllib

  • Python built-in module
  • 간편하게 HTTP request를 보낼 수 있음
  • 로그인 및 세션을 유지하기가 번거로움

Requests #doc

  • 간편하게 HTTP request를 보낼 수 있음
  • 세션을 유지하기가 용이함
  • python2 / python3 완벽 지원
  • 코드가 간결하고 documentation이 잘 되어 있음

Selenium #doc : 웹브라우저 자동화 tool

  • javascript/css 지원, 기존 GUI 브라우저 자동화 라이브러리
  • 사람이 웹서핑하는 것과 동일한 환경, 대신에 리소스를 많이 사용함
  • 웹브라우저에서 HTML에 명시된 이미지/CSS/JavaScript를 모두 자동 다운로드/적용

BeautifulSoup : parsing을 도와주는

  • toolHTML/XML Parser : HTML/XML문자열에서 원하는 태그 정보를 추출합니다.
  • 정규식을 작성할 필요 없이 tag, id, class 등의 이름으로 쉽게 파싱 가능
  • 쉽고 간결하며, documentation이 매우 잘 되어 있음

Parsing (파싱)

-가공되지 않은 문자열에서 필요한 부분을 추출하여 (구조화된) 데이터로 만드는 과정

 

그럼 가공되지 않은 문자열은 어떠한 형태로 있을까???

바로 DOM 형태이다.

dom 과 html의 차이점에 대해서도 간단히 알고 넘어가보자!

 

HTML DOM =(HTML 엘레먼트/태그)로 구성된 TREE의 모습

HTML > Head > body > div > 엘레멘트 순으로 되어있다.

출처:https://wit.nts-corp.com/2019/02/14/5522

요약정리
DOM은 HTML 문서에 대한 인터페이스입니다. 
첫째로 뷰 포트에 무엇을 렌더링 할지 결정하기 위해 사용되며,
둘째로는 페이지의 콘텐츠 및 구조, 그리고 스타일이 자바스크립트 프로그램에 의해 수정되기 위해 사용됩니다.

DOM은 원본 HTML 문서 형태와 비슷하지만 몇 가지 차이점이 있습니다.

1.항상 유효한 HTML 형식입니다.
2.자바스크립트에 수정될 수 있는 동적 모델이어야 합니다.
3.가상 요소를 포함하지 않습니다. (Ex. ::after)
4.보이지 않는 요소를 포함합니다. (Ex. display: none)

출처:https://wit.nts-corp.com/2019/02/14/5522

 

그럼 이제 가공되지 않은 문자열에서 특정 문자열 정보를 가져오려면 어떻게 해야 할까?

 

효율적인 방법으로는 HTML Parser 라이브러리를 활용하는 방법이 있다.

ex) BeautifulSoup4 등


그렇다면 간단한 예시로 Parser 라이브러리 중 하나인 BeautifulSoup의 사용 예와 메소드를 살펴보자.

from bs4 import BeautifulSoup
html = '''
<ol>
 <li>NEVER - 국민의 아들</li>
 <li>SIGNAL - TWICE</li>
 <li>LONELY - 씨스타</li>
 <li>I LUV IT - PSY</li>
 <li>New Face - PSY</li>
</ol>
'''
soup = BeautifulSoup(html, 'html.parser') #soup = BeautifulSoup(파싱할 문자열,'html.parser')
for tag in soup.select('li'):
print(tag.text)

NEVER - 국민의 아들
SIGNAL - TWICE
LONELY - 씨스타
I LUV IT - PSY
New Face - PSY

BeautifulSoup : find(), select(), attrs()

  • find()
  • find_all(‘tag_name’) : 태그 이름으로 엘레먼트 찾기
  • find_all(‘css_class_name’) : CSS 클래스 명으로 엘레먼트 찾기

find()

  • select()
  • select(‘css_셀렉터’) : CSS 셀렉터 문법으로 엘레먼트 찾기 (배열로 반환)
  • select_one(‘css_셀렉터’) : 하나의 엘레먼트만 반환

select()

여기까지 웹스크랩핑을 하기 위해 필요한 개념과 모듈 그리고 간단한 사용예시등을 알아보았다.

다음 글에서는 위에서 말한 네이버 뉴스 페이지의 카테고리별 기사 제목 스크랩핑 작업을 직접 해보겠다.

반응형

댓글