본문 바로가기
Python

Python - CSS selector를 활용한 크롤링

by DGK 2021. 10. 29.

 

인프런 파이썬 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

크롤링 with CSS selector(Python)

CSS selector를 사용하여, 크롤링하는 방법을 다루고자 한다.

 

크롤링 연습(selector 사용)

import requests
from bs4 import BeautifulSoup

res = requests.get('https://davelee-fun.github.io/blog/crawl_test_css.html')
soup = BeautifulSoup(res.content, 'html.parser')
items = soup.select('li')
for item in items:
    print(item.get_text())

 

  • select() 함수를 사용하여 크롤링을 한 경우

```

결과 :

 

(왕초보) - 클래스 소개

(왕초보) - 블로그 개발 필요한 준비물 준비하기

(왕초보) - Github pages 설정해서 블로그 첫 페이지 만들어보기

(왕초보) - 초간단 페이지 만들어보기

(왕초보) - 이쁘게 테마 적용해보기

(왕초보) - 마크다운 기초 이해하고, 실제 나만의 블로그 페이지 만들기

(왕초보) - 다양한 마크다운 기법 익혀보며, 나만의 블로그 페이지 꾸며보기

(초급) - 강사가 실제 사용하는 자동 프로그램 소개 [2]

(초급) - 필요한 프로그램 설치 시연 [5]

(초급) - 데이터를 엑셀 파일로 만들기 [9]

(초급) -     엑셀 파일 이쁘게! 이쁘게! [8]

(초급) -     나대신 주기적으로 파이썬 프로그램 실행하기 [7]

(초급) - 파이썬으로 슬랙(slack) 메신저에 글쓰기 [40]

(초급) - 웹사이트 변경사항 주기적으로 체크해서, 메신저로 알람주기 [12]

(초급) - 네이버 API 사용해서, 블로그에 글쓰기 [42]

(중급) - 자동으로 쿠팡파트너스 API 로 가져온 상품 정보, 네이버 블로그/트위터에 홍보하기 [412]

 

```

 

select() 함수는 find_all() 함수와 동일한 기능을 가진다.

즉, select() 함수도 결과 값을 리스트 자료형 형태로 출력해주며, 인자와 매치되는 모든 태그를 가져온다.

 

참고로, find() 함수는 select_one() 함수와 동일한 기능을 가진다.

find() 함수와 마찬가지로, select_one() 함수도 오직 인자와 매칭되는 첫 번째 데이터만을 가지고온다.

 

 

selector() 함수의 인자 활용(상위태그, 하위태그)

import requests
from bs4 import BeautifulSoup

res = requests.get('https://davelee-fun.github.io/blog/crawl_test_css.html')
soup = BeautifulSoup(res.content, 'html.parser')
items = soup.select('ul li')
for item in items:
    print(item.get_text())

 

  • select() 함수의 인자로 상위태그와 하위태그를 넣는 경우

```

결과 :

 

(왕초보) - 클래스 소개

(왕초보) - 블로그 개발 필요한 준비물 준비하기

(왕초보) - Github pages 설정해서 블로그 첫 페이지 만들어보기

(왕초보) - 초간단 페이지 만들어보기

(왕초보) - 이쁘게 테마 적용해보기

(왕초보) - 마크다운 기초 이해하고, 실제 나만의 블로그 페이지 만들기

(왕초보) - 다양한 마크다운 기법 익혀보며, 나만의 블로그 페이지 꾸며보기

(초급) - 강사가 실제 사용하는 자동 프로그램 소개 [2]

(초급) - 필요한 프로그램 설치 시연 [5]

(초급) - 데이터를 엑셀 파일로 만들기 [9]

(초급) -     엑셀 파일 이쁘게! 이쁘게! [8]

(초급) -     나대신 주기적으로 파이썬 프로그램 실행하기 [7]

(초급) - 파이썬으로 슬랙(slack) 메신저에 글쓰기 [40]

(초급) - 웹사이트 변경사항 주기적으로 체크해서, 메신저로 알람주기 [12]

(초급) - 네이버 API 사용해서, 블로그에 글쓰기 [42]

(중급) - 자동으로 쿠팡파트너스 API 로 가져온 상품 정보, 네이버 블로그/트위터에 홍보하기 [412]

 

```

 

select('ul li')의 코드는 다운받아 온 HTML 파일에서, ul태그 밑에 존재하는 li 태그의 모든 데이터를 리스트 형태로

가져오겠다는 의미이다.

위의 예시코드 처럼 select() 함수의 인자로 태그의 관계를 쓸 경우, 상위 태그와 하위 태그는 공백으로 구분한다.

 

import requests
from bs4 import BeautifulSoup

