호쌤
호쌤 Just For Fun

[Python 데이터 수집] HTTP 통신을 활용한 웹 데이터 수집

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Python 데이터 수집] HTTP 통신을 활용한 웹 데이터 수집≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

[Python 데이터 수집] HTTP 통신을 활용한 웹 데이터 수집

Python의 requests 모듈을 사용하면 HTTP 통신을 사용하여 웹 페이지, Open API, 이미지 등 다양한 형식의 자원에 접근할 수 있습니다.

웹에서 수집할 수 있는 데이터의 형식

형식 설명
TEXT 단순 텍스트 파일을 내려받아서 문자열 변수에 저장해야 함
CSV, XLSX Pandas가 자체적으로 처리 가능
JSON requests 모듈을 통해 데이터를 받아온 후 JSON 클래스를 통해 DataFrame으로 변환
HTML(일반 웹 페이지), XML requests 모듈을 통해 문자열 형태로 내려받고, BeautifulSoup 클래스를 통해 데이터 추출
이미지, 동영상 requests 모듈을 통해 직접 파일 다운로드 구현

requests 모듈

HTTP(웹) 통신 기능을 제공하는 파이썬 패키지.

명령프롬프트를 실행한 후 다음의 명령어로 설치

1
pip install --upgrade requests

-- upgrade 옵션은 이미 설치가 되어 있다면 최신버전으로 교체하는 옵션

#01. 필요한 패키지 가져오기

1
import requests                # 통신 기능 제공

#02. 간단한 텍스트 데이터 가져오기

1) 텍스트 데이터 URL

1
simple_text_url = "http://itpaper.co.kr/demo/py/simple_text.txt"

2) 특정 웹 페이지에 접속

통신 결과를 저장하고 있는 객체가 반환된다.

1
2
r = requests.get(simple_text_url)
r
▶ 출력결과
1
<Response [200]>

3) 접속에 실패한 경우에 대한 예외처리

통신결과 객체에 내장된 상태코드(status_code)값을 활용하여 통신의 성공/실패 여부를 판단한다.

  • 200: OK
  • 400, 403: 잘못된 접근 혹은 접근 권한 없음.
  • 404: Page Not Found (URL 오타)
  • 50x: Server Error (접속 대상이 에러인 상황)
1
2
3
4
5
if r.status_code != 200:
    # 에러코드와 에러메시지 출력
    print("[%d Error] %s" % (r.status_code, r.reason))
    # 프로그램 강제 종료 (Jupyter가 재시작됨)
    quit()

4) 텍스트 데이터 추출

수집한 컨텐츠의 인코딩 형식을 파이썬에게 알려준 후 텍스트를 추출한다.

인코딩 형식은 해당 데이터가 문자열을 부호화(2진수로 변환)하는데 사용한 변환방법으로, 인코딩 형식을 파이썬에게 알려줘야 해당 방법을 사용해 데이터를 문자열로 복호화 할 수 있다.

일반적인 인코딩 형식은 “utf-8”(다국어지원)이 대부분이며 드물게 “euc-kr”,”euc-ch”,”euc-jp”등을 사용하는 경우가 있다.

1
2
3
4
5
# 인코딩 형식 지정 (대상 파일이 저장된 방식을 명시해야 함)
r.encoding = "utf-8"

# 텍스트 출력
r.text
▶ 출력결과
1
'Hello Python~!!!\n안녕하세요. 파이썬~!!!\n'

5) 웹 페이지의 URL을 지정한 경우

웹 브라우저의 화면 빈 공간에서 마우스 우클릭 후 페이지 소스보기 메뉴를 실행하면 해당 웹 페이지를 구성하는 HTML 소스코드를 확인할 수 있다.

웹 브라우저는 웹 서버로부터 HTML 소스코드를 전달받아 그래픽으로 변환하여 사용자에게 보여주는 역할을 하기 때문에 그래픽 처리 기능이 없는 requests 모듈은 웹 서버로부터 전달받은 HTML 소스코드를 그대로 반환한다.

png

png

그러므로 웹 페이지의 컨텐츠를 수집하기 위해서는 HTML 소스코드를 파악하고 분석해야 하기 때문에 HTML,CSS 등의 선행 지식이 반드시 필요하다.

#03. 파일 다운로드

HTML 웹 페이지, JSON 형식의 Open API, txt 파일 등은 텍스트 형식으로 식별되지만, pptx, pdf, 이미지 파일등은 직접 다운로드 처리 형태로 수집해야 한다.

그 밖에 일반 텍스트 형식의 파일도 필요한 경우 다운로드 형태로 구현할 수 있다.

1) 데이터 가져오기

1
2
3
4
5
6
7
8
9
10
# 다운로드 할 대상의 URL
file_url = "http://www.itpaper.co.kr/demo/py/grade.csv"

