크롤링 시 웹 요소를 선택할 때 Beautifulsoup, Selenium 모듈을 사용하는 방법이 대표적이다.
두 모듈의 웹 요소 선택 사용법을 설명 하기 전 필수로 알아둬야 하는 개념 하나를 짚고 넘어갈 것이다.
CSS에서 tag, class, id를 선언하여 스타일을 설정할 수 있는데, 선언할 때 이 셋을 구별하기 위한 선언 규칙이 있다.
- tag : 그냥 tag명을 쓰면 된다.
tag명 {
...
}
- class : class명 앞에 .을 붙인다.
.class명 {
...
}
- id : id명 앞에 #을 붙인다.
#id명 {
...
}
사전 지식은 이 정도면 충분하다.
이 CSS문법이 적용되는 메소드가 몇 개 있는데 앞으로 이들은 빨간 표시로 강조 할 것이다.
두 모듈에서 tag, class, id, attribute 를 기준으로, 그리고 하위 요소로 범위를 좁혀나가며 웹 요소를 정확하게 선택하기 위한 방법을 본격적으로 설명할 것이다.
1. Beautifulsoup
Beautifulsoup에서 웹 요소를 선택하기 위한 메소드 select_one, select, find, find_all을 소개하겠다.
findAll도 있긴 한데, find_all과는 Beautifulsoup 버전의 차이이다.
결론부터 말하면 findAll 말고 find_all 을 쓰자. 네이밍을 소문자로 하기 위해 Beautifulsoup4 버전에서는 find_all을 쓰기로 했다고 한다.
select, find_all은 요소를 리스트 형태로 반환하고
select_one, find는 하나의 요소만 반환하되, 중복이 있을 경우에는 가장 먼저 찾은 요소를 반환하는 것이 원칙이다.
(select_one, select는 CSS문법을 사용한다. 앞서 CSS 선언 규칙을 설명한 것은 select를 설명하기 위함이다)
select와 find(find_all) 둘 중 하나를 써야 한다고 했을 때 본인은 주저 없이 select를 고를 것이다.
find는 하위 요소로 범위를 좁혀 나갈 때 반복적으로 메소드를 작성해야 하는데,
ex) soup.find('li').find('p').find('a')
select는 이를 한 문자열으로 쓸 수 있기 때문에 더 직관적이며, 수행시간과 메모리 소모량 모두 우수하다.
ex) soup.select('li p a')
1) find(find_all로 해도 인자는 동일)
tag로 찾기 : find('태그명')
class로 찾기 : find('태그명', class_='class명') [파이썬에서 class는 예약어 이기 때문에 뒤에 _를 붙임]
id로 찾기 : find('태그명', id='id명')
속성명으로 찾기 : find('태그명', {'속성명':'속성값'})
참고로 두 인자 중 하나만 써도 잘 동작한다.
2) select_one(select로 해도 인자는 동일)
select 메소드는 문자열 형태인 하나의 인자로 요소를 선택할 수 있다고 앞서 언급하였다.
하위 요소는 띄어 쓰기 ' ' 를 경계로, 직계 하위 요소는 ' > '를 경계로 작성하면 된다. >도 양옆에 한칸씩 띄어야 한다.
ex1) <div> 태그 안에 있는 <a> 태그 찾기 : select_one('div a')
ex2) <div> 태그 안에 있는 id명이 'kim' 인 요소 찾기 : select_one('div #kim')
ex3) <div> 태그 이면서, id명이 'kim' 인 요소 찾기 : select_one('div#kim') // 붙여쓰기
ex4) class명이 'coder' 인 요소 찾기 : select_one('.coder')
ex5) <li> 태그 이면서, id명이 'kim' 이면서, class명이 'coder'인 요소 찾기 : select_one('li#kim.coder')
ex6) <p> 태그의 직계 하위 요소인 <a> 태그 찾기 : select_one('p > a')
ex7) 'href' 의 속성값이 "https://www.kimcoder.tistory.com" 인 <a> 태그 찾기 : select_one('a[href=https://www.kimcoder.tistory.com]')
find_all 이나 select 메소드를 이용해서 찾은 요소를 모은 리스트 명을 check라고 했을 때
check[index].text로 태그를 제외한 text부분만 추출할 수 있고
check[index]['속성명'] 혹은 check[index].get('속성명') 으로 넣어준 속성명에 해당하는 속성값을 추출할 수도 있다.
find나 select_one 메소드를 이용하여 하나의 요소만 check 변수에 담았다면
[index] 만 그대로 빼면 된다. (텍스트 추출: [index].text -> check.text, 속성값 추출도 동일)
2. Selenium
webdriver 객체에도 웹 요소를 선택할 수 있는 메소드가 있다.
1) find_element_by_id : id로 요소 검색
2) find_element_by_name : name 속성으로 요소 검색
3) find_element_by_xpath : xpath로 요소 검색
4) find_element_by_link_text : 링크 주소로 요소 검색, 대표적으로 <a> 태그에 대해 사용함
5) find_element_by_partial_link_text : 링크 주소의 일부로 요소 검색, 하위 디렉토리 문서까지 모두 검색하기 위한 용도
6) find_element_by_tag_name : 태그로 요소 검색
7) find_element_by_class_name : 클래스로 요소 검색
8) find_element_by_css_selector : 이 메소드는 CSS문법을 사용한다.
찾은 요소들의 text, 속성값 추출법은 Beautifulsoup과 동일하다.
조금 더 보충이 필요한 사항이 있다면 댓글로 남겨도 좋다.
'Crawling' 카테고리의 다른 글
[크롤링, 예제 5] 이미지를 크롤링 해서 컴퓨터에 저장하기 (25) | 2021.03.10 |
---|---|
[크롤링, 예제 4] Youtube - 필터를 적용하여 영상 목록 보기 (0) | 2020.11.02 |
[크롤링, 예제 3] 게임 포럼 사이트에서 정보 긁어오기 (+그래프) (0) | 2020.10.31 |
[크롤링, 예제 2] 레벨 분포 구하기 (0) | 2020.10.26 |
[크롤링, 예제 1-3] Selenium - 새 창 안띄우고 크롤링 하기 (0) | 2020.10.23 |
댓글