웹 스크래핑은 웹사이트에서 다양한 형식(예: HTML 형식으로 제공되는 텍스트, 숫자, 이미지, 오디오 또는 비디오)의 대량 데이터를 자동으로 수집하는 과정입니다. YouTube나 eBay를 포함한 대부분의 웹사이트는 상호작용 중 사용자 입력에 따라 데이터를 표시함으로써 동적 콘텐츠를 제공합니다.
웹 스크래핑에 관심이 있다면 셀레늄(Selenium)을 들어본 적이 있을 것입니다. 이는 동적 웹사이트에서 데이터를 추출하기 위한 고급 기술을 제공하는 오픈 소스 웹 스크래핑 도구입니다. 양식 작성, 웹 페이지 탐색, 자바스크립트로 렌더링된 특정 콘텐츠 선택 등 다양한 작업을 수행하여 사용자 상호작용을 시뮬레이션할 수 있습니다.
이 튜토리얼에서는 Selenium Python 패키지를 사용하여 데이터 스크래핑을 시작하는 방법을 알려드립니다.
셀레늄 및 파이썬 환경 설정
셀레니움으로 웹 스크래핑을 시작하기 전에, 파이썬 환경을 설정하고셀레니움 파이썬 패키지및webdriver_manager 파이썬 패키지를 설치해야 합니다. webdriver_manager는 크롬, 파이어폭스, 엣지 등 다양한 웹 브라우저용 바이너리 드라이버를 다운로드하고 관리하는 데 사용되는 파이썬 패키지입니다.
해당 패키지를 설치한 후에는환경 변수와 프록시 서버도 구성해야합니다. 필요한 모든 패키지를 설치하면 브라우저를 실행하고 데이터를 스크래핑할 준비가 된 것입니다.
터미널에서 Python 스크립트 파일(예: web_scrape.py)에 다음 코드를 실행하여 Chrome 브라우저를 자동으로 실행하고 특정 URL의 웹 페이지를 탐색할 수 있습니다:
# 모듈 임포트
from selenium import webdriver
# 크롬 웹드라이버 설정
driver = webdriver.Chrome()
# 웹 페이지 로드
driver.get('https://yourwebsite.com')
# 페이지 소스 출력
print(driver.page_source)
# 드라이버 종료
driver.quit()
위 코드를 실행하려면 터미널에서 다음 명령어를 사용하세요:
python web_scrape.py
이 코드는 Chrome 브라우저를 실행하여 지정된 URL의 웹 페이지를 로드한 후, 로드된 웹 페이지의 HTML을 표시하고 Chrome 드라이버 인스턴스를 종료합니다.
HTML 이해 및 요소 찾기
HTML은 태그로 둘러싸인 요소(예 : <h1> 내용 </h1>)를 사용하여 웹 콘텐츠를 구조화합니다. 이러한 요소들은 콘텐츠를 계층적 구조로 구성하여 웹 페이지의 레이아웃, 서식 및 상호작용을 정의합니다.
브라우저에서 웹 페이지의 HTML 태그를 찾으려면, 찾고자 하는 요소를 마우스 오른쪽 버튼으로 클릭하고‘검사’(또는 사용 중인 브라우저에 따라 유사한 기능)를선택하세요. 이렇게 하면 브라우저의 개발자 도구가 열리며, 여기서 HTML 코드를 확인하고 특정 태그를 찾을 수 있습니다:

