beautifulsoup는 HTML과 XML 문서를 파싱하기위한 파이썬 패키지입니다. 웹 스크래핑에 유용한 HTML에서 데이터를 추출하는 데 사용할 수있는 구문 분석 된 페이지에 대한 구문 분석 트리를 생성합니다.
Requests 라이브러리는 해당 주소로 요청을 보내면 응답을 받도록 해주는 HTTP 클라이언트 입니다.
HTTP method GET, POST, PUT, DELETE, OPTION을 요청할 수 있습니다.또한 JSON으로 인코딩하거나 파라미터로 가져오는 작업도 가능하게 합니다.
크롤링에서는 Requests 를 이용하여 크롤링 대상 페이지(url)에 접속(GET:리소스 요청)을 위해 쓰입니다.
import requests
# 요청
r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
# 응답
> r.status_code
200
> r.headers['content-type']
'application/json; charset=utf8'
> r.encoding
'utf-8'
> r.text
u'{"type":"User"...'
> r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}
Selenium은 주로 웹앱을 테스트하는데 이용하는 프레임워크입니다. webdriver라는 API를 통해 운영체제에 설치된 Chrome등의 브라우저를 제어하게 됩니다.
selenium은 웹사이트 테스트를 위한 도구로 브라우저 동작을 자동화할 수 있습니다. 셀레니움을 이용하는 웹크롤링 방식은 바로 이점을 적극적으로 활용하는 것입니다. 프로그래밍으로 브라우저 동작을 제어해서 마치 사람이 이용하는 것 같이 웹페이지를 요청하고 응답을 받아올 수 있습니다.
브라우저를 직접 동작시킨다는 것은 JavaScript를 이용해 비동기적으로 혹은 뒤늦게 불러와지는 컨텐츠들을 가져올 수 있다는 뜻입니다. 우리가 requests에서 사용했던 .text의 경우에는 브라우저에서 ‘소스보기’를 한 것과 같이 동작하여, JS등을 통해 동적으로 DOM이 변화한 이후의 HTML을 보여주지 않습니다. 반면 selenium은 실제 웹 브라우저가 동작하기 때문에 JS로 렌더링이 완료된 후의 DOM결과물에 접근이 가능합니다.
- 해당 웹사이트가 프로그램을 통한 접근 허용하지 않는 경우
- 해당 웹사이트가 로그인을 요구하는 경우
- 해당 웹사이트가 동적 웹페이지로 구성되어 있는 경우
위의 경우에는 requests 라이브러리만으로 해결하기에는 쉽지 않습니다. 이럴 때 상황을 해결하는 가장 손쉽고 효과적인 방법이 바로 selenium을 이용하는 것입니다.
selenium으로 크롤링을 하기 위해선 크롤링 할 때 브라우저를 제어하기 위해 사용할 브라우저의 드라이버를 다운 받아야합니다.그 후에 웹 페이지에 접근하기 위한 webdriver 객체를 생성해줘야 합니다.
driver = webdriver.Chrome(chrome_driver_path)
위의 코드로 객체를 생성합니다.
근데 이 경우에는 오류가 생기는 경우가 있습니다.
오류 방지를 위해 다운로드 받은 크롬 드라이버를 사용하는 것이 아니라 웹드라이버 매니저를 설치하여 사용하였습니다.
$ pip install webdriver-manager
이후 웹 드라이버를 다음과 같이 import 하고
from webdriver_manager.chrome import ChromeDriverManager
경로를 다음과 같이 매니저가 직접 설치할 수 있게 지정해주면
크롬 드라이버 매니저가 크롬에 대한 제어권을 얻게 됩니다.