1. 크롤링이란?
: Web상에 존재하는 Contents를 수집하는 작업
① HTML페이지를 가져와서 HTML/CSS 등을 파싱하고, 필요한 데이터만 추출하는 기법
② Open API(Rest API)를 제공하는 서비스에 Open API를 호출해서, 받은 데이터 중 필요한 데이터만 추출하는 기법
③ Selenium 등 브라우저를 프로그램이으로 조작해서, 필요한 데이터만 추출하는 기법
2. BeautifulSoup라이브러리
: HTML의 태그를 파싱해서 필요한 데이터만 추출하는 함수를 제공하는 라이브러리. HTML 데이터 파싱
<예시>
import requests //Python에서 HTTP 요청을 보내는 라이브러리인 requests 요청
from bs4 import BeautifulSoup //BeautifulSoup 라이브러리 요청
res = requests.get('https://rsy99.tistory.com/') //res 변수에 HTML 데이터를 요청하여 저장
soup = BeautifulSoup(res.content, 'html.parser') //soup 변수에 BeautifulSoup을 이용하여 HTML 페이지 파싱
title = soup.find('title') //필요한 데이터를 검색하여 title 변수에 저장
print(title.get_text()) //필요한 데이터를 출력(추출)한다
- 파싱하려는 페이지에서 개발자도구(F12)를 이용하여 HTML 파일을 보면 <title> 태그 확인 가능
- 코드를 실행해보면,
Ryuuuuuusy가 뜨길 기대했는데 TISTORY가 파싱됐다,,, 아마 <title> 태그 내용 중 TISTORY인 것이 있는 것 같다...
이거는 나중에 해결하기로 하자!
어쨌든 이런식으로 파싱된 결과가 뜨게 된다!
3. find()와 find_all()
- find() : 가장 먼저 검색되는 태그 반환
- find_all() : 전체 태그 반환
* 메서드 별 추출 결과
ex) data 변수를 출력할 때
① print(tdata)
<p class='cssstyle'>웹페이지에서 필요한 데이터를 추출하는 것</p>
② print(data.string)
웹페이지에서 필요한 데이터를 추출하는 것
③ print(data.get_text())
웹페이지에서 필요한 데이터를 추출하는 것
- find_all() 관련된 모든 데이터를 리스트 형태로 추출하는 함수
ex)
<p class='cssstyle'>rsy</p>
<p id='body' align='center'>cyber</p>
paragraph_data = soup.find_all(‘p’) //p태그가 있는 데이터를 검색해 paragraph_data 변수에
print(paragraph_data) //결과 : [<p class='cssstyle'>rsy</p>, <p id='body' align='center'>cyber</p>]
print(paragraph_data[0].get_text()) //결과 : rsy
print(paragraph_data[1].get_text()) //결과 : cyber
-> 위와 같이 find_all 메서드의 결과는 [](리스트) 형태로 추출된다.
4. 데이터 추출 방법
① id로 검색 방법
title_data = soup.find(id='title')
② HTML 태그와 CSS class를 활용해서 필요한 데이터를 추출하는 방법1
paragraph_data = soup.find(‘p’, class_=‘cssstyle’)
③ HTML 태그와 태그에 있는 속성:속성값을 활용해서 필요한 데이터를 추출하는 방법
paragraph_data = soup.find(‘p’,attrs = {‘align’:’center’})
5. BeautifulSoup 라이브러리 활용 stirng 검색 예제
① 태그가 아닌 문자열 자체로 검색
② 문자열, 정규표현식 등으로 검색 가능
- 문자열 검색의 경우 한 태그 내의 문자열과 exact matching 인 것만 추출
- 이것이 의도한 경우가 아니라면 정규 표현식 사용