반응형
파이썬 웹페이지 추출하기
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이다.
반응형
'Language > Python' 카테고리의 다른 글
파이썬 SQLite3 DBMS로 저장하기 (0) | 2020.09.01 |
---|---|
파이썬 XML을 이용하여 기상청 데이터 스크래핑하기 (0) | 2020.09.01 |
파이썬 정규 표현식을 사용하기 위한 re 모듈 (0) | 2020.09.01 |
파이썬 웹 페이지에서 데이터 추출하기 (0) | 2020.09.01 |
주피터 노트북 테마 변경 및 종류 (0) | 2020.08.31 |
주피터 노트북 단축키 정리 (0) | 2020.08.31 |
파이썬 버블정렬 Python Bubble Sort (0) | 2020.05.22 |
파이썬(Python) 최대공약수와 최소공배수 (1) | 2019.12.05 |
최근댓글