3.1 HTML/CSS/XPATH
3.1.1 HTML이란?
- HTML은 Hyper Text Markup Language의 약자로 웹 페이지의 구조와 내용을 표현하기 위해 개발된 마크업 언어입니다.
- HTML은 '.html'과 같은 확장자를 가지며, 태그(Tag)와 속성(Attribute), 그리고 태그(Tag)와 속성(Attribute)으로 조합인 요소(Element)로 이루어져 있습니다.
- 아래 코드는 이번 챕터에서 예시로 사용할 아주 간단한 HTML 코드입니다.
요소(Element)
- 요소는 태그와 속성의 조합으로, 시작 태그와 종료 태그 사이에 있는 내용은 요소의 내용(content)로 여겨집니다.
- 아래와 같이 태그와 속성들을 통해 요소가 표현됩니다.
태그(Tag)
- 웹 페이지의 구조를 정의하는 태그는 '<'와 '>' 사이의 키워드로 표현되며, 보통 시작 태그(시작태그)와 종료 태그(종료 태그)로 구성됩니다.
- 시작 태그는 요소(Element)의 시작을, 종료 태그는 요소(Element)의 끝을 알려줍니다. 하지만 어떤 태그들은 종료 태그가 필요 없는 빈 요소로 사용될 수도 있습니다.(br태그, img태그, input 태그 등)
- head: 웹 페이지의 제목을 정의합니다.
- title: 웹 페이지의 제목을 정의합니다.
- body: 웹 페이지의 본문을 정의합니다.
- header: 웹 페이지의 머리글 정의합니다.
- nav: 네비게이션 메뉴를 표현합니다.
- main: 웹 페이지의 주요 콘텐츠를 포함한 section을 감싸고 있습니다.
- section: 섹션의 제목과 내용을 담습니다.
- p: 단락을 나타내며, 각 섹션의 내용을 표시합니다.
- footer: 웹 페이지의 바닥글을 정의합니다.
- h1: 웹 페이지의 큰 제목을 정의합니다.
- h2: 웹 페이지에서 h1 다음으로 큰 제목을 정의합니다.
- h3: 웹 페이지에서 h2 다음으로 큰 제목을 정의합니다.
- h4: 웹 페이지에서 h3 다음으로 큰 제목을 정의합니다.
- h5: 웹 페이지에서 h4 다음으로 큰 제목을 정의합니다.
- h6: 웹 페이지에서 h5 다음으로 큰 제목을 정의합니다.
- div: 문서를 구획으로 나누는 역할을 합니다.
- table: 표를 생성하는 역할을 합니다.
- img: 이미지를 정의합니다.
- a: href 속성을 추가하여 링크의 url을 지정할 수 있습니다.
속성(Attribute)
- 요소에 대한 추가 정보를 제공하고 동작을 제어하는 역할을 하는 속성은 시작 태그에 추가되며, 이름과 값으로 구성됩니다.
- 이미지로 만들어서 넣기(속성 설명)
- class: HTML 요소에 대한 CSS 클래스를 지정합니다. 같은 클래스를 가진 요소들을 그룹화하여 스타일을 적용하거나, 선택할 때 사용됩니다.
- id: HTML에 고유한 식별자를 지정합니다. 고유한 ID를 사용하여 특정 요소를 선택하거나 CSS에서 스타일을 적용할 수 있습니다.
- src: 이미지, 오디오, 비디오 등과 같은 미디어 요소의 소스 파일 경로를 지정합니다.
- href: 링크요소(a 태그)에서 링크 대상 URL을 지정합니다.
- alt: 이미지 요소(img 태그)에서 대체 텍스트를 지정합니다. 이미지가 로드되지 못할 경우 텍스트로 대체되어 텍스트 기반 브라우저나 스크린 리더가 이를 읽을 수 있게 합니다.
- disabled: 입력 요소(input태그, button태그, select태그 등)을 비활성화합니다. 사용자 상호작용이 불가능해지며, 시각적으로도 다른 상태로 표시될 수 있습니다.
- style: HTML 요소에 직접 CSS 스타일을 적용합니다. style 속성 값은 CSS 속성과 값의 쌍으로 구성되며, 해당 요소에만 스타일이 적용됩니다.
- target: 링크 요소(a 태그)에서 링크를 열 위치를 지정합니다. 예를 들어 _blank로 설정하면 링크가 새 창이나 탭에서 열리게 됩니다.
참고 사이트
3.1.2 CSS란?
- 아래 코드는 예시 페이지의 CSS 부분만 가져온 것입니다.
- CSS는 아래 예시와 같이 style 태그 내에 직접 작성하거나 HTML 문서와 별도로 외부 CSS 파일로 작성하여 사용할 수 있습니다.
CSS(Cascading Style Sheets)는 HTML 요소의 스타일, 레이아웃 등의 디자인을 정의하기 위한 스타일 시트 언어로, 선언부(Declaration), 선택자(Selector), 속성(Properties), 값(Values) 으로 구성되어 있습니다.
선언부(Declaration)
- 선택자와 속성, 값의 쌍으로 구성됩니다. 특정 요소에 적용되는 스타일을 정의합니다.
- 선택자와 함께 속성과 해당 속성에 대한 값을 선언하는 것으로 이루어집니다.
- 예를 들어, 다음과 같은 선언부는 p태그 요소의 글꼴 크기를 16px로 지정합니다.
선택자(Selector)
- 특정 HTML 요소를 식별하고 선택하기 위해 사용되는 패턴이나 규칙입니다. 태그 이름, 클래스, ID, 속성 등을 기반으로 요소를 선택할 수 있습니다.
- 정적 크롤링 수행 시 원하는 요소에 접근하기 위해 선택자를 사용합니다.
속성(Properties)
- 스타일을 정의하기 위해 사용되는 특정 스타일 속성입니다. color, font-size, background-color 등이 있습니다.
값(Values)
- 특정 스타일 속성들에 할당되는 값을 말합니다. color 속성에 red, #000000, rgb(255, 0, 0)와 같은 값을 할당하여 색상을 정의할 수 있습니다.
클래스(Class)와 ID
- 선택자(Selector)에서 많이 사용되는 것이 클래스(Class)와 ID입니다. 클래스는
.클래스명
으로 선택되고, ID는#ID명
으로 선택됩니다.
- 클래스는 여러 요소에 동일한 스타일을 적용하기 위해 사용되며, 동일한 클래스 이름을 가진 요소를 선택할 수 있습니다. ID는 고유한 식별자로 하나의 요소에만 적용됩니다.
상속(Inheritance)
CSS에서는 부모 요소로부터 상속되는 스타일 속성이 있습니다. 따라서 부모 요소에 스타일을 적용하면 자식 요소에도 일부 스타일이 상속될 수 있습니다.
우선순위(Cascade)
동일한 요소에 대해 여러 스타일이 적용되는 경우, CSS는 우선순위 규칙을 적용하여 어떤 스타일이 적용될지 결정합니다. 일반적으로 명시도(Specificity), 충돌(Collision) 및 소스 순서(Source Order)에 의해 우선순위가 결정됩니다.
박스 모델(Box Model)
요소가 렌더링될 때, 요소의 내용(content), 안쪽 여백(padding), 테두리(border), 외부 여백(margin)으로 구성된 박스로 간주됩니다. 각각의 영역은 스타일을 통해 크기, 여백 등을 조정할 수 있습니다.
3.1.3 Xpath란?
- XML 문서에서 요소를 선택하고 탐색하기 위한 언어인 XPath는 트리 구조로 구성된 문서의 경로를 사용하여 요소, 속성, 텍스트 등을 식별합니다. (XML: Extensible Markup Language)
- Xpath를 활용하여 HTML 문서의 특정 요소에 대한 경로를 지정할 수도 있어 Python 동적 크롤링 라이브러리 Selenium에서 사용되기도 합니다.
아래 코드는 전체 html 예시 중 한 section만을 잘라서 가져온 것입니다. Xpath 예시는 이 코드를 통해 살펴보겠습니다.
- XPath는 부모-자식, 형제, 조상-자손 등의 노드 관계를 사용하여 경로를 지정할 수 있습니다.
- 예를 들어,
//book
경로는 문서의 모든 book 요소를 선택합니다.
경로 표현식(Path Expression)
- XPath는 경로 표현식을 사용하여 XML 문서의 요소나 노드를 찾습니다. 경로 표현식은 문서 구조를 따라 이동하며, 요소, 속성, 텍스트 등을 선택하는 데 사용됩니다.
노드 관계
- XPath는 부모-자식, 형제, 조상-자손 등의 노드 관계를 사용하여 경로를 지정할 수 있습니다.
- 예를 들어,
//book
경로는 문서의 모든 경로에 있는 book 요소를 선택합니다.
요소(Element) 선택
- XPath를 사용하여 XML 문서에서 특정 요소를 선택할 수 있습니다.
- 예를 들어,
//bookstore/book
경로는 bookstore 요소의 모든 book 요소를 선택합니다.

