Data/Python

[크롤링] 웹 크롤링 BeautifulSoup (1)

밍츠 2022. 3. 25. 01:16

1. 웹 크롤링

  • Web crawler : 웹 페이지의 데이터를 모아주는 소프트웨어
  • Web crawling : 크롤러를 사용하여 웹 페이지의 데이터를 추출해내는 행위

2. BeautifulSoup4

- HTML 정보로부터 원하는 데이터를 가져오기 쉽게 비슷한 분류의 데이터별로 나누어주는(parsing) 파이썬 라이브러리

  1. 웹 페이지의 전체 HTML 코드를 가져온다.
  2. 크롤링을 원하는 부분의 HTML 태그를 찾는다.
  3. 해당 태그를 꺼낸 다음 태그를 제거하고 내부의 데이터만 뽑아낸다.

- 설치 : beautifulsoup4 

- 라이브러리 불러오기 : from bs4 import BeautifulSoup

+ html 정보 가져오는 모듈 : from urlib.request import urlopen

 

아래 진행하기 위해 두 라이브러리 import 해준다.

 

3. 다음 영어 사전 url 분석

- 패턴 존재 여부

- query 종류 

 

크롤링할 사이트 : https://alldic.daum.net/index.do

 

다음 어학사전

 

alldic.daum.net

happiness 검색 후 url 변화 : https://alldic.daum.net/search.do?q=happiness 

 

happiness – 다음 어학사전

 

alldic.daum.net

-> 검색 후 url에서 물음표를 기준으로 오른쪽을 쿼리라고 한다. q=happiness는 파라미터이다.

-> 물음표 왼쪽은 원래 주소 + search.do 로 search.do는 함수 이름 같은 것으로 보면 된다.

 

 

4. url 구성, HTTP Response 얻기, HTML source 얻기

 

url 구성

# 검색하고 싶은 단어 입력하기
word = 'happiness'

# 불러오려는 url 입력하기 
# 디폴트 url에 string 타입의 word 변수를 합쳐서 url 변수 생성
url = 'https://alldic.daum.net/search.do?q=' + word

HTTP Response 얻기

# urlopen 함수를 통해 web 변수를 생성
web = urlopen(url)   # urlopen(url).read().decode('utf-8')

+ print(web) 의 결과가 아래와 같은 형식이라면 데이터를 잘 가져왔다는 뜻

<http.client.HTTPResponse object at 0x000001D4A4634BB0>

HTML source 얻기

# BeautifulSoup으로 web 페이지상의 HTML 구조를 파싱
web_page = BeautifulSoup(web, 'html.parser')

print(web_page)

-> web_page : 'https://alldic.daum.net/search.do?q=happiness' 의 HTML 코드

 

5. HTML Tag 꺼내기

 

다음 영어 사전 사이트에서 html 코드 분석하기 : 

1. 사이트에 들어가 F12 or Ctrl + Shift + I 를 눌러 개발자 창을 띄운다.

2. 네모에 클릭 버튼같이 생긴 것을 눌러 코드를 분석하고 싶은 곳을 누르면 해당 html 코드를 찾아준다.

 

HTML Tag 꺼내기 :

- .find("tag 이름", {"attr 이름":"att 값"}) : 1개의 Tag 꺼내기, 조건이 동일한 Tag가 여러 개일 경우 첫 번째 Tag 값 꺼내짐

- .find_all("tag 이름", {"attr 이름":"att 값"}) : 여러 개의 Tag를 찾은 다음 for 문으로 Tag 단위로 꺼내어 활용

 

검색한 "Happiness" 단어를 가져오기

- <span class="txt_emph1">happiness</span>를 활용

- find_all는 리스트 형태로 저장하여 인덱싱이 가능하다.

- find_all 과 find는 type이 다르다

 

 

6. Tag로부터 텍스트 혹은 Attribute values 꺼내기

- get_text() :태그를 제거하고 텍스트만 반환한다.

- attrs : 속성 값을 모두 출력한다.

- 두 함수 모두 find()에서만 사용 가능하다.

 

 

추가. 영어 단어 뜻 출력하기

- 사이트에서 영어 단어에 해당하는 태그 확인

-> 단어 뜻 외에도 출력됨

해결 : 부모 태그로 find 하기

 

- 여러 개의 tag를 for 문으로 tag단위로 꺼낸다.