파이썬 웹 스크래핑 입문 가이드
웹 스크래핑이란
웹 스크래핑은 웹사이트의 콘텐츠를 프로그래밍 방식으로 수집하는 기술입니다. 이 과정에서 우리는 웹 페이지의 구조와 데이터를 추출하는 방법을 학습하게 됩니다.
웹 페이지의 구조
우리가 보는 웹 페이지는 주로 HTML이라는 마크업 언어로 작성됩니다. HTML은 텍스트에 다양한 스타일과 구조를 적용할 수 있게 해줍니다. 예를 들어, <p>안녕하세요</p> 코드는 "안녕하세요"라는 텍스트를 단락으로 표시합니다.
웹 콘텐츠 수집 방법
웹 스크래핑은 일반적으로 웹 페이지의 렌더링된 콘텐츠가 아닌 소스 코드를 가져옵니다. 예를 들어, "안녕하세요" 텍스트는 <p>안녕하세요</p> 형태로 수집됩니다.
웹 페이지 소스 코드를 확인하려면:
- 웹 페이지에서 마우스 오른쪽 클릭
- "페이지 소스 보기" 선택
파이썬으로 웹 소스 코드 가져오기
먼저 requests 라이브러리를 설치해야 합니다. 터미널에서 다음 명령어를 실행하세요:
pip install requests
이제 requests 라이브러리를 사용하여 웹 페이지의 소스 코드를 가져올 수 있습니다:
import requests
target_url = 'https://example.com' # 스크래핑할 웹사이트 주소
response = requests.get(target_url) # 웹 페이지 요청
print(response.text) # 소스 코드 출력
인코딩 문제 해결
위 코드 실행 시 인코딩 문제가 발생할 수 있습니다. UTF-8 인코딩으로 설정하면 한글이 올바르게 표시됩니다:
import requests
target_url = 'https://example.com'
response = requests.get(target_url)
response.encoding = 'utf-8' # UTF-8 인코딩 설정
print(response.text)
소스 코드 분석
수집한 소스 코드에서 필요한 데이터를 추출하려면 lxml 라이브러리를 사용해야 합니다. 터미널에서 다음 명령어로 설치하세요:
pip install lxml
이제 lxml을 사용하여 HTML을 파싱하고 필요한 데이터를 추출할 수 있습니다:
import requests
from lxml import etree
target_url = 'https://example.com'
response = requests.get(target_url)
response.encoding = 'utf-8'
html_element = etree.HTML(response.text) # HTML 파싱
results = html_element.xpath('//a/text()') # 모든 링크 텍스트 추출
for item in results:
print(item) # 결과 출력
XPath 기본 문법
XPath는 XML 문서에서 노드를 선택하기 위한 언어입니다. 주로 사용되는 XPath 구문은 다음과 같습니다:
- nodename: 선택된 노드의 모든 자식 노드 선택
- /: 현재 노드에서 직접 자식 노드 선택
- //: 현재 노드에서 모든 후손 노드 선택
- .: 현재 노드 선택
- ..: 현재 노드의 부모 노드 선택
- @: 속성 선택
- *: 모든 요소 노드 선택
- @*: 모든 속성 선택
- [@attrib]: 지정된 속성을 가진 모든 요소 선택
- [@attrib='value']: 지정된 속성값을 가진 모든 요소 선택
- [tag]: 지정된 태그를 가진 모든 직접 자식 노드 선택
- [tag='text']: 지정된 태그이고 텍스트 내용이 일치하는 모든 노드 선택
실제 스크래핑 예제
네이버 뉴스에서 특정 뉴스 제목을 추출하는 예제를 살펴보겠습니다. 개발자 도구(F12)를 열고 원하는 요소를 검사해야 합니다.
예를 들어, 뉴스 목록의 부모 요소가 ul 태그이고 class가 "list-a news_top"인 경우 다음과 같이 코드를 작성할 수 있습니다:
import requests
from lxml import etree
target_url = 'https://news.naver.com'
response = requests.get(target_url)
response.encoding = 'utf-8'
html_element = etree.HTML(response.text)
news_titles = html_element.xpath('//ul[@class="list-a news_top"]//a/text()') # 뉴스 제목 추출
for title in news_titles:
print(title)
이 코드는 네이버 메인 페이지의 특정 뉴스 섹션에서 모든 뉴스 제목을 추출하여 출력합니다. 실제 스크래핑 시에는 웹사이트의 구조가 변경될 수 있으므로, 필요에 따라 XPath를 조정해야 합니다.