조건(Condition) 필터링
- 조건을 사용하여 특정 요소를 필터링 할 수 있습니다.
- 예를 들어,
//bookstore/book[price>10]
경로는 bookstore 요소의 모든 book 요소 중 가격이 10보다 큰 요소를 선택합니다.

속성(Attribute) 선택
- XPath는 XML 요소의 특정 속성을 선택할 수도 있습니다.
- 예를 들어,
//bookstore/book/@category
경로는 bookstore 요소의 모든 book 요소의 category 속성을 뜻합니다. 여기에서//booksotre/book/[@category='fiction']
와 같이 조건 필터링을 사용해 category 속성 중 원하는 것을 선택할 수 있습니다.

방금 배운 것을 활용해서 bookstore 안의 원하는 값을 추출해봅시다.
모든 책의 제목 선택하기
- XPath 표현식
//booktitle
은 문서의 모든 booktitle 요소를 선택합니다.
- 즉, "Harry Potter", "The Hobbit", "The Art of War"의 제목을 선택합니다.

특정 카테고리에 속하는 책 선택하기
- XPath 표현식
//book[@category="fiction"]/p/booktitle
은 카테고리가 'fiction'인 모든 booktitle 요소를 선택합니다.
- 즉, 두 개의 book 요소인 "Harry Potter"와 "The Hobbit"을 선택합니다.

