웹 페이지 추출

  • 웹 페이지를 추출 시 HTTP 헤더와 HTML의 meta 태그를 기반으로 인코딩 방식을 판별 필요
  • 표준 라이브러리 urllib.request 모듈을 사용하여 웹 페이지 추출
  • urllib.request에 포함돼 있는 urlopen() 함수에 URL을 지정하면 웹 페이지 추출 가능
  • HTTP 헤더를 변경 불가, Basic 인증을 사용을 위한 복잡한 처리 필요
  • HTTP 헤더 변경 및 Basic 인증을 위해 urllib 대신 Requests 모듈 사용 필요

 

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

  • HTTP 응답의 Content-Type 헤더를 참조하면 해당 페이지의 인코딩 방식을 확인 가능
  • 한국어가 포함된 페이지의 일반적인 Content-Type 헤더 - text/html, text/html ; charset=UTF-8, text/html ; charset=EUC-KR
  • UTF-8과 EUC-KR이 해당 페이지의 인코딩 방식
  • 인코딩이 명시돼 있지 않은 경우 UTF-8 인코딩으로 간주
  • HTTPMessage 객체의 get_content_charset() 메서드를 사용하여 인코딩 추출 가능

 

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

  • 웹 서버 설정에 따라 HTTP 헤더의 Content-Type 인코딩과 실제 사용되고 있는 인코딩 형식 상이
  • 브라우저는 HTML 내부의 meta 태그 또는 응답 본문의 바이트열 확인을 통해 최종 인코딩 방식 결정 및 화면 출력
  • 디코딩 처리에서 UnicodeDecodeError 발생 시 이러한 방식으로 구현 가능
  • HTML meta에 명시되는 인코딩 형식 - <meta charset="utf-8">, <meta http-equiv="Content-Type" content="text/html ; charset=EUC-KR">

 

정규식(Regular expressions, Regex 또는 Regexp)

: 검색된 텍스트로부터 정보를 추출하는데 매우 유용하게 사용가능한 표현식

- 특정 검색 패턴(ASCII 또는 유니코드 문자의 시퀀스)에 대한 하나 이상의 일치 항목을 검색

 

RSS(Really Simple Syndication, Rich Site Summary)

: 뉴스나 블로그 등 업데이트가 빈번한 사이트에서 주로 사용하는 콘텐츠 표현 방식

  • 구독자들에게 업데이트된 정보를 용이하게 제공하기 위해 XML 기반으로 정보 표현 및 제공
  • RSS 서비스를 이용하면 업데이트된 정보를 찾기 위해 홈페이지를 일일이 방문하지 않아도 업데이트 될 때마다 빠르고 편리하게 확인 가능
  • 브라우저에 확장 프로그램으로 제공되기도 함

 

CSV(Comma-Seperated Values)

: 하나의 레코드를 한 라인에 저장하는 테스트 포맷 파일

  • 각 라인의 컬럼값은 쉼표(콤마) 등의 구분자를 사용
  • 데이터 내에 쉼표 등의 구분자 사용하는 문자가 포함되어 있다면 파싱 시 문제가 발생
  • 데이터 내에 쉼표 등의 문자가 포함되어 있는 경우 TSV(Tab-Seperated Values) 형식 사용 필요

 

JSON(JavaScript Object Notation)

: key-value 형식의 데이터 객체를 저장, 전달하기 위해 텍스트 형식의 개방형 표준 포맷

: 플랫폼 및 프로그래밍 언어 독립적 데이터 포맷

JSON 데이터 타입 - 문자열(string), 숫자(number), 객체(JSON object), 배열(array), 불리언(Boolean), null

 

SQLite3 DBMS

: 파일시스템 기반의 경량 관계형 DBMS

  • 경량 관계형 DBMS로 스마트폰 등의 embedded 환경에서 널리 사용
  • 파이썬에서는 SQLite3가 기본 모듈로 제공
  • 대용량 데이터 및 트랜잭션 처리 부적합
  • 경량 데이터 및 트랜잭션 처리, 교육용 목적 등으로 사용

 

파이썬 스크래핑 프로세스

  1. 웹페이지 크롤링 - fetch(url)
  2. 스크래핑 - scrape(html)
  3. 데이터 저장 - save(db_path, books)

 

HTML 스크래핑

lxml: C언어로 작성된 XML 처리와 관련된 라이브러리인 libxml2와 libxslt의 파이썬 바인딩

  • lxml.etree: ElementTree를 확장한 API를 가진 XML 파서
  • lxml.html: xml.etree를 기반으로 invalid HTML도 다룰 수 있게 해주는 HTML 파서
  • lxml.objectify: 트리를 객체 계층으로 다룰 수 있게 해주는 XML 파서
  • lxml.sax: SAX 형식의 XML 파서

Beautiful Soup: 간단하고 이해하기 쉬운 직관적인 API를 활용해 데이터 추출 가능

파서 매개변수 특징
표준 라이브러리의 html.parser 'html.parser' 추가 라이브러리 불필요
lxml의 HTML 파서 'lxml' 빠른 처리가 가능
Lxml의 XML 파서 'lxml-xml' 또는 'xml' XML에 대해 빠른 처리가 가능
html5lib 'html5lib' Html5lib(https://pypi.python.org/pypi/html5lib)을 사용해 HTML5의 사양에 맞게 파싱 가능

 

URL 구조

http :// example.com / main/index ? q=python # lead

스키마       어서리티              경로                쿼리       플래그먼트

URL 구성요소 설명
schema http 또는 https와 같은 프로토콜
authority 도메인 명 : 포트 번호
path 호스트 내부에서의 리소스 경로
query ? 뒤에 나오는 경로와는 다른 방법으로 리소스를 표현하는 방법
flagment # 뒤에 나오는 리소스 내부의 특정 부분

 

절대 URL과 상대 URL

  • 절대 URL: https:// 등의 스키마로 시작하는 URL
  • 상대 URL: 절대 URL을 기준으로 상대적인 경로를 잡는 URL - //로 시작, /로 시작, 그 외의 상대 경로 형식 사용

 

퍼머링크(Permalink)

: 하나의 콘텐츠에 대응되며, 시간이 흘러도 대응되는 콘텐츠가 변하지 않는 URL

  • 최근의 웹 사이트는 하나의 콘텐츠가 하나의 URL에 대응
  • "불변"이라는 영어 단어 "퍼머넌트(Permanent)"와 "링크(Link)"를 조합
  • 퍼머링크를 가진 웹 사이트는 구글 등의 검색 엔진의 크롤러가 콘텐츠 인식 용이
  • 페이스북과 트위터 등의 소셜 미디어에 콘텐츠를 공유할 때도 사용 가능하므로 많은 웹 사이트가 퍼머링크를 사용

 

[오늘의 실습 모음]

WebCrawling_실습(1)~(5)

https://github.com/thumb-chuu/BigData-Internship_WebCrawling

 

GitHub - thumb-chuu/BigData-Internship_WebCrawling

Contribute to thumb-chuu/BigData-Internship_WebCrawling development by creating an account on GitHub.

github.com

 

+ Recent posts