# URL에 파일을 다운로드 하기 위해 접속
r = requests.get(file_url, stream=True)

# 접속에 실패한 경우
if r.status_code != 200:
    print("[%d Error] %s" % (r.status_code, r.reason))
    quit()

2) raw 데이터 저장하기

특별한 출력결과 없음. 지정한 경로에 다운로드 된 파일을 확인하세요.

여기서는 현재 작성중인 소스파일과 동일한 폴더내에 저장됨

1
2
3
4
5
6
7
8
# 수집 결과의 바이너리(이진값) 데이터를 추출
data = r.raw.read()

# 추출한 데이터를 저장
# -> 'w': 텍스트 쓰기 모드, 'wb': 바이너리(이진값) 쓰기 모드
with open("다운받은파일.csv", 'wb') as f:
    f.write(data)
    print("다운로드 완료")
▶ 출력결과
1
다운로드 완료

현재 파이썬 소스코드(혹은 jupyter 파일)이 위치하는 디렉토리에 파일이 저장되어 있는 것을 확인해야 한다.

png

#04. Session 처리

Session이란 브라우저가 웹 사이트에 접속할 때 생성되는 통신 단위를 의미.

웹 브라우저와 웹 사이트간에 세션이 생성될 때 웹 브라우저는 웹 사이트에게 자신의 버전 정보를 UserAgent 라는 이름으로 전송한다.

웹 개발자는 UserAgent값을 판별하여 현재 접근한 프로그램의 종류를 파악할 수 있기 때문에 UserAgent값이 알려진 웹 브라우저와 다르다면 사이트는 비정상 접속으로 간주하고 접근을 차단하도록 구현할 수 있다.

파이썬의 requests 모듈은 UserAgent값이 없다.

1) UserAgent값이 없을 경우 접근이 차단되는 페이지에 접근 시도

브라우저로 접속한 경우 정상적인 페이지가 표시되지만 requests 모듈로 접근할 경우는 컨텐츠가 표시되지 않는다.

접근하고자 하는 페이지는 네이버 데이터 랩이다.

png

1
2
3
4
5
6
7
8
r = requests.get("https://datalab.naver.com/keyword/realtimeList.naver?where=main")

if r.status_code != 200:
    print("[%d Error] %s" % (r.status_code, r.reason))
    quit()

r.encoding = "utf-8"
r.text

출력되는 웹 페이지의 소스코드를 확인해보면 접근하려는 URL이 존재하지 않는다는 메시지가 표시된다. 이는 네이버의 해당 페이지가 requests 모듈을 정상적인 웹 브라우저는 아니라고 판단하기 때문이다.

▶ 출력결과

png

2) requests 모듈에 UserAgent값 지정 후 접근하기

requests 모듈에 특정 웹 브라우저의 정보를 담는 UserAgent 값을 강제로 지정하면 대상 웹 페이지는 requests 모듈을 웹 브라우저라고 판단하고 정상적인 컨텐츠를 전달해 준다.

UserAgent값 지정

웹 브라우저의 주소표시줄에 다음의 코드를 입력하고 엔터를 누르면 즉시 확인 가능하다.

1
javascript:document.write(navigator.userAgent);

오타를 포함한 상태로 입력하거나, 복사-붙여넣기로 실행 했을 경우 코드가 동작하지 않고 구글 검색 결과 페이지로 이동하는 경우가 빈번하므로 직접 입력하세요.

png

1
user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36"

Session 객체 만들기

세션객체에 포함된 headers 객체의 update()함수를 사용하여 User-agentreferer값을 지정한다.

  • 현재 세션의 웹 브라우저 정보(User-agent)를 구글 크롬으로 설정
  • 현재 세션의 referer 페이지를 ‘없음’으로 강제 설정

referer는 이전에 머물렀던 페이지 주소를 의미하며 referer값이 없으면 웹 서버는 브라우저에서 직접 URL을 입력한 것으로 간주한다.

1
2
session = requests.Session()
session.headers.update( {'User-agent': user_agent, 'referer': None} )

생성된 Session 객체를 통한 웹 페이지 접근

1
2
3
4
5
6
7
8
r = session.get("https://datalab.naver.com/keyword/realtimeList.naver?where=main")

if r.status_code != 200:
    print("[%d Error] %s" % (r.status_code, r.reason))
    quit()

r.encoding = "utf-8"
r.text

앞서 확인한 결과와 다르게 정상적인 컨텐츠가 표시되고 있는 것을 알 수 있다.

▶ 출력결과

png

이렇게 수집된 HTML 코드에서 우리가 원하는 데이터만 추출하기 위해서는 BeautilfulSoup 라는 패키지를 사용해야 한다. 이는 추후 다루기로 한다.

Rating:

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Python 데이터 수집] HTTP 통신을 활용한 웹 데이터 수집≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

comments powered by Disqus