가격이 10보다 작은 책의 제목 선택하기
- XPath 표현식
//bookstore/book/p[price<10]/booktitle
은 가격이 10보다 작은 모든 book 요소의 booktitle 요소를 선택합니다.
- 즉, “The Art of War"를 선택합니다.

특정 언어로 작성된 모든 책의 저자 선택하기
- XPath 표현식
//bookstore/book/p/booktitle[@lang="en"]/../author
는 언어가 'en'인 모든 book 요소의 author 요소를 선택합니다. 여기서 ‘..’은 현재 노드의 부모 노드를 선택한다는 의미입니다.
- 즉, "Harry Potter", "The Hobbit", “The Art of War”의 저자인 ‘J.K. Rowling’, ‘J.R.R. Tolkien’, ‘Sun Tzu’를 선택합니다.

첫 번째 책의 가격 선택하기
- XPath 표현식
//bookstore/book[1]/p/price
는 첫 번째 book 요소의 price 요소를 선택합니다.
- 즉, 10.99를 선택합니다.

3.1.4 웹에서 Element, CSS Selector, Xpath 가져오는 방법
3.2 정적 웹 크롤링(bs4, Requests)
웹 크롤링은 웹 상에 있는 데이터를 수집하는 행위를 말합니다. 그리고 웹 상에서 수집하는 데이터의 종류에 따라 정적 웹 크롤링과 동적 웹 크롤링으로 구분됩니다.
먼저, 정적 웹 크롤링은 웹 상의 정적인 데이터를 수집하는 것입니다.
- 접속했을 때 로딩된 데이터만을 대상으로 데이터 수집을 수행하는 웹 크롤링입니다.
- URL 값을 변경해가며 여러 웹페이지를 크롤링 할 때 사용합니다.
Python에서 정적 웹 크롤링을 하기 위해서는 2가지 라이브러리를 알아야 합니다.
3.2.1 requests 라이브러리
- requests 라이브러리는 HTTP 요청을 도와주는 대표적인 라이브러리로 웹 상의 데이터를 받아올 수 있습니다.
- 먼저, requests 라이브러리를 설치해보겠습니다.
- 아래 코드를 실행시키면 해당 URL 웹 서버에 HTTP 요청을 보내고 그에 따른 응답을 받아옵니다.
- reference
Requests: HTTP for Humans™ — Requests 2.31.0 documentation
https://requests.readthedocs.io/en/latest/
3.2.2 beautifulsoup4 라이브러리
- beautifulsoup4 라이브러리는 HTTP 요청을 통해 받아온 데이터에서 수집하고자 하는 데이터만 추출할 수 있도록 도와주는 파싱 라이브러리 입니다.
- 먼저, 라이브러리를 설치해보겠습니다.
- BeautifulSoup은 클래스로 beautifulsoup4(bs4) 라이브러리 안에 있습니다.
BeautifulSoup 클래스에는 필요한 데이터를 쉽게 찾을 수 있도록 도와주는 다양한 메소드들이 존재합니다. 많이 사용하는 메소드 위주로 살펴보겠습니다.
find()
- 태그, 클래스, id, 속성 등을 통해 조건에 해당되는 데이터 하나를 추출하는 메소드입니다.
find_all()
- 태그, 클래스, id, 속성 등을 통해 조건에 해당되는 모든 데이터를 추출하는 메소드입니다.
select_one()
- CSS selector를 사용하여 조건에 해당되는 데이터 하나를 추출하는 메소드입니다.
select()
- CSS selector를 사용하여 조건에 해당되는 모든 데이터를 추출하는 메소드입니다.
- reference
3.3 동적 웹 크롤링(Selenium)
- 동적 웹 크롤링은 웹 상의 동적인 데이터를 수집하는 것입니다. 정적 웹 크롤링과 비교하여 생각하면 이해하기 쉽습니다.
- 정적 웹 크롤링은 클릭이나 스크롤 등 추가적인 동작을 해야 확인할 수 있는 데이터를 크롤링하지 못합니다. 이 때 필요한 것이 동적 웹 크롤링입니다.
- 같은 웹 페이지 상에서 검색 조건이나 값을 바꾸거나 버튼을 클릭하면 팝업창이 나타나는 등 웹 상에 변화가 생깁니다. 하지만 URL에는 변화가 없는 경우가 있습니다. 이런 경우에 동적 웹 크롤링을 사용합니다.
python에서 동적 웹 크롤링을 하기 위해서는 Selenium 라이브러리를 알아야 합니다.
- Selenium 라이브러리는 웹 드라이버를 사용하여 웹 페이지를 조작할 수 있도록 해주는 라이브러리입니다.
- 먼저, Selenium 라이브러리를 설치해보겠습니다.
- 이 라이브러리를 사용하면 동일한 URL에서 변동되는 웹 상의 데이터들을 수집할 수 있습니다.
By 클래스
- Selenium 라이브러리를 사용하여 요소에 접근할 때에는
find_element()
메소드를 사용합니다.
- 그리고 이 메소드는 By 클래스를 함께 사용합니다.
- 원하는 요소를 찾는 여러 방법들 중 많이 사용되는 By.XPATH 예제를 살펴보겠습니다.
Action Chains
- .click, .scrolling, 페이지 넘기기
- .click → url 변동되는…
- reference
3.4 웹 크롤링 주의사항
3.4.1 웹 크롤링의 필요성과 웹 크롤링의 보안·윤리적 문제
- 다양하고 많은 정보들을 모을 수 있다는 것이 웹 크롤링의 장점 중 하나입니다.
- 하지만 웹 상의 데이터 또한 기업이나 개인의 자산이기 때문에 아무 자료나 마음대로 크롤링해서는 안됩니다.
- 위와 같은 이유로 크롤링을 허용하지 않는 사이트들도 존재합니다. 따라서 크롤링을 시작하기 전에 크롤링 가능 여부를 반드시 확인해서 법적 문제에 걸리지 않도록 조심해야 합니다.
3.4.2 웹 크롤링 가능 여부 파악 방법
- 웹 크롤링 가능 여부는 각 사이트의 robots.txt를 통해 확인할 수 있습니다. 이 텍스트 파일은 해당 사이트에 대한 웹 크롤링 국제 권고안입니다.
- 크롤링을 하고자 하는 사이트 URL 뒤에
/robots.txt
를 붙이면 웹 상에 정보가 뜨거나, robots.txt 파일이 다운되어 내용을 확인할 수 있습니다.