요소를 찾은 후 검사기에서 해당 요소를 마우스 오른쪽 버튼으로 클릭하면 태그, 클래스, CSS 선택자 또는 절대 XPath 표현식을 복사할 수 있습니다.
Selenium은 웹 스크래핑을 위해 웹 페이지에서 HTML 요소를 찾는 두 가지 기법을 제공합니다: find_element와 find_elements입니다. find_element 메서드는 웹 페이지에서 특정 단일 요소를 찾는 반면, find_elements 메서드는 웹 페이지에서 발견된 모든 요소를 포함하는 목록을 반환합니다.
이 메서드들은 Selenium에서 정의한 다양한로케이터와호환되며, 다음을 포함합니다:
By.Name은이름 속성을 기반으로 요소를 찾습니다.By.ID는요소의 ID를 기반으로 요소를 찾습니다.By.XPATH는XPath 표현식을 기반으로 요소를 찾습니다.By.TAG_NAME: 태그 이름을 기반으로 요소를 찾습니다.By.CLASS_NAME은클래스를 기반으로 요소를 찾습니다.By.CSS_SELECTOR는CSS 선택자를 기반으로 요소를 찾습니다.
사용 가능한 HTML 요소를 기반으로 데이터를 수집하고 싶다고 가정해 보겠습니다. 다음과 같은 HTML 문서가 있다고 가정합니다:
<!DOCTYPE html>
<html>
<head>
<title>샘플 HTML 페이지</title>
</head>
<body>
<div id="content">
<h1 class="heading">제 웹사이트에 오신 것을 환영합니다!</h1>
<p>이것은 샘플 단락입니다.</p>
</div>
</body>
</html>
Selenium의 By.Name 로케이터를 사용하여 h1 태그를 찾을 수 있습니다:
h1 = driver.find_element(By.NAME, 'h1')
HTML 문서에서 ID를 찾으려면 By.ID 로케이터를 사용할 수 있습니다:
content = driver.find_element(By.ID, 'content')
By.CLASS_NAME을 사용하여 "heading"이라는 클래스를 가진 모든 HTML 요소를 찾을 수도 있습니다:
classes = driver.find_elements(By.CLASS_NAME, 'heading')
Selenium을 이용한 웹 스크래핑
HTML 태그를 찾은 후, Selenium은 웹사이트에서 데이터를 수집하기 위해 사용할 수 있는다양한 추출 방법을제공합니다. 가장 일반적인 방법은 다음과 같습니다:
text는HTML 태그에서 텍스트를 추출합니다.get_attributes()는 HTML 태그 내 속성의 값을 추출합니다.
다음 예시는 로케이터(ID, CSS 선택기, 태그 이름)와 추출 방법을 사용하여다음 아마존 페이지의 제목 및 기타 세부 정보를 상호작용하고 스크래핑하는 방법을 보여줍니다:

페이지 스크래핑을 위해 먼저 스크래핑 코드를 작성할 새 Python 스크립트 파일(예: selenium_scraping.py)을 생성해야 합니다. 다음으로 Python 패키지를 임포트하고 WebDriver를 인스턴스화합니다.
파이썬 패키지 임포트 및 WebDriver 인스턴스화
필요한 모듈을 임포트하려면 selenium_scraping.py 파일 상단에 다음 코드를 추가하세요:
# 라이브러리 임포트
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from selenium.webdriver.chrome.options import Options
이 코드는 데이터 스크래핑에 필요한 Selenium 및 WebDriver의 다양한 모듈을 임포트합니다.
Amazon URL을 자동으로 탐색하고 데이터를 스크래핑하려면 Selenium과 상호작용하는Chrome WebDriver를인스턴스화해야 합니다.
다음 코드를 붙여넣으세요. 이 코드는 ChromeDriver 바이너리가 설치되어 있지 않은 경우 설치한 후 인스턴스화합니다:
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
참고:Chrome을 사용하지 않으려면 Selenium은다른 브라우저용 드라이버도 지원합니다.
URL 정의 및 제품 제목 스크래핑
웹 페이지를 자동으로 로드하려면 Amazon URL을 Python 변수(예: url)에 정의한 후 드라이버의 get() 메서드에 전달해야 합니다:
# URL 정의
url = "https://www.amazon.com/AmazonBasics-Matte-Keyboard-QWERTY-Layout/dp/B07WJ5D3H4/"
# 웹 페이지 로드
driver.get(url)
# 웹 페이지 로드 최대 대기 시간(초) 설정
driver.implicitly_wait(10)
이 코드를 실행하면 Selenium이 ChromeDriver에서 Amazon 페이지 링크를 자동으로 로드합니다. 이 시간 설정은 웹 페이지의 모든 콘텐츠와 HTML 요소가 완전히 로드되도록 보장하기 위한 것입니다.
아마존 링크에서 제품 제목을 추출하려면 웹 페이지에 표시된 ID를 사용해야 합니다. 이를 위해 웹 브라우저에서 아마존 URL을 열고, 마우스 오른쪽 버튼을 클릭한 후‘검사’를선택하여 제품 제목(예:productTitle)을 포함하는 ID를 확인하세요:

다음으로 Selenium의 find_element() 메서드를 호출하여 확인된 ID 값을 가진 HTML 요소를 찾습니다. find_element() 메서드가 허용하는 인자로 첫 번째 인자에 By.ID를, 두 번째 인자에 ID를 전달해야 합니다:
# contents ID 내의 데이터 수집
title_element = driver.find_element(By.ID, "productTitle")
# 제목 추출
title = title_element.text
# 제품 제목 표시
print(title)
이 코드 블록은 productTitle ID 속성 내 데이터를 수집한 후 text 속성을 사용하여 제품 제목을 추출합니다. 마지막으로 제품 제목을 표시합니다.
터미널에서 다음 Python 스크립트 파일을 실행하여 제품 제목을 스크래핑하세요:
python selenium_scraping.py
추출된 제목은 다음과 같습니다:
Amazon Basics Low-Profile Wired USB Keyboard with US Layout (QWERTY), Matte Black
CSS 선택자와 태그 이름을 사용한 제품 상세 정보 스크래핑
제목 스크래핑 방법을 알았으니, 이제 CSS 선택자와 HTML 태그를 사용하여‘About this item’섹션의 다른 세부 정보를 추출해 보겠습니다:

제품 세부 정보를 추출하려면 Amazon 링크에서 CSS 선택자 li.a-spacing-mini로 지정된 모든 HTML 요소를 수집한 후 <span> 태그 이름이 지정된 HTML 요소에서 데이터를 수집해야 합니다:
# CSS 선택자로 외부 span 위치 파악
details_elements = driver.find_elements(By.CSS_SELECTOR, 'li.a-spacing-mini')
# 찾은 모든 상세 요소 반복
for detail_element in details_elements:
try:
# 내부 span에서 상세 내용 추출
detail = detail_element.find_element(By.TAG_NAME, 'span')
print(detail.text)
except Exception as e:
print("상세 내용 추출 실패:", e)
이 코드는 WebElement 콘텐츠 객체에서 li.a-spacing-mini라는 CSS 선택자를 가진 모든 HTML 요소를 수집하여 details_elements 리스트에 저장합니다. 그런 다음 detail_elements의 모든 요소를 순회하며 find_element 메서드와 By.TAG_NAME을 사용하여 태그명이 span인 HTML 요소를 수집합니다. text 속성을 사용하여 span HTML 요소에서 텍스트 데이터를 추출합니다.
다음은 span HTML 요소에서 추출된 데이터입니다:
편안하고 조용한 타이핑 경험을 위한 QWERTY 레이아웃 및 로우 프로파일 키를 갖춘 키보드
핫키로 미디어, 내 컴퓨터, 음소거, 볼륨 조절, 계산기 기능에 쉽게 접근 가능; 4개의 기능 키로 미디어 플레이어의 이전 트랙, 정지, 재생/일시정지, 다음 트랙 제어
USB 유선 연결
Windows 2000, XP, Vista, 7, 8, 10 호환
제품 크기: 17.4 x 5 x 1.1 인치 (가로 x 세로 x 높이)
자바스크립트 코드 실행
동적 웹사이트의 현재 창 내에서 JavaScript 코드를 실행하려면execute_script()함수를 사용할 수 있습니다. 예를 들어,https://quotes.toscrape.com/ 웹 페이지에 표시된 모든 사용 가능한 링크를 반환하려면 다음 JavaScript 코드를 실행할 수 있습니다:
# 라이브러리 임포트
from selenium import webdriver
from pprint import pprint
# Chrome WebDriver 설정
driver = webdriver.Chrome()
# URL 정의
url = "https://quotes.toscrape.com/"
# 웹 페이지 로드
driver.get(url)
# 웹 페이지 로드 최대 시간(초) 설정
driver.implicitly_wait(10)
# 모든 링크 수집을 위한 자바스크립트 실행
javascript_code = "return Array.from(document.getElementsByTagName('a'), a => a.href);"
links = driver.execute_script(javascript_code)
print(links)
# WebDriver 종료
driver.quit()
이 코드는 필요한 라이브러리를 임포트하고, Chrome WebDriver 인스턴스를 초기화하며, 지정된 URL로 이동합니다. 그런 다음 execute_script() 함수를 사용하여 페이지의 모든 링크를 수집하는 자바스크립트 코드를 실행합니다. 마지막으로 링크를 links 변수에 저장하고, 수집된 링크를 출력한 후 WebDriver 인스턴스를 종료합니다.
출력 결과는 다음과 같습니다:
['https://quotes.toscrape.com/',
'https://quotes.toscrape.com/login',
'https://quotes.toscrape.com/author/Albert-Einstein',
'https://quotes.toscrape.com/tag/change/page/1/',
'https://quotes.toscrape.com/tag/deep-thoughts/page/1/',
'https://quotes.toscrape.com/tag/thinking/page/1/',
'https://quotes.toscrape.com/tag/world/page/1/',
'https://quotes.toscrape.com/author/J-K-Rowling',.....
]
참고:자바스크립트 코드를 비동기적으로 실행하려는 경우, 대신
execute_async_script()함수를선택하십시오.
Selenium을 활용한 문제 해결 및 고급 스크래핑 기법
동적 웹사이트에서 데이터를 스크래핑할 때는 페이지네이션, 인증, CAPTCHA 처리 등 다양한 문제가 발생합니다.
페이지 매김은 원하는 모든 데이터를 수집하기 위해 웹사이트의 여러 페이지를 탐색해야 합니다. 그러나 웹사이트마다 페이지 매김 기술이 다르기 때문에 페이지 매김 처리는 어려울 수 있습니다. 다음 페이지로 이동하는 로직을 처리하고 더 이상 페이지가 없는 경우를 처리해야 합니다. 또한 일부 웹사이트는 웹 스크래핑 작업을 수행하기 전에 제한된 콘텐츠에 접근하기 위한 인증이 필요한 로그인 양식을 가지고 있습니다.
CAPTCHA가 익숙하지 않다면, 이는 사용자가 인간인지 봇인지 판별하기 위한 일종의 도전-응답 테스트입니다. 이 보안 조치는 자동화된 프로그램(봇)이 웹사이트에 접근하거나 특정 작업을 수행하는 것을 방지하기 위해 자주 사용됩니다. 그러나 CAPTCHA가 자동으로 처리되지 않으면 동적 웹사이트에서 원하는 데이터를 스크래핑하는 것을 차단할 수 있습니다.
다행히 Selenium은 이러한 문제를 극복하는 데 도움이 되는 고급 기술을 제공합니다.
여러 페이지에서 데이터 추출하기
전자상거래 웹사이트의 다양한 제품 세부 정보(제품 정보, 가격, 리뷰, 재고 현황 등)는 종종 여러 제품 목록 페이지에 걸쳐 페이지별로 나뉘어 있습니다.
다음 예시에서는books.toscrape.com에서 도서 제목과 가격을 스크래핑합니다. 이 웹사이트에는 50개 웹 페이지에 걸쳐 수많은 도서가 목록화되어 있습니다:

