[크롤링] 웹 크롤링 BeautifulSoup (1)
1. 웹 크롤링
- Web crawler : 웹 페이지의 데이터를 모아주는 소프트웨어
- Web crawling : 크롤러를 사용하여 웹 페이지의 데이터를 추출해내는 행위
2. BeautifulSoup4
- HTML 정보로부터 원하는 데이터를 가져오기 쉽게 비슷한 분류의 데이터별로 나누어주는(parsing) 파이썬 라이브러리
- 웹 페이지의 전체 HTML 코드를 가져온다.
- 크롤링을 원하는 부분의 HTML 태그를 찾는다.
- 해당 태그를 꺼낸 다음 태그를 제거하고 내부의 데이터만 뽑아낸다.
- 설치 : 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단위로 꺼낸다.