Skip to content

Commit e3cd46e

Browse files
committed
publish 5분만에 훑어보는 웹스크래핑
1 parent 2c2852a commit e3cd46e

3 files changed

Lines changed: 146 additions & 11 deletions

File tree

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
---
2+
title: 5분만에 훑어보는 파이썬 웹 스크래핑
3+
date: "2020-03-29T08:58:00+09"
4+
description: 예제와 함께하는 파이썬 웹 스크래핑
5+
---
6+
7+
> 구슬이 서 말이어도 꿰어야 보배다.\
8+
요즘엔 데이터가 재산이라는 말이 있습니다. 그럼 세상에서 가장 많은 데이터는 누가 가지고 있을까요? 세상에서 가장 많은 데이터는 웹상에 공개된 형태로 존재하고 있습니다. 하지만 이 데이터를 가지고 있는다고 해서 바로 부자가 되지는 않습니다. 구글이 데이터를 잘 정리해서 검색하기 쉽게 만들어 준 것처럼 데이터를 잘 꿰어야지만 비로소 보배가 되는 것이지요.\
9+
웹 상의 데이터를 꿰는 과정인 웹 스크래핑의 세계에 처음으로 발을 들이고 싶으신 분들을 위해 간략한 가이드를 작성 해 보았습니다.
10+
11+
## 웹 크롤링? 웹 스크래핑?
12+
13+
먼저 용어 정리를 하고 가겠습니다. 웹 크롤링과 스크래핑은 저를 포함해서 많은 분들이 용어를 섞어서 사용하고 있는데, 제가 이해하고 있는 정의는 다음과 같습니다.
14+
15+
**웹 크롤링** : 웹을 여기저기 돌아다니는 행위\
16+
**웹 스크래핑** : 웹 원하는 자료를 추출 해 내는 행위
17+
18+
웹에서 원하는 데이터를 모으려면 보통 웹을 돌아다니는 행위와 각 페이지에서 원하는 자료를 추출 해 내는 행위가 함께 이루어지므로, 두 용어는 구분해서 쓰지 않습니다. 하지만 이번 포스트에서는 하나의 페이지에서 자료를 추출 해 내는 것에 대해서만 다룰 예정이므로 웹 스크래핑이라는 용어를 사용하겠습니다.
19+
20+
## 실습을 위해 필요한 환경
21+
22+
이번 포스트에서는 파이썬을 이용한 웹 스크래핑을 해 볼 예정입니다. 이번 포스트에서 나오는 예제를 실행시켜보기 위해서 필요한 환경은 다음과 같습니다.
23+
24+
```shell
25+
python3
26+
bs4 # pip install bs4
27+
requests # pip install requests
28+
```
29+
30+
## 웹 스크래핑
31+
32+
먼저 우리가 웹브라우저를 이용해 페이지에 접근을 하는 과정을 간단하게 표현하면 다음과 같습니다.
33+
34+
```text
35+
1. 웹브라우저에서 서버에 페이지를 요청 (request)
36+
2. 서버에서 웹브라우저에 페이지를 보내줌 (response)
37+
3. 웹 브라우저에서 페이지를 이쁘게 보여줌 (render)
38+
```
39+
40+
웹 스크래핑 하는 과정도 우리가 웹브라우저를 사용하는 과정과 크게 다르지 않습니다.
41+
42+
```text
43+
1. 파이썬에서 서버에 페이지를 요청 (request)
44+
2. 서버에서 파이썬에 페이지를 보내줌 (response)
45+
3. 페이지에서 원하는 데이터를 추출 (parsing)
46+
```
47+
48+
웹브라우징과 웹스크래핑은 페이지를 요청하고 받는 1번, 2번 과정은 동일하고, 3번과정에서 페이지를 보여주느냐, 페이지에서 데이터를 추출하느냐만 다르다고 생각하시면 됩니다.
49+
50+
위의 예제는 가장 단순한 상황에서의 웹브라우징, 스크래핑을 설명 한 것이고, 만약에 로그인같은 좀 더 복잡한 과정을 거쳐서 페이지를 요청해야 하거나, 서버에서 보내준 페이지를 단순히 보여주는 형태가 아닌, 동적으로 브라우저에서 페이지를 만드는 형태라면 웹스크래핑 과정도 그에 맞게 바뀌어야 합니다. 이런 경우에는 [selenium](https://www.selenium.dev/) 이라는 패키지를 이용해서 대응 할 수 있습니다.
51+
52+
## 예제: 네이버 뉴스 헤드라인 가져오기
53+
54+
이제부터 네이버 헤드라인 뉴스의 제목을 가지고 오는 예제를 살펴보겠습니다.
55+
먼저 파이썬에서 웹페이지 요청을 하고, 그 다음에는 웹페이지를 파싱해서 원하는 정보를 추출 해 내는 순서로 설명드리겠습니다.
56+
57+
### 1. 파이썬에서 웹페이지 요청하고 받기
58+
59+
```python
60+
# 웹페이지 요청을 위한 패키지
61+
import requests
62+
63+
# 네이버 뉴스 페이지 url
64+
url = 'https://news.naver.com/'
65+
# 네이버 뉴스 페이지 요청, 응답 저장
66+
response = requests.get(url)
67+
68+
print(response) # 응답 형식은 <Response [200]>
69+
print(response.status_code) # 응답 코드는 200 (정상 응답)
70+
print(response.text) # 응답 내용 출력 (html, 엄청 긺)
71+
```
72+
73+
코드는 엄청 간단합니다. 원하는 url을 requests.get 함수의 인자로 넣어주고, 함수를 호출하면 서버에 웹페이지를 요청하고, 응답결과를 반환합니다. 응답결과는 Response 객체로 되어 있는데, 자세한 사항은 [Requests 문서](https://2.python-requests.org/en/master/user/advanced/#id2)를 보시면 도움이 됩니다.
74+
75+
현재 Response 객체에서 우리가 필요한 내용은 두 가지입니다. response.status_code를 확인해서 서버로부터 정상 응답(200)이 왔는지, 정상응답이 왔다면 response.text로부터 해당 페이지의 내용을 가져오는 것입니다.
76+
77+
response.text의 내용을 보면, 긴 text 형식의 html 파일입니다. 여기에서 우리가 원하는 헤드라인 뉴스의 제목을 추출 해 내기 위해서는 html을 파싱하는 작업이 필요합니다.
78+
79+
### 2. 웹페이지에서 원하는 데이터 추출하기
80+
81+
```python
82+
# 웹페이지 파싱을 위한 패키지
83+
from bs4 import BeautifulSoup
84+
85+
# response로 부터 html 가져오기
86+
html = response.text
87+
88+
# BeautifulSoup 으로 html 파싱
89+
soup = BeautifulSoup(html, 'html.parser')
90+
91+
# CSS Selector 로 헤드라인 뉴스가 있는 항목 선택
92+
hdline_titles = soup.select('#today_main_news > div.hdline_news > ul > li > div.hdline_article_tit > a')
93+
94+
# 헤드라인 뉴스가 있는 a 태그에서 텍스트만 추출
95+
for title in hdline_titles:
96+
print(title.get_text(strip=True)) # 결과 출력
97+
98+
```
99+
100+
BeautifulSoup은 html을 파싱해주는, 말 그대로 아름다운 패키지 입니다.
101+
102+
html을 파싱 한 후 가장 중요한 것은 우리가 원하는 정보가 있는 곳을 찾는 작업입니다. 개인적으로는 이 작업이 웹 스크래핑에서 가장 시간이 오래 걸리는 부분으로 생각됩니다.
103+
104+
html에서 원하는 정보가 있는 곳을 선택하는 방법으로는 CSS Selector, XPath 등이 있는데, 여기서는 CSS Selector를 이용했습니다. 두 작업 모두 CSS에서 원하는 정보가 있는 곳의 태그, 클래스 이름, 아이디를 찾아내는 작업이 필요합니다. 크롬 개발자도구를 이용하면 보다 편리하게 CSS Selector를 찾아 낼 수 있습니다.
105+
106+
![크롬 개발자도구를 이용한 CSS Selector 찾기](find_css_selector.gif)
107+
108+
크롬 개발자도구를 이용해 찾아낸 CSS Selector는 아래와 같습니다.
109+
110+
```css
111+
#today_main_news > div.hdline_news > ul > li:nth-child(1) > div.hdline_article_tit > a
112+
```
113+
114+
이 셀렉터는 하나의 제목을 가져오는 것이므로, 제목을 모두 가져오기 위해서는 li 태그의 모든 항목을 가져오는 것이 필요합니다. 따라서 이 글에서는 CSS Selector를 아래와 같이 변경 한 후, 코드에 적용하였습니다.
115+
116+
```css
117+
#today_main_news > div.hdline_news > ul > li > div.hdline_article_tit > a
118+
```
119+
120+
보다 자세한 [CSS Selector](https://www.w3schools.com/cssref/css_selectors.asp) 문법은 다음에 다루도록 하겠습니다.
121+
122+
## 마지막으로
123+
124+
이 글에서는 웹페이지로부터 원하는 정보를 추출 해내는 스크래핑의 간단한 예제를 살펴보았습니다. 여기서 원하는 url을 순차적으로 탐색하는 크롤링 기능만 넣으면 쓸만한 웹 크롤러를 만들 수 있습니다. 웹 크롤링에서 가장 중요한 것은 대상이 되는 서버에 많은 부담을 주지 않는 것과, 해당 웹사이트에서 크롤링을 원하지 않는 자료는 크롤링 하지 않는 것입니다. 서버에 부담을 주지 않는 것은 크롤러에 일정 딜레이를 주어서 해결 할 수 있고, 해당 웹사이트에서 크롤링에 대해 어떤 정책을 가지고 있는지는 웹사이트의 robot.txt를 참고하면 알 수 있습니다.
125+
126+
웹 크롤링을 보다 쉽게 만들어주는 [Scrapy](https://scrapy.org/) 프레임워크 사용 방법에 대해서도 추후에 다루도록 하겠습니다.
9.89 MB
Loading

content/blog/개발/맥북에서_파이썬_개발환경_세팅.md

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ description: 맥북 포맷부터 개발환경 설정까지
88
99
이 글에서는 파이썬 패키지의 버전관리를 위한 파이썬의 가상환경 설정이 주를 이루고 있지만, 제가 맥북을 포맷하고 설정을 한 순서대로 모든 과정을 설명 드리겠습니다.
1010

11-
1211
## 1. 맥북 포맷
1312

1413
맥북을 포맷 하는 방법은 시작시에 리커버리모드로 진입 해서 재설치 하는 방법이 있지만, 왠지 모를 깔끔함을 위해서 USB를 이용하여 OS를 재설치하는 방법을 택했습니다.\
@@ -17,9 +16,11 @@ description: 맥북 포맷부터 개발환경 설정까지
1716

1817
MacOS Catalina(10.15.2)를 설치 하였는데, 이전 버전과 가장 다른점은 터미널의 기본 쉘이 bash에서 zsh로 변경 되었다는 점입니다. 기본적인 파이썬과 zsh의 버전은 다음과 같습니다.
1918

20-
zsh 5.7.1
21-
python 2.7.16
22-
python 3.7.3
19+
```text
20+
zsh 5.7.1
21+
python 2.7.16
22+
python 3.7.3
23+
```
2324

2425
![catalina_versions](catalina_versions.png)
2526
<p style="text-align:center;"> zsh과 python의 버전. (oh my zsh 설치전) </p>
@@ -28,7 +29,9 @@ MacOS Catalina(10.15.2)를 설치 하였는데, 이전 버전과 가장 다른
2829

2930
맥에서 Command Line Tools for Xcode를 설치하면, 개발에 필요한 툴들이 설치가 된다고 합니다. 정확하게 어떤 툴 들이 설치가 되는지는 잘 모르겠지만, gcc, make, git 등의 명령어를 사용 할 수 있다고 합니다. 저는 git을 사용하기 위해서 Command Line Tools를 설치 하였고, 다음과 같은 명령어를 사용하였습니다.
3031

31-
xcode-select --install
32+
```bash
33+
xcode-select --install
34+
```
3235

3336
## 3. VS Code 설치
3437

@@ -37,9 +40,11 @@ MacOS Catalina(10.15.2)를 설치 하였는데, 이전 버전과 가장 다른
3740
VS Code를 설치 후에 무엇보다 추천드리는 설정은 shell 에서 쓸 수 있는 code 명령어를 설치 하는 것입니다. Code 명령어를 설치하면, 터미널에서 현재폴더 전체를 VS Code로 실행하는 것이 명령어 하나로 가능 해 집니다.\
3841
[맥 터미널에서 code 명령어 사용하기](https://code.visualstudio.com/docs/setup/mac)
3942

40-
1. VS Code를 실행한다.
41-
2. F1을 눌러서 명령어 팔레트를 띄운다.
42-
3. shell command를 입력 한 뒤에, Install 'code' command in PATH를 선택하여 실행한다.
43+
```text
44+
1. VS Code를 실행한다.
45+
2. F1을 눌러서 명령어 팔레트를 띄운다.
46+
3. shell command를 입력 한 뒤에, Install 'code' command in PATH를 선택하여 실행한다.
47+
```
4348

4449
![shell command](shell-command.png)
4550

@@ -56,8 +61,10 @@ code .
5661

5762
가상환경의 설치 방법은 크게 두가지가 있습니다.
5863

59-
1. 파이썬에 내장 모듈인 venv를 이용한다.
60-
2. virtualenv 패키지를 이용한다.
64+
```text
65+
1. 파이썬에 내장 모듈인 venv를 이용한다.
66+
2. virtualenv 패키지를 이용한다.
67+
```
6168

6269
저는 두 번째 방법을 선호하는데, 이유는 다음과 같습니다. virtualenv를 사용하면, python 버전을 선택 할 수 있고, 기본적으로 설치되는 pip, setuptools, wheel의 버전을 최신 버전으로 설치 할 수 있습니다.
6370

@@ -112,10 +119,12 @@ nvm install --lts
112119
```
113120

114121
## 6. 원활한 AWS 이용을 위한 Credential 설정
122+
115123
AWS 서비스를 사용하려면 인증키가 반드시 필요합니다. 인증키를 환경변수에 등록 해 두시면, 인증의 귀찮음에서 벗어나서 원활하게 AWS 서비스를 사용 하실 수 있습니다. 개인적으로는 보안이 조금 걱정되긴 하지만, 노트북 관리를 잘 하시거나, 분실시에는 인증키를 제거하시면 될 것 같습니다.\
116124
[AWS 인증키 환경변수로 등록하기](https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-configure-envvars.html)
117125

118126
~/.zshrc 파일이나 ~/.bashrc 파일에 아래와 같이 환경변수 설정을 넣어 두시면 됩니다.
127+
119128
```shell
120129
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
121130
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
@@ -135,4 +144,4 @@ sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/too
135144
## 마지막으로
136145

137146
이 글이 저처럼 버전 관리에 힘들었던 분들에게 도움이 되면 좋겠습니다.\
138-
긴 글 끝까지 읽어주셔서 감사드립니다.
147+
긴 글 끝까지 읽어주셔서 감사드립니다.

0 commit comments

Comments
 (0)