여러 페이지에서 데이터를 추출하려면 웹사이트 URL을 Python 변수에 정의하고 드라이버 객체의 get() 메서드를 사용하여 웹 페이지를 로드해야 합니다:
# URL 정의
url = "https://books.toscrape.com/"
# 웹 페이지 로드
driver.get(url)
데이터를 스크래핑하려면CSS 선택자를사용하여 웹 페이지에서 각 책의 제목과 가격을 포함하는 HTML 태그를 찾아야 합니다. 책 제목을 찾는 CSS 선택자는h3 > a이며, 책 가격을 찾는 선택자는price_color입니다:


다음은 각 도서의 제목과 가격을 모두 스크래핑하는 코드입니다:
# 스크랩된 데이터를 저장할 빈 리스트 초기화
books_results = []
while True:
# 데이터 추출
for selector in driver.find_elements(By.CSS_SELECTOR, "article.product_pod"):
try:
title_element = selector.find_element(By.CSS_SELECTOR, "h3 > a")
title = title_element.get_attribute("title")
price_element = selector.find_element(By.CSS_SELECTOR, ".price_color")
price = price_element.text
books_results.append({"title": title, "price": price})
except NoSuchElementException:
# 제목 또는 가격 요소를 찾을 수 없는 경우 처리
print("제목 또는 가격 요소를 찾을 수 없습니다.")
continue
# 다음 페이지 링크 확인
try:
next_page_link_element = driver.find_element(By.CSS_SELECTOR, "li.next a")
next_page_link = next_page_link_element.get_attribute("href")
if next_page_link == "https://books.toscrape.com/catalogue/page-50.html":
print("마지막 페이지에 도달했습니다. 스크래핑 프로세스 종료.")
break
else:
driver.get(next_page_link)
except NoSuchElementException:
# 다음 페이지 링크 요소를 찾지 못한 경우 처리
print("다음 페이지 링크 요소를 찾지 못했습니다.")
break
# WebDriver 종료
driver.quit()
print(books_results)
이 코드는 books_results라는 빈 리스트를 사용하여 스크랩된 데이터를 저장합니다. 현재 웹 페이지에 표시된 각 책의 제목과 가격을 추출하기 위해 루프를 실행합니다. 루프는 CSS 선택자 article.product_pod를 사용하여 각 책 항목을 찾습니다. 각 도서 항목 내에서 CSS 선택자 "h3 > a" 를 사용하여 제목을 찾고,".price_color"를 사용하여 가격을 찾습니다. 제목 또는 가격 요소를 찾지 못하면 예외를 처리하고 계속 진행합니다.
페이지의 모든 책을 스크래핑한 후, CSS 선택자 `li.next a`를 사용하여 다음 페이지 링크를 확인합니다. 발견되면 다음 페이지로 이동하여 스크래핑을 계속합니다. 다음 페이지가 없거나 마지막 페이지(50페이지)에 도달하면 스크래핑 프로세스가 종료됩니다. 마지막으로 `pprint`를 사용하여 ` books_results ` 리스트에 저장된 스크래핑된 데이터를 출력하고 WebDriver를 닫습니다.
50개 웹 페이지 전체에서 추출된 데이터는 다음과 같습니다:
[{'title': 'A Light in the Attic', 'price': '£51.77'},
{'title': 'Tipping the Velvet', 'price': '£53.74'},
{'title': 'Soumission', 'price': '£50.10'},
{'title': 'Sharp Objects', 'price': '£47.82'},
{'title': 'Sapiens: A Brief History of Humankind', 'price': '£54.23'},
{'title': '레퀴엠 레드', 'price': '£22.65'},
{'title': '꿈의 직장을 얻는 더러운 작은 비밀들', 'price': '£33.34'},
{'title': '다가오는 여성: 악명 높은 페미니스트 빅토리아 우드헐의 삶을 바탕으로 한 소설', 'price': '£17.93'},
{'title': '보트 위의 소년들: 1936년 베를린 올림픽에서 금메달을 향한 아홉 미국인의 서사시적 도전', 'price': '£22.60'}.....
]
로그인 양식 자동 처리
소셜 미디어 플랫폼을 포함한 많은 웹사이트는 특정 데이터에 접근하기 위해 로그인 또는 사용자 인증을 요구합니다. 다행히 Selenium은 로그인 과정을 자동화하여 인증 장벽 뒤의 데이터에 접근하고 스크래핑할 수 있게 해줍니다.
다음 예시에서는 셀레니움을 사용하여 다양한 유명인의 명언을 제공하는Quotes to Scrape 웹사이트(샌드박스 웹사이트)에 자동으로 로그인하는 방법을 살펴보겠습니다.
Quotes to Scrape 웹사이트에 로그인하려면 웹사이트 URL을 Python 변수에 정의하고 드라이버 객체의 get() 메서드를 사용하여 웹 페이지를 로드해야 합니다. 데이터를 추출하기 전에 페이지가 완전히 로드될 때까지 10초간 대기합니다:
# URL 정의
url = "https://quotes.toscrape.com/login"
# 웹 페이지 로드
driver.get(url)
# 웹 페이지 로드 최대 대기 시간(초) 설정
driver.implicitly_wait(10)
다음으로 XPath를 사용하여 로그인 양식의 사용자 이름과 비밀번호를 찾아 입력합니다. 웹 페이지의검사도구에서 사용자 이름 입력 필드 이름은'username', 비밀번호 입력 필드 이름은'password'입니다:

이 스크린샷에서 사용자 이름과 비밀번호 입력 필드의 코드를 확인할 수 있습니다. 다음은 사용자 이름과 비밀번호를 찾아 입력한 후 제출 버튼을 클릭하여 양식을 제출하는 코드입니다:
# 사용자 이름 필드 찾기
username_field = driver.find_element(By.XPATH, "//input[@name='username']")
# 사용자 이름 입력
username_field.send_keys("[email protected]")
# 비밀번호 필드 찾기
password_field = driver.find_element(By.XPATH, "//input[@name='password']")
# 비밀번호 입력
password_field.send_keys("secret1234")
# 양식 제출
submit_button = driver.find_element(By.XPATH, "//input[@type='submit']")
submit_button.click()
# 로그아웃 링크가 나타날 때까지 대기
try:
logout_link = WebDriverWait(driver, 15).until(
EC.visibility_of_element_located((By.XPATH, "//a[contains(text(), 'Logout')]"))
)
print("로그인 성공! 로그아웃 링크를 찾았습니다.")
except:
print("로그인 실패 또는 로그아웃 링크를 찾지 못했습니다.")
# 브라우저 닫기
driver.quit()
이 코드는 XPath를 사용하여 웹 페이지에서 name='username' 속성을 가진 사용자 이름 입력 필드를 찾습니다 : //input[@name='username']. send_keys() 메서드를 사용하여 찾은 사용자 이름 필드에 [email protected] 사용자 이름을 입력합니다. 그런 다음 XPath를 사용하여 웹 페이지에서 name='password' 속성을 가진 비밀번호 입력 필드를 찾습니다 : //input[@name='password'].
send_keys() 메서드를 사용하여 찾은 비밀번호 필드에 비밀번호 secret1234를 입력합니다. 그런 다음 XPath를 사용하여 type='submit' 속성을 가진 로그인 양식의 제출 버튼을 찾아 클릭합니다 : //input[@type='submit'].
로그인 성공 후 로그아웃 링크가 나타날 때까지 최대 15초 동안 대기합니다. 그런 다음 WebDriverWait를 사용하여 “Logout” 텍스트를 포함하는 XPath로 찾은 요소의 가시성을 기다립니다: //a[contains(text(), 'Logout')]. 지정된 시간 내에 로그아웃 링크가 나타나면 "로그인 성공! 로그아웃 링크를 찾았습니다."를 출력합니다. 로그아웃 링크가 나타나지 않거나 로그인이 실패하면 "로그인 실패 또는 로그아웃 링크를 찾을 수 없습니다."를 출력합니다.
로그인 프로세스가 완료된 후 브라우저 세션을 종료합니다.
출력 결과는 다음과 같습니다:
로그인 성공! 로그아웃 링크를 찾았습니다.
CAPTCHA 처리
일부 웹사이트는 콘텐츠 접근 전에 사용자가 인간인지 봇인지 확인하기 위해 CAPTCHA를 추가했습니다. 동적 웹사이트에서 데이터를 스크래핑할 때 CAPTCHA와 상호작용하지 않으려면Selenium의 헤드리스 모드를 구현할 수 있습니다. 헤드리스 모드는 화면에 표시하지 않고 브라우저 인스턴스를 실행할 수 있게 합니다. 즉, 브라우저가 백그라운드에서 실행되며 Python 스크립트를 사용하여 프로그래밍 방식으로 상호작용할 수 있습니다:
from selenium.webdriver.chrome.options import Options
# 헤드리스 모드용 Chrome 옵션 설정
chrome_options = Options()
chrome_options.add_argument("--headless")
# Chrome WebDriver 설정
driver = webdriver.Chrome(options=chrome_options)
이 코드는 selenium.webdriver.chrome.options에서 Options를 임포트합니다. 그런 다음 헤드리스 모드로 실행되도록 Chrome 옵션을 구성하고, 이러한 옵션으로 driver라는 Chrome WebDriver 인스턴스를 초기화합니다. 이는 브라우저 인터페이스를 표시하지 않고 웹 스크래핑 작업을 가능하게 합니다.
쿠키 작업
쿠키는 접속한 웹사이트에서 전송되어 컴퓨터에 저장되는 데이터 조각입니다. 이름, 값, 만료 시간, 경로로 구성되며, 사용자의 신원을 인식하고 로그인 정보 및 검색 기록을 포함한 저장된 정보를 불러오는 데 사용됩니다.
쿠키는 인증된 웹사이트 영역이나 개인화 영역 탐색에 필수적인 세션 상태를 유지함으로써 스크래핑 기능을 향상시킬 수 있습니다. 쿠키를 적용하면 반복적인 로그인을 피하고 스크래핑을 지속할 수 있어 실행 시간 단축에 자동으로 기여합니다.
웹사이트는 또한 스크래핑 방지 메커니즘의 일환으로 쿠키를 자주 사용합니다. 합법적인 브라우징 세션에서 쿠키를 보존하고 사용하면 요청이 일반 사용자의 요청과 더 유사해져 차단될 위험을 줄일 수 있습니다.
WebDriver API에서 제공하는 내장 메서드를 사용하여 쿠키와 상호작용할 수 있습니다.
현재 브라우징 컨텍스트에 쿠키를 추가하려면 add_cookie() 메서드를 사용하며, 이름과 값을 사전 형식으로 제공하세요:
# 패키지 임포트
from selenium import webdriver
# WebDriver 초기화
driver = webdriver.Chrome()
# 기본 URL로 이동
driver.get("http://www.example.com")
# WebDriver 세션에 쿠키 추가
driver.add_cookie({'name': 'session_id', 'value': 'abc123', 'domain': 'example.com', 'path': '/', 'expiry': None})
# 쿠키 적용을 위해 페이지 새로 고침
driver.refresh()
# 쿠키 적용 및 페이지 로드 완료를 위해 몇 초 대기
time.sleep(5)
# 이제 쿠키 설정이 필요한 스크래핑 작업을 진행할 수 있습니다
여기서는 add_cookie() 메서드를 사용하여 웹 스크래핑 작업에 쿠키를 추가합니다. 그런 다음 refresh() 메서드를 사용하여 페이지를 새로 고쳐 쿠키를 적용하고, 스크래핑 작업을 진행하기 전에 쿠키가 적용되었는지 확인하기 위해 5초 동안 대기합니다.
사용 가능한 모든 쿠키는 get_cookies() 메서드로 반환할 수 있습니다. 특정 쿠키의 세부 정보를 반환하려면 다음과 같이 쿠키 이름을 전달해야 합니다:
# 패키지 임포트
from selenium import webdriver
# WebDriver 초기화
driver = webdriver.Chrome()
# URL로 이동
driver.get("http://www.example.com")
# 현재 브라우저 컨텍스트에 쿠키 추가
driver.add_cookie({"name": "foo", "value": "bar"})
# 'foo'라는 이름의 쿠키 세부 정보 가져오기
print(driver.get_cookie("foo"))
이 코드 블록은 foo라는 이름의 쿠키 세부 정보를 반환합니다.
참고:쿠키 처리 방법에 대해 더 자세히 알고 싶다면,여기 Selenium 문서 페이지를 방문하세요.
웹 스크래핑을 위한 모범 사례 및 윤리적 고려 사항
웹 스크래핑 시에는 웹사이트에서 책임감 있게 데이터를 추출하기 위한 모범 사례를 따르는 것이 중요합니다. 여기에는 웹사이트 크롤링 및 스크래핑 규칙을 명시한 robots.txt 파일을 준수하는 것이 포함됩니다.
과도한 요청으로 서버에 과부하를 주지 않도록 주의하십시오. 이는 웹사이트 기능을 방해하고 사용자 경험을 저해할 수 있습니다. 이러한 과부하는서비스 거부(DoS) 공격으로 이어질 수 있습니다.
웹 스크래핑은 법적·윤리적 문제도 제기합니다. 예를 들어, 허가 없이 저작권이 있는 자료를 스크래핑하면 법적 문제가 발생할 수 있습니다. 진행 전에 웹 스크래핑의 법적·윤리적 함의를 신중하게 평가하는 것이 중요합니다. 웹사이트에 게시된 데이터 개인정보 보호정책, 지적 재산권, 이용 약관을 확인함으로써 이를 수행할 수 있습니다.
결론
동적 웹사이트에서 데이터를 스크래핑하는 과정은 노력과 계획이 필요합니다. Selenium을 사용하면 어떤 동적 웹사이트와도 자동으로 상호작용하고 데이터를 수집할 수 있습니다.
이 글에서는 Selenium Python 패키지를 활용해 YouTube 및 기타 샌드박스 웹사이트에 표시된 다양한 HTML 요소에서 서로 다른 위치 지정 요소를 사용해 데이터를 스크래핑하는 방법을 배웠습니다. 또한 고급 기법을 통해 페이지네이션, 로그인 양식, CAPTCHA와 같은 다양한 문제를 처리하는 방법도 익혔습니다. 이 튜토리얼의 모든 소스 코드는 이GitHub 저장소에서 확인할 수 있습니다.
셀레니움으로 데이터 스크래핑이 가능하지만 시간이 많이 소요되며 복잡해지기 쉽습니다. 따라서 Bright Data 사용을 권장합니다. Selenium과 다양한 프록시 유형을 지원하는스크래핑 브라우저를 통해 즉시 데이터 추출을 시작할 수 있습니다. 서버와 코드 유지보수 대신 무료 체험을 시작하고 Bright Data가 제공하는 스크래핑 API를 활용해 보세요.