인프런 파이썬 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.
크롤링 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() 함수는 인자와 매치되는 태그들의 데이터를 모두 가져온다.
'Python' 카테고리의 다른 글
Python - 크롤링 라이브러리 비교(requests vs urllib) (0) | 2021.10.31 |
---|---|
Python - 크롤링 실전 연습(1) (0) | 2021.10.31 |
Python - 크롤링 기술 팁 (0) | 2021.10.29 |
Python - HTML·CSS 이해와 크롤링 (0) | 2021.10.28 |
Python - crawling pattern (0) | 2021.10.28 |
댓글