파이썬 urllib.request 모듈을 이용한 웹페이지 추출
크롤러 : 웹페이지의 하이퍼링크를 순회하면서 웹 페이지를 다운로드 하는 작업
스크레이핑 : 다운로드한 웹페이지에서 필요한 정보를 추출하는 작업
from urllib.request import urlopen
import sys
= urlopen('https://news.daum.net/breakingnews/economic') f
urlopen() 함수는 URL을 인자로 받아 HTTPResponse 자료형의 객체를 반환한다.
= f.info().get_content_charset(failobj="utf-8")
encoding print('encoding:', encoding, file=sys.stderr)
encoding: utf-8
HTTPResponse의 content-type을 참조하면 인코딩 방식을 알아낼 수 있다.
인코딩 방식이 설정되있지 않다면 자동으로 utf-8을 사용하도록 설정한다.
= f.read().decode(encoding)
text # print(text) #너무 길어서 주석처리
.decode(인코딩방식)을 입력해주면 HTTPResponse에서 bytes 자료형이었던 문자열을 str 자료형으로 디코딩 해준다.
HTTPResponse의 content-type의 정보가 항상 맞지 않는 경우가 있다. 이럴땐 meta태그에서 명시된 인코딩 방식을 추출할 수 있다.
import re
= urlopen('https://news.daum.net/breakingnews/economic')
f = f.read() bytes_content
일단 bytes 자료형을 변수에 저장한다.
= bytes_content[:1024].decode('ascii', errors='replace') scanned_text
meta태그에서 인코딩 방식은 charset=“~”형태로 명시되 있는데 HTML 앞부분에 적혀 있는 경우가 많다. 그래서 1024바이트 부분까지 슬라이싱 하여 ascii문자로 디코딩 한다. ascii범위 외 문자는 대체(replace)되어 예외가 없다.
= re.search(r'charset=["\']?([\w-]+)', scanned_text)
match 1) match.group(
'utf-8'
정규 표현식을 통해 charset=값을 추출한다. 확인해보면 utf-8임을 알 수있다.
if match:
= match.group(1)
encoding else:
= 'utf-8'
encoding
= bytes_content.decode(encoding)
text # print(text)
만약 charset이 명시되지 않았다면 utf-8을 사용한다.
print(text)를 통해 html형식의 문자열을 확인할 수 있다.
For attribution, please cite this work as
nackta (2021, July 12). nackta blog: urllib으로 웹페이지 추출. Retrieved from https://nackta.github.io/posts/2021-07-12-python-crawler1/
BibTeX citation
@misc{nackta2021urllib으로, author = {nackta, }, title = {nackta blog: urllib으로 웹페이지 추출}, url = {https://nackta.github.io/posts/2021-07-12-python-crawler1/}, year = {2021} }