설명
파이썬 URL 제어 모듈
HTTP, FTP, SMTP 등과 같은 프로토콜을 사용하여 URL을 열고 읽고 쓰는 기능을 제공
HTTP(HyperText Transfer Protocol) : 웹 상에서 문서, 이미지, 동영상 등 다양한 리소스를 전송하기 위한 프로토콜
FTP (File Transfer Protocol) : 컴퓨터 간에 파일을 송수신하기 위해 사용되며, 로컬과 원격 시스템 간의 파일 전송을 쉽게 가능
SMTP (Simple Mail Transfer Protocol) : 이메일 클라이언트와 메일 서버 간의 통신에 사용되며, 메일 서버에서 메일 서버로 메시지를 전달하는 프로토콜
메서드 → 객체
urllib.request
•
다양한 방식으로 URL을 열고 데이터를 가져오는 기능 제공
# 1번
from urllib.request import urlopen # urlopen 함수 호출
response = urlopen('http://www.google.co.kr') # 바로 문자열 대입
# 2번
from urllib.request import Request, urlopen # urlopen 함수, Request 클래스 호출
req = Request('http://www.google.co.kr') # Request 클래스를 사용하여 req 생성
response = urlopen(req) # urlopen 함수 사용
# 반환값 : 200
Python
복사
urllib.request.urlopen(’문자열’) → HTTPResponse 객체
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
Python
복사
•
URL을 열어서 HTTPResponse 객체를 반환하는 함수
•
HTTP, HTTPS, FTP 등의 프로토콜을 지원
•
받는 인자 : 열고자 하는 URL을 나타내는 문자열
from urllib.request import urlopen
response = urlopen('http://www.google.co.kr')
print(response)
# 반환값 : <http.client.HTTPResponse at 0x25e63f57c18>
Python
복사
HTTPResponse 객체.read()
•
응답 본문을 가져올 수 있음.
•
웹 페이지 HTML 코드를 읽어옴.
...
response.read().decode("utf-8")
'''
반환값 :
'\n<!doctype html> <html lang="ko" data-dark="false"> <head>
<meta charset="utf-8"> <title>NAVER</title> <meta http-equiv="X-UA-Compatib
le" content="IE=edge"> <meta name="viewport" content="width=1190"> <meta nam
e="apple-mobile-web-app-title" content="NAVER"/> <meta name="robots" content="
index,nofollow"/> <meta name="description" content="네이버 메인에서 다양한 정보
와 유용한 컨텐츠를 만나 보세요"/> <meta property="og:title" content="네이버"> <me
ta property="og:url" content="https://www.naver.com/"> <meta property="og:imag
e" content="https://s.pstatic.net/static/www/mobile/edit/2016/0705/mobile_2128
52414260.png"> <meta property="og:description" content="네이버 메인에서 다양한 정
보와 유용한 컨텐츠를 만나 보세요"/> <meta name="twitter:card" content="summary"> <
meta name="twitter:title" content=""> <meta name="twitter:url" content="https:/
/www.naver.com/"> <meta name="twitter:image" content="https://s.pstatic.net/s
tatic/www/mobile/edit/2016/....
'''
Python
복사
HTTPResponse 객체.status()
from urllib.request import urlopen
response = urlopen('http://www.google.co.kr')
response.status
# 반환값 : 200
Python
복사
urllib.request.urlretrieve()
•
url이 가리키는 주소에 접근해서 해당 자원을 로컬 컴퓨터에 저장 가능.
해당 메서드를 이용하여 이미지를 저장하는 것이 가능
import urllib.request
url = "--마우스우클릭으로 이미지 주소 복사한 내용--"
savename = "./저장할이미지이름.jpg"
# url이 가리키는 주소에 접근해서 해당 자원을 로컬 컴퓨터에 저장하기
urllib.request.urlretrieve(url, savename)
print("저장완료!!!")
Python
복사
•
다운 받은 이미지 파일을 메모리에 저장한 후 open을 활용하여 파일로 저장
import urllib.request
url = "--마우스우클릭으로 이미지 주소 복사한 내용--"
savename = "./저장할이미지이름.jpg"
image = urllib.request.urlopen(url).read()
# wb는 Write Binary
# text가 아닌 형태는 바이너리로 주어지기 때문에 "wb"를 사용
with open(savename, mode="wb") as f:
#메모리의 이미지를 파일로 저장
f.write(image)
print(저장완료!!)
Python
복사
urllib.error
•
url 접속 오류가 들어있는 객체
•
해당 url로 접속이 되지 않을 시 해당 에러를 예외처리하는 데 사용
from urllib.error import HTTPError
from urllib.error import URLError
# 만약 없는 URL를 작성했다면 URLError이 발생되고,
# 사이트의 서버에서 접근을 막았다면 HTTPError가 발생
try:
html = urlopen("https://java.com")
except HTTPError as e: #네이버나 구글같은 곳에서 사이트를 막아놨을 경우
print("HTTP 에러입니다.")
except URLError as e: #존재하지 않는 사이트의 경우
print("존재하지 않는 사이트입니다.")
else: # 정상적으로 연결 시
print(html.read())
'''
반환값 :
java.com의 사이트를 불어온 출력값이 나타난다.
'''
Python
복사
urllib.parse()
•
URL과 파라미터를 다루는 메소드
•
문자열 파싱을 자동으로 해줌.
from urllib import parse
url = parse.urlparse("https://예시도메인/articles/2?test=hanpy&key=abcd")
print (url)
'''
ParseResult(scheme='https', netloc='예시도메인', path='/articles/2', params='', query='test=python&key=abcd', fragment='')
'''
print(url.scheme) # 스키마 정보
print(url.netloc) # 네트워크 위치 정보
print(url.path) # 경로 정보
print(url.params) # 파라미터 정보
print(url.query) # 쿼리 정보
'''
'test=python&key=abcd'
'''
print(url.fragment) # 프래그먼트 정보
Python
복사
parse.parse_qs()
•
parse()의 반환 값을 딕셔너리 형태로 변경
•
쿼리 스트링을 더 쉽게 분석 가능
from urllib import parse
url = parse.urlparse("https://예시도메인/articles/2?test=hanpy&key=abcd")
print(parse.parse_qs(url.query))
'''
{'test': ['python'], 'key': ['abcd']}
'''
Python
복사
parse.quote_plus(), parse.quote
•
인코딩 처리
•
문자열을 %이스케이프를 사용하는 문자열로 변환
•
quote_plus : 띄어쓰기를 +기호로 지환
•
quote : 띄어쓰기를 %20으로 지환
from urllib.parse import quote, quote_plus
print('파이썬은 easy')
print(quote('파이썬은 easy'))
print(quote_plus('파이썬은 easy'))
#output
'''
파이썬은 easy
%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%80%20easy
%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%80+easy
'''
Python
복사
parse.unquote(), parse.unquote_plus()
•
디코딩 처리
•
quote의 반대
•
URL 안전 문자열로 인코딩된 문자열을 디코딩하여 반환
from urllib.parse import unquote, unquote_plus
print(unquote('%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%80%20easy'))
print(unquote_plus('%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%80+easy'))
#output
'''
파이썬은 easy
파이썬은 easy
'''
Python
복사
urllib.robotparser
•
robots.txt 파일의 구문을 분석하여 해당 URL이 로봇에 의해 접근이 가능한지 확인하는 데 사용
robots.txt : 웹 서버에서 제공되는 텍스트 파일, 로봇이 해당 서버의 페이지에 접근할 때 참고하는 지침서
from urllib.robotparser import RobotFileParser
url = 'https://jsonplaceholder.typicode.com/users'
rp = RobotFileParser()
rp.set_url(url + '/robot.txt')
rp.read()
Python
복사
robotparser.can_fetch()
•
해당 URL이 로봇에 의해 접근 가능한지 여부 확인
from urllib.robotparser import RobotFileParser
url = 'https://jsonplaceholder.typicode.com/users'
rp = RobotFileParser()
rp.set_url(url + '/robot.txt')
rp.read()
if rp.can_fetch('*', url):
print('allowed to access', url)
else:
print('not allowed to access:', url)
Python
복사