Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python urllib.request 모듈 완벽 가이드: 인터넷 접근부터 API 데이터 가져오기까지


소개

Python에서는 urllib.request 모듈을 사용해 URL에 접근하고 열 수 있습니다. 이때 대부분의 URL은 HTTP 프로토콜을 기반으로 동작합니다.

이 모듈의 가장 큰 장점은 인터페이스가 매우 단순하다는 것입니다. 핵심 역할을 하는 urlopen 함수 하나만으로도 다양한 프로토콜을 통해 여러 종류의 URL을 손쉽게 가져올 수 있어, 초보자도 부담 없이 배우고 활용할 수 있습니다.

실제로 여러 기능을 직접 사용해 보면 어떤 식으로 동작하는지 훨씬 명확하게 이해할 수 있습니다. 지금부터 하나씩 살펴보겠습니다.

시작하기

urllib 라이브러리는 Python에 기본적으로 포함되어 있는 표준 라이브러리입니다. 따라서 별도의 설치 과정 없이 바로 import해서 사용할 수 있습니다.

만약 환경에 문제가 있어 재설치가 필요하다면, 터미널을 열고 아래 명령어를 실행하세요.

pip install urllib

설치가 완료되면 필요한 모듈을 import하고 스크립트 작성을 시작할 수 있습니다.

urllib.request 모듈 살펴보기

urllib.request는 주로 URL을 열고 데이터를 읽거나 웹 페이지의 소스 코드를 확인할 때 사용됩니다. 특히 API로부터 데이터를 가져와야 할 때 그 진가를 발휘합니다.

다음은 공개 농담(joke) API를 호출하는 간단한 예제입니다.

import urllib.request
request_url = urllib.request.urlopen('https://official-joke-api.appspot.com/random_ten')

위 코드는 해당 API에 접속해 데이터를 읽어 옵니다. 응답 내용을 화면에 출력하고 싶다면 아래처럼 작성하면 됩니다.

print(request_url.read())

참고: read() 메서드는 값을 바이트(byte) 형식으로 반환합니다. 사람이 읽기 좋은 일반 텍스트로 변환하려면 decode() 함수를 함께 사용해야 합니다.

print(request_url.read().decode())

또한 이렇게 가져온 데이터를 파일로 저장해 두었다가, 나중에 정규표현식(RegEx) 등을 이용해 필요한 정보만 추출하는 방식으로 활용할 수도 있습니다.

예제: API 데이터를 파일로 저장하기

아래 예제는 API에서 데이터를 가져와 디코딩한 뒤, 텍스트 파일로 저장하는 전체 과정을 보여줍니다.

import urllib.request
data = urllib.request.urlopen('https://official-joke-api.appspot.com/random_ten')
data = data.read().decode()
print(data)
file = open("content.txt", "w+")
file.write(data)
file.close()

참고: urlopen()은 HTTP뿐 아니라 HTTPS, FTP 등 다양한 프로토콜의 URL에도 동일한 방식으로 접근할 수 있습니다. 프로토콜이 달라져도 함수 사용법은 완전히 같습니다.

URL에 데이터 전송하기

CGI(Common Gateway Interface) 환경에서 작업하다 보면 URL에 데이터를 전송해야 하는 경우가 있습니다. 이는 HTTP에서 POST 요청을 보내는 방식과 본질적으로 같습니다.

이런 작업은 urllib.request 모듈과 urllib.parse 모듈을 함께 사용하면 간단히 구현할 수 있습니다. 먼저 필요한 모듈을 import하는 것부터 시작해 보겠습니다.

POST 요청 예제

import urllib.parse
import urllib.request
url = 'https://www.google.com/cgi-bin/register.cgi'
values = {'name': 'S Vijay Balaji', 'language': 'Python'}
data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data)
with urllib.request.urlopen(req) as response:
    the_page = response.read()

위 코드는 딕셔너리 형태의 값들을 urlencode()로 인코딩한 후 Request 객체에 담아 전송합니다. 요청이 정상적으로 처리되면 응답으로 해당 URL의 소스 코드를 받아올 수 있습니다.

마무리

urllib.request 모듈은 인터넷상의 리소스에 접근해 데이터를 가져올 수 있다는 점에서 매우 유용한 도구입니다.

API 응답을 파싱하거나, 웹 페이지의 소스 코드를 읽어 내용을 스크래핑하는 작업에서 특히 널리 활용됩니다. 실제로 다양한 API에서 데이터를 추출하는 프로젝트(https://github.com/SVijayB/Steam_WebScraper)에서도 이 모듈이 사용되었습니다.

urllib.request에는 이 외에도 다양한 함수와 기능이 포함되어 있습니다. 더 깊이 학습하고 싶다면 공식 문서(https://docs.python.org/3/library/urllib.request.html)를 참고해 보시기 바랍니다.