1 웹 크롤링(Crawling)
- 컴퓨터 소프트웨어로 각종 웹 사이트에서 원하는 정보를 추출.
웹 스크래핑(Web scraping)이라고도 합.
- 크롤러: 인터넷 웹 페이지 방문해서 자료 수집하는 프로그램.
- 필요한 지식: 웹 개념, HTML CSS JavaScript 구조 및 태그, 파이썬 기초
- 도구: requests, BeautifulSoup, selenium 패키지, 크롬 개발자 도구
- 웹 크롤링 기법
- HTML 페이지 가져와서 HTML/CSS 파싱
- Open API 제공하는 서비스에서 Open API 호출해서, 그 데이터 중 필요한 것만 추출
- 브라우저를 프로그래밍으로 조작해서 필요 데이터만 추출
- 크롤링 합법 여부 확인 => naver.com/robots.txt 이렇게 robots.txt 확인.
- 합법인지 불법인지 모호하다. 많은 데이터 긁으면 막히는 경우들도. => 노트북 여러 개로 바꿔가면서 하기도.
- 주의사항 - 무분별 상업적 이용 X, 서버 부담 X
2 절차
- 1 HTML 문서 요청 및 추출(requests, selenium 패키지로 HTML 문서 추출)
- 2 HTML 문서 분석(크롬 개발자 도구, HTML 태그, CSS 선택자 활용)
- 3 원하는 데이터 추출(requests, selenium, BeautifulSoup 활용)
- 4 찾은 데이터 가공 및 저장(추출 데이터 엑셀 or 텍스트 파일로 저장)
3 예시로 보는 큰 절차: BeautifulSoup
3-1 requests 사용해서 HTML 소스 들고오기
- requests 모듈로 웹 페이지를 가져온다.
import requests
requests.get('https://finance.naver.com/item/main.naver005930')
parameters = {'code': '005930'}
res = requests.get('https://finance.naver.com/item/main.naver', params=parameters)
res = requests.post('https://finance.naver.com/item/main.naver?code=005930')
print(res.status_code)
- res는 requests의 Responce 객체.
- 여기까지 했을 때 status_code로 200이 뜨면 성공한 거다.
- 여기서는 get, post 둘 다 결과가 같지만 다를 수도 있다. requests모듈 페이지에서 확인.
3-2 BeatifulSoup로 HTML 소스 파싱하기(데이터로 변환하기)
- requests로 들고온 HTML 소스(Response 객체)를 파이썬 코드로 접근할 수 있는 형태로 파싱한다.
- BeautifulSoup: 복잡하게 작성된 HTML 문서를 구조화된 데이터 형태로 바꾸는 패키지.
- 파싱(Parsing): 주어진 데이터(파일, 문자열 등)을 분석하여 그 구조를 이해하고, 필요한 정보를 추출하거나 다른 형식으로 변환하는 과정. 특히 텍스트 데이터를 처리한다.
- 파서(Parser): 파싱을 하는 기계. 컴퓨터 과학 및 프로그래밍에서 사용되는 개념으로, 특정 형식의 데이터를 읽고 해석하는 프로그램이나 모듈을 가리킨다. 파서는 일련의 입력 데이터를 가져와서 문법적으로 해석하고 이를 프로그램이나 다른 형태의 데이터로 변환한다.
from bs4 import BeautifulSoup
soup = BeautifulSoup(res,text, 'html.parser')
print(soup.prettify())
BeautifulSoup(html, 'html.parser'): html 문자열 객체를 받아서, BeautifulSoup 객체로 바꾼다. 이를 파싱이라 한다. BeautifulSoup 객체는 Python의 복잡한 HTML/XML 문서를 파싱하고, 그걸 탐색하기 위한 다양한 메서드랑 속성을 제공한다.
res.text: 여기서 res를 그대로 넣으면 안들어간다. res는 requests의 Response 클래스 객체. BeautifulSoup는 HTML/XML 문서의 string 혹은 byte string객체를 받아서, 파싱하는 함수다. res.text로 HTML의 본문을 string 타입 객체로 추출해서 집어넣는다.
html.parser은 BeautifulSoup에서 사용되는 파싱 방식을 지정하는 인자. html.parser은 Python 표준 라이브러리에 내장된 HTML 파서. 보다 빠른 파싱이나 복잡한 HTML 문서 처리하려면, lxml, html5lib 같은 외부 파서 선택할 수도 있다.
soup.prettify(): .prettify() 메서드는 파싱된 HTML 또는 XML 문서를 보기 좋게(가독성 있게) 포맷팅된 형태로 반환한다. 들여쓰기를 포함해 이 HTML/XML 코드를 보기 좋게 출력.
3-3 BeautifulSoup 객체에서 원하는 요소 추출
.find(): BeautifulSoup 객체, Tag 객체에 사용 가능. 태그 이름, 속성, 문자열 등을 기준으로 검색. 주어진 조건에 맞는 요소를 찾아서, 첫 번째로 찾아진 요소를 반환. 일치하는 요소 없으면 None 반환.
반환되는 타입은 bs4.element.Tag.
.find_all(): BeautifulSoup 객체, Tag 객체에 사용 가능. 태그 이름, 속성, 문자열 등을 기준으로 검색. 주어진 조건에 맞는 모든 요소를 찾아서, 리스트 형태로 반환. 일치하는 요소 없으면 빈 리스트 반환.
반환되는 타입은 bs4.element.ResultSet인데, 리스트처럼 작용한다. 안의 요소들의 타입은 bs4.element.Tag.
.select_one(선택자): select와 똑같지만, 첫 번째 요소만 반환.
.select(선택자) : BeautifulSoup 객체, Tag 객체에 사용 가능. find_all과 비슷하게 조건에 맞는 모든 요소를 찾아서 반환하지만, CSS 선택자를 사용해서 클래스, ID, 속성 선택자 등 다양하고 복잡한 선택 가능. 일치하는 요소 없으면 빈 리스트 반환.
반환되는 타입은 bs4.element.ResultSet인데, 리스트처럼 작용한다. 안의 요소들의 타입은 bs4.element.Tag.
- 아래 예시는, body 안의 p 요소를 모두 찾아 리스트로 반환했다. for문으로 리스트를 돌리고, tag.text로 해당 p 요소의 text를 하나씩 print.
tag_list = soup.select('body p')
for tag in tag_list:
print(tag.text)
driver.close()
- 예시로 보는 HTML 태그의 속성들

tag = soup.find('p')
print(tag)
print(tag.name)
print(tag.attrs)
print(tag.attrs['class'])
print(tag.attrs['id'])
print(tag.text)
- ```find('p')```로 p~/p까지의 요소 중 첫번째로 걸리는 걸 들고 온다.
- ```tag.name```: 태그의 이름은 p
- ```tag.attrs```: 태그의 속성들을 딕셔너리 형태로 반환. 여기서는 class, id.
- ```tag.attrs['class']```: 속성 중 클래스의 값에 접근.
- ```tag.text```: p~/p 사이에 있는 본문만 string으로 return.
- 선택자로 디테일하게 태그 찾기
- 부모-자식 관계로 태그 찾기는
b a, b > a 이렇게 두 가지로 표현 가능. 띄워쓰기 혹은 > 표시.
#company에서 #은 ID를 뜻
.footage_cls에서 .은 class를 뜻.
a[href]: a 태그의 href(링크)를 들고옴
4 예시로 보는 큰 절차: Selenium