res = requests.get('https://davelee-fun.github.io/blog/crawl_test_css.html')
soup = BeautifulSoup(res.content, 'html.parser')
items = soup.select('ul a')
for item in items:
    print(item.get_text())

 

  • select() 함수의 인자로 상위태그와 하위태그를 넣는 경우

```

결과 :

 

위의 결과와 동일함

 

```

 

select() 함수의 인자로 상위태그와 하위태그를 공백으로 구분하는 경우, 상위 태그 밑에 존재하는 모든 하위 태그를

쓸 수 있다.

즉, ul 태그 밑에 li 태그가 있고 그 밑에 a 태그가 있는 경우에도 select('ul li a')로 쓰지 않고, 위의 예시코드 처럼

select('ul a')으로 써도 된다.

 

import requests
from bs4 import BeautifulSoup

res = requests.get('https://davelee-fun.github.io/blog/crawl_test_css.html')
soup = BeautifulSoup(res.content, 'html.parser')
items = soup.select('ul > a')
for item in items:
    print(item.get_text())

 

  • select() 함수의 인자로 상위태그와 하위태그를 넣는 경우

```

결과 :

 

어떠한 결과도 출력되지 않는다.

 

```

 

만약, select('ul > a')처럼 코드를 쓸 경우에는 반드시 ul태그 바로 밑에 a태그가 존재해야만 한다.

ul 태그 밑에 li 태그가 있고 그 밑에 a 태그가 있기 때문에, select('ul > a')와 같이 코드를 작성하면 어떠한 결과 값도

추출하지 못한다. (반드시 > 기호는 상위 태그 바로 밑에 존재하는 하위태그를 표시할 때만 사용할 것)

 

 

selector() 함수의 인자 활용(class, id)

import requests
from bs4 import BeautifulSoup

res = requests.get('https://davelee-fun.github.io/blog/crawl_test_css.html')
soup = BeautifulSoup(res.content, 'html.parser')
items = soup.select('.course')
for item in items:
    print(item.get_text())

 

  • select() 함수의 인자로 class를 넣는 경우

```

결과 :

 

(왕초보) - 클래스 소개

(왕초보) - 블로그 개발 필요한 준비물 준비하기

(왕초보) - Github pages 설정해서 블로그 첫 페이지 만들어보기

(왕초보) - 초간단 페이지 만들어보기

(왕초보) - 이쁘게 테마 적용해보기

(왕초보) - 마크다운 기초 이해하고, 실제 나만의 블로그 페이지 만들기

(왕초보) - 다양한 마크다운 기법 익혀보며, 나만의 블로그 페이지 꾸며보기

(초급) - 강사가 실제 사용하는 자동 프로그램 소개 [2]

(초급) - 필요한 프로그램 설치 시연 [5]

(초급) - 데이터를 엑셀 파일로 만들기 [9]

(초급) -     엑셀 파일 이쁘게! 이쁘게! [8]

(초급) -     나대신 주기적으로 파이썬 프로그램 실행하기 [7]

(초급) - 파이썬으로 슬랙(slack) 메신저에 글쓰기 [40]

(초급) - 웹사이트 변경사항 주기적으로 체크해서, 메신저로 알람주기 [12]

(초급) - 네이버 API 사용해서, 블로그에 글쓰기 [42]

(중급) - 자동으로 쿠팡파트너스 API 로 가져온 상품 정보, 네이버 블로그/트위터에 홍보하기 [412]

 

```

 

select() 함수의 인자로 class를 사용하여 데이터를 추출하는 방법이다.

추출하고자 하는 데이터의 class 이름 앞에 .을 붙여서, select() 함수의 인자로 넣어주면 된다.

 

import requests
from bs4 import BeautifulSoup

res = requests.get('https://davelee-fun.github.io/blog/crawl_test_css.html')
soup = BeautifulSoup(res.content, 'html.parser')
items = soup.select('#start')
for item in items:
    print(item.get_text())

 

  • select() 함수의 인자로 id를 넣는 경우

```

결과 :

 

(왕초보) - 클래스 소개

(왕초보) - 블로그 개발 필요한 준비물 준비하기

(왕초보) - Github pages 설정해서 블로그 첫 페이지 만들어보기

(왕초보) - 초간단 페이지 만들어보기

(왕초보) - 이쁘게 테마 적용해보기

(왕초보) - 마크다운 기초 이해하고, 실제 나만의 블로그 페이지 만들기

(왕초보) - 다양한 마크다운 기법 익혀보며, 나만의 블로그 페이지 꾸며보기

 

```

 

select() 함수의 인자로 id를 사용하여 데이터를 추출하는 방법이다.

추출하고자 하는 데이터의 id 이름 앞에 #을 붙여서, select() 함수의 인자로 넣어주면 된다.

 

