반응형

안녕하세요, 츄르 사려고 코딩하는 집사! 코집사입니다.


파이썬 웹페이지 추출하기


1. 웹페이지 추출

> 웹페이지 추출 시 HTTP 헤더와 HTML의 meta 태그를 기반으로 인코딩 방식을 판별이 필요하다.

> 표준 라이브러리 urllib.request 모듈을 사용하여 웹페이지를 추출한다.

> urllib.request에 포함되어 있는 urlopen() 함수에 url을 지정하면 웹 페이지 추출이 가능하다.

> HTTP 헤더를 변경 불가, Basic 인증을 사용을 위한 복잡한 처리가 필요하다.

> HTTP 헤더 변경 및 Basic 인증을 위해 urllib 대신 Requests 모듈 사용이 필요하다.

> HTTPResponse.read() 메서드로 추출할 수 있는 본문은 bytes 자료형이다.

> 문자열(str 자료형)로 다루려면 문자 코드를 지정해서 디코딩 필요

> HTML5같은 경우 UTF-8로 디코딩이 가능

> HTTP 헤더를 참조하여 인코딩 방식으로 디코딩

 

from urllib.request import urlopen

f = urlopen('https://www.naver.com')
# urlopen() 함수는 HTTPResponse 자료형의 객체를 반환
# 파일 객체이므로 open() 함수로 반환되는 파일 객체처럼 핸들링 type(f)

type(f)

# read() 메서드로 HTTP 응답 본문(bytes 자료형)을 추출
# HTTP 연결은 자동으로 close 되므로 별도의 close() 함수를 호출
# f에 들어간 내용을 추출
f.read()

f.status 
#f.status는 HTML 오류 코드를 의미함
#200은 정상으로 응답을 받았음을 의미
#404는 Not Found
#400은 Bad Request를 의미

f.getheader('Content-Type')

 

 


HTTP 헤더에서 인코딩 방식 추출하기


import sys
from urllib.request import urlopen

f = urlopen('https://www.naver.com')

#인코딩하다가 오류가 발생하면 utf-8로 간주
encoding = f.info().get_content_charset(failobj="utf-8")

text = f.read().decode(encoding)

print(text)

 

 

디코딩을 하기 전 사진과 비교를 하면, 한글이 디코딩되어 나타난 것을 확인할 수 있다.

 

 


Meta 태그에서 인코딩 방식 추출


import sys
import re
from urllib.request import urlopen

f = urlopen('https://www.naver.com')
# bytes 자료형의 응답 본문을 일단 변수에 저장
bytes_content = f.read()

# charset은 HTML의 앞부분에 적혀 있는 경우가 많으므로 응답 본문의 앞부분 1024바이트를 ASCII 문자로 디코딩
#ASCII 범위 이위의 문자는 U+FFFD(REPLACEMENT CHARACTER)로 변환되어 예외가 발생하지 않음
scanned_text = bytes_content[:1024].decode('ascii', errors='replace')

#디코딩한 문자열에서 정규 표현식으로 charset 값을 추출
match = re.search(r'charset=["\']?([\w-]+)', scanned_text)

match.group(1)

if match:
    encoding = match.group(1)
else :
    encoding = 'utf-8'

decode('ascii', errors='replace or ignore')이 있다.

error의 default는 strict이다.

 

 

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기