오늘은 네이버 뉴스의 카테고리별 페이지별 기사 제목을 불러오는 작업을 해보려고 한다.
- 정치
- 경제
- 사회
- 생활/문화
- IT/과학
등과 같은 페이지를 각각 선택하고 페이지 내에 기사 제목을 불러오는 작업을 하기 위해서는 우선 Web에 대해 이해를 해야 한다.
Web의 이해
- HTTP - Hyper Text Transfer Protocol
- 서버와 클라이언트 사이에서 정보를 주고받기 위한 규약
- 시작 줄, 헤더(Header), 본문(Body)으로 이루어져 있음
- 9개의 메서드가 존재하지만 주로 GET과 POST만 쓰인다.
▶ GET
▶ POST
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 > 엘레멘트 순으로 되어있다.
요약정리
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 클래스 명으로 엘레먼트 찾기
- select()
- select(‘css_셀렉터’) : CSS 셀렉터 문법으로 엘레먼트 찾기 (배열로 반환)
- select_one(‘css_셀렉터’) : 하나의 엘레먼트만 반환
- attrs()
- a.attrs : 해당 엘레먼트에서 속성 추출하기
- 태그의 모든 속성을 dict 타입으로 반환
여기까지 웹스크랩핑을 하기 위해 필요한 개념과 모듈 그리고 간단한 사용예시등을 알아보았다.
다음 글에서는 위에서 말한 네이버 뉴스 페이지의 카테고리별 기사 제목 스크랩핑 작업을 직접 해보겠다.
댓글