- robots.txt 에는 User-agent 와 Disallow, Allow 키워드가 있습니다.
- 각 User-agent에 따라 Disallow/Allow된 경로를 보고, 크롤링 가능 여부를 확인합니다.
몇 가지 예시를 살펴보겠습니다.
- 네이버의 경우, 모든 User에 대해서 최상위 페이지( /, root)로부터 하위의 모든 문서 크롤링을 허용하지 않고 있습니다. 하지만 최상위 페이지에 대해서는 크롤링을 허용하고 있습니다.
- 유튜브의 경우, 이름이 ‘Mediapartners-Google’로 시작하는 크롤링봇에 대해서는 모든 접근을 허용하고 있습니다. 하지만 다른 모든 User에 대해서는 아래에 명시된 페이지(문서)에 대한 크롤링을 허용하고 있지 않습니다.
- URL의 마지막에 robots.txt를 붙였을 때 확인이 되지 않을 때도 있습니다. 이러한 경우에는 문제가 발생할 수도 있는 상황을 고려하여 크롤링을 하지 않는 것을 권장합니다.
- reference
reference (공식문서)
라이브러리 참고 문서
- Requests 라이브러리
Requests: HTTP for Humans™ — Requests 2.31.0 documentation
https://requests.readthedocs.io/en/latest/
- beautifulsoup4 라이브러리
- Selenium 라이브러리

