crawling 6 - BeautifulSoup
웹 크롤링을 하는 방법 중 지금까지는 파이썬의 pandas 라이브러리를 사용했었다.
하지만 pandas 외에도 BeautifulSoup 이라는 라이브러리를 사용할 수도 있다.
1. 크롤링할 웹사이트 request
사용할 라이브러리는 아래와 같다.
requests는 웹서버에 정보를 요청하는데 사용하고,
BeautifulSoup는 데이터 파싱에 주로 사용한다.
import requests
from bs4 import BeautifulSoup as bs
이동할 웹사이트는 네이버 검색창에 '제주도'를 입력했을 떄 뜨는 창이다.
requests를 이용해 url을 전달해서 결과를 받아오고,
BeautifulSoup을 사용하여 응답 본문을 HTML 파싱한다.
파싱된 HTML은 soup 변수에 저장된다.
이때 soup를 출력해보면 알아볼 수 없는 텍스트로 출력된다.
keyword = '제주도'
url = f'https://search.naver.com/search.naver?query='제주도'&nso=&where=blog&sm=tab_opt'
res = requests.get(url)
soup = bs(res.text, 'html.parser')
2. 데이터 추출
위의 soup에서 데이터를 추출하려면 다음과 같다.
pandas를 이용한 크롤링처럼 당연히 홈페이지에서의 html을 확인하고, 클래스 명과 요소를 확인해야 한다.
아래 코드는 soup 객체에서 <a> 태그 중 class 속성이 title_link인 모든 요소를 찾으라는 뜻이다.
여기서 title_link는 각 블로그들의 제목요소들의 class_name이다.
soup.find_all('a', class_='title_link')
이 코드를 for문이랑 결합시켜 위의 결과를 텍스트로 전환해 리스트화 하려면 아래와 같이 쓴다.
title = [i.text for i in soup.find_all('a', class_='title_link')]
같은 방법으로 날짜와 내용도 추출한다.
date = [i.find('span').text for i in soup.find_all('div', class_='user_info')]
content = [i.text for i in soup.find_all('a', class_='dsc_link')]
이것을 데이터 프레임으로 만들면 아래와 같다.
df = pd.DataFrame({'title':title, 'date':date, 'content':content})
df
pandas를 이용한 crawling 포스팅에서,
html의 요소와 class name을 찾는 자세한 방법들을 스크린샷을 활용해 메모해두었기 때문에
이 글에서는 간단히 코드 분석 및 리뷰만 한다.
pandas는 좀더 직접적?으로 가지고 올 요소를 확실히 알 수 있고, 개별적으로 추출해올 수 있었다.
요소를 하나 들고 오는데 성공하면, 코드를 확장시키면서 여러개로 만들고, 반복문을 쓰고, js를 실행하고...
BeautifulSoup를 이용한 크롤링은 모든 요소들을 가지고와 내가 리스트화를 해야한다는 점이 특징인것 같다.
하지만 하나의 요소에서 여러개의 요소로 찾는 번거로움이 좀 덜한것 같고.
어떤 방법이 더 편하고 좋은지는 그때 그때 판단해서 써보면 될텐데, 큰 차이가 있는진 사실 잘 모르곘다.