웹 페이지 추출
- 웹 페이지를 추출 시 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가 기본 모듈로 제공
- 대용량 데이터 및 트랜잭션 처리 부적합
- 경량 데이터 및 트랜잭션 처리, 교육용 목적 등으로 사용
파이썬 스크래핑 프로세스
- 웹페이지 크롤링 - fetch(url)
- 스크래핑 - scrape(html)
- 데이터 저장 - 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
'공공빅데이터 청년인턴십 > 웹 크롤링' 카테고리의 다른 글
[7/19] Python으로 배우는 외부데이터 수집과 정제(2) (0) | 2022.07.19 |
---|