본문 바로가기

etc.

#1 Crawling 이해 및 기본

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 인 것만 추출

  - 이것이 의도한 경우가 아니라면 정규 표현식 사용