import requests
from bs4 import BeautifulSoup

res = requests.get('https://davelee-fun.github.io/blog/crawl_test_css.html')
soup = BeautifulSoup(res.content, 'html.parser')
items = soup.select('.course.paid')
for item in items:
    print(item.get_text())

 

  • class 이름이 2개 이상인 경우, select() 함수의 인자로 넣는 방법

```

결과 :

 

(중급) - 자동으로 쿠팡파트너스 API 로 가져온 상품 정보, 네이버 블로그/트위터에 홍보하기 [412]

 

```

 

class 이름이 2개 이상인 경우에는 class 이름을 .으로 계속 연결하여 select() 함수의 인자로 넣어주면 된다.

 

import requests
from bs4 import BeautifulSoup

res = requests.get('https://davelee-fun.github.io/blog/crawl_test_css.html')
soup = BeautifulSoup(res.content, 'html.parser')
items = soup.select('ul#hobby_course_list li.course')
for item in items:
    print(item.get_text())

 

  • 상위태그의 id와 하위태그의 class를 활용하여, select() 함수의 인자로 넣어 데이터를 추출하는 경우

```

결과 :

 

(왕초보) - 클래스 소개

(왕초보) - 블로그 개발 필요한 준비물 준비하기

(왕초보) - Github pages 설정해서 블로그 첫 페이지 만들어보기

(왕초보) - 초간단 페이지 만들어보기

(왕초보) - 이쁘게 테마 적용해보기

(왕초보) - 마크다운 기초 이해하고, 실제 나만의 블로그 페이지 만들기

(왕초보) - 다양한 마크다운 기법 익혀보며, 나만의 블로그 페이지 꾸며보기

 

```

 

select('ul#hobby_course_list li.course') 코드는 id 이름이 hobby_course_list인 ul 태그(상위 태그) 밑에 존재하는

li 태그(하위 태그)에서 class 이름이 course인 데이터만 추출하겠다는 의미이다.

 

import requests
from bs4 import BeautifulSoup

res = requests.get('https://davelee-fun.github.io/blog/crawl_test_css.html')
soup = BeautifulSoup(res.content, 'html.parser')
items = soup.select('ul#dev_course_list > li.course.paid')
for item in items:
    print(item.get_text())

 

  • 상위태그의 id와 하위태그의 class를 활용하여, select() 함수의 인자로 넣어 데이터를 추출하는 경우

```

결과 :

 

(중급) - 자동으로 쿠팡파트너스 API 로 가져온 상품 정보, 네이버 블로그/트위터에 홍보하기 [412]

 

```

 

select('ul#dev_course_list > li.course.paid') 코드는 id 이름이 dev_course_list인 ul 태그(상위 태그) 바로 밑에

존재하는 li 태그(하위 태그)에서 class 이름이 course paid인 데이터만 추출하겠다는 의미이다.

 

 

CSS selector를 통해 표에서 데이터 추출

from bs4 import BeautifulSoup
import requests

res = requests.get('https://davelee-fun.github.io/blog/crawl_html_css.html')
soup = BeautifulSoup(res.content, 'html.parser')
items = soup.select('tr')
for item in items:
    columns = item.select('td')
    row_str = ''              
    for column in columns:
        row_str += ', ' + column.get_text()
    print(row_str[2:])

 

  • select() 함수를 사용하여 표에서 데이터를 추출하는 경우

```

결과 :

 

일정, 커리큘럼 타이틀, 난이도

5.1 ~ 6.15, 나만의 엣지있는 블로그 사이트 만들기 (취미로 익히는 IT), 초급

6.16 ~ 7.31, 파이썬과 데이터과학 첫걸음 (IT 기본기 익히기), 중급

 

```

 

참고로, row_str = '' 코드는 빈 변수를 선언하는 것이다.

이렇게 선언된 빈 변수 row_str에 표에서 추출한 데이터를 하나씩 넣어주는 원리이다.

또한,  print(row_str[2:])코드에서 슬라이싱 기능은 데이터 전처리를 위해 사용되었다.

 

 

참고내용

BeautifulSoup 라이브러리를 통해 웹 페이지를 분석(파싱)한 후, 데이터를 추출하는 함수로 find()와 select()가 있다.

find() 함수는 select_one() 함수와 상호 호환가능하며, find_all() 함수는 select() 함수와 상호 호환가능하다. 

find() 함수와 select_one() 함수는 인자와 매치되는 태그들 중 첫 번째로 발견되는 태그의 데이터를 가져온다.

반면, find_all() 함수와 select() 함수는 인자와 매치되는 태그들의 데이터를 모두 가져온다.

 

댓글