• mksong8

[연재 | 데이터 스크래핑<3>] 파이썬으로 복잡한 웹스크래핑 해결하기



도구, 라이브러리 및 프레임워크 선택

무엇보다 브라우저 도구의 중요성을 강조하고 싶습니다. 웹스크래핑을 효과적으로 잘 계획하면 많은 시간을 절약 할 수 있습니다. 브라우저 도구는 컨텐츠를 찾고, 컨텐츠의 패턴과 복잡성을 분석하고, 어떻게 웹스크래핑을 할 것인지 계획하는 유일한 도구일 경우가 많습니다.

파이썬에는 웹스크래핑을 위한 도구들이 많이 있습니다. 주로 사용되는 몇가지 옵션을 알아보도록 하겠습니다. 간단한 웹사이트를 빠르게 스크래핑 하기 위해서는 세션을 처리하고 Http 요청을 만드는 파이썬 리퀘스트(Python Requests)와 응답을 분석하고 정보 추출을 하는 뷰티풀수프(Beautiful Soup)을 동시에 사용하는 것이 파이썬을 이용한 웹스크래핑에서 가장 좋은 방법이라고 생각합니다.

자바스크립트는 없지만 복잡한 많은 양의 데이터를 처리하고 수집해야 하는 좀더 큰 프로젝트에서는 스크래피(Scrapy)가 유용합니다.

스크래피(Scrapy)는 동시 요청, 메모리 활용 등 스크래핑을 효과적으로 하기 위해 매우 복잡한 사항들을 정리하고 쿠키, 리다이렉션, 세션, 캐싱 등 여러 미들웨어를 연결하는 (라이브러리가 아닌) 프레임워크 입니다. 스크래피(Scrapy)는 셀렉터, 응답 등의 스크패핑 방식을 검증하고 빠르게 프로토타이핑 할 수 있게 도와주는 쉘(shell)을 제공합니다. 이 프레임워크는 안정적이고 확장 가능하며 많은 개발자들이 사용하고 있습니다.

자바스크립트가 많인 쓰인 매우 복잡한 웹사이트는 보통 셀레니움(Selenium)을 사용합니다. 셀레니움(Selenium)으로 스크래핑을 하는 경우 스크래피(Scrapy)나 뷰티풀 수프(Beautiful Soup)를 사용할 때보다 비효율적이지만, 거의 대부분의 원하는 데이터를 얻을 수 있다는 점은 매우 중요합니다.





인증처리

인증 처리 상태를 유지하기 위해서는 쿠키값과 로그인 상태를 유지하여야 하기 때문에 세션을 만드는 것이 좋습니다. 숨겨진 필드가 있는 경우, 브라우저가 제공하는 네트워크 도구를 사용하여 수동으로 로그인 한 후 서버에 전송한 페이로드(payload)를 검사하여 숨겨진 정보를 알아낼 수 있습니다.

오쏘라이제이션(Authorization)과 오쎈티케이션(Authentication)과 같이 인증이 헤더값에 따라 결정되는 경우, 브라우저 도구를 사용해 서버로 전송되는 헤더를 검사하여 코드를 복제할 수 있습니다. 지금은 거의 사라졌지만 간단한 쿠키 인증을 요구하는 웹사이트는 쿠키 내용을 복사하여 스크래핑 코드에 추가 하면 해결 할 수 있습니다. 이때도 내장된 브라우저 도구를 사용합니다.



비동기식 로딩 처리하기

​비동기식 로딩 찾아내기

마우스 오른쪽 버튼을 클릭하여 '소스 보기'를 누르면 나타나는 html 소스를 보고 원하는 컨텐츠를 찾아 비동기 로딩 부분을 찾아 낼 수 있습니다. Html 소스에서 찾을 수 없는데 브라우저에 텍스트가 보인다면 이것은 자바스크립트(JavaScript)로 렌더링 된 것입니다. 사이트에서 XHR 요청을 하는지에 관해서는 브라우저의 네트워크 도구를 이용해 추가로 검사를 진행할 수도 있습니다.

비동기식 로딩에 대하여

웹 드라이버의 사용

웹 드라이버는 스크립트로 제어할 수 있는 인터페이스가 있는 브라우저 시뮬레이션 이라고 생각하면 될 것 같습니다. 자바스크립트 렌더링(JavaScript rendering), 쿠키 및 세션 관리 등과 같이 브라우저가 하는 작업을 수행 할 수 있습니다. 셀레니움 웹 드라이버(Selenium Web Driver)는 웹 사이트의 UI/UX를 테스트하도록 설계된 웹 자동화 프레임 워크이지만 동적으로 렌더링되는 웹사이트의 스크래핑에 널리 사용되고 있습니다.

웹 드라이버는 브라우저의 시뮬레이션 형태입니다. 그래서 뷰티풀수프(Beautiful Soup) 및 스크래피(Scrapy)와 같은 라이브러리와 비교해 보면 리소스 집약적이고 상대적으로 느립니다.

셀레니윰(Selenium)은 파이썬(Python)을 포함하여 스크래핑을 위한 여러 언어를 지원합니다. 일반적으로 브라우저 인스턴스를 생성하고 화면에서 데이터를 클릭하고 입력하는 것과 같은 것을 볼 수 있어 테스트에 유용합니다. 그러나 스크래핑을 할 경우, UI가 없지만 더 빠른 "헤드리스 브라우저(headless browsers)"를 사용할 수 있습니다.

헤드리스 Firefox, PhantomJS, spynner 및 HtmlUnit 등의 다른 헤드리스도 있지만, 크롬 헤드리스(Chrome Headless)는 헤드리스 웹 드라이버로 널리 사용되고 있습니다. 이 중 일부는 화면에 실제로 출력을 하지 않고 가상메모리로 화면 표시 시뮬레이션을 하기 때문에 xvfb와 파이썬 래퍼(Python Wrapper, xvfbwrapper 또는 pyvirtualdisplay)를 설치해야 합니다.

AJAX 호출 검사

'브라우저에 표시 하기 위해 데이터를 가져와야 한다' 라는 생각에서 이 방법론은 시작되었습니다. 브라우저 개발자 도구를 사용하여 AJAX 호출을 검사하고 원하는 데이터를 가져오고자 하는 요청이 무엇인지 알아낼 수 있습니다. 스크립트가 AJAX 요청처럼 보이기 위해 X-Requested-With 헤더를 설정해야 하는 경우도 있습니다.

무한 스크롤 다루기

셀레니움에 자바 스크립트 로직을 추가하여 무한 스크롤을 해결할 수 있습니다 (SO Thread 참고). 브라우저 도구를 사용하여 검사 가능하고 스크래핑 프로그램에서 복제 가능한 추가 AJAX 서버 호출로 무한 스크롤은 구성되어 있습니다.



알맞은 선택자(Selector) 찾기

눈으로 볼 수 있는 추출 해야 할 요소를 찾은 다음 추출 가능한 모든 요소의 선택자 패턴을 html에서 찾아야 합니다. CSS 선택기(Selector)를 사용하여 CSS 클래스 및 속성에 대한 정보를 파악하고 각각의 요소를 필터링 합니다.

스크래핑을 하려면 일반적으로 CSS 선택기를 사용합니다. 그러나 특정 사이트에서는 요소를 선택하는데 XPath (XML 문서의 노드를 선택하기위한 쿼리 언어) 기술이 더 유용 할 수도 있습니다. XPath가 더 다양한 기능을 제공하기 때문입니다. 예를 들어,

- 내용에 따라 선택 요소를 결정합니다. 이 방법을 권장하지는 않지만 페이지 구조가 제대로 구성되지 않은 경우 유용합니다.

- 어떤 방향에서도 검색이 가능합니다. 조부모(grandparents)를 검색하는 쿼리를 만들고 특정 속성/텍스트를 사용하여 자식을 검색할 수 있습니다. 이 방법은 CSS 선택기에서는 불가능합니다.

일부 개발자들은 XPath가 CSS 선택기보다 속도가 느리다고 주장하지만 개인적으로는 차이가 없다고 생각합니다. 종종 CSS 선택기가 XPath 보다 빠르게 작동하지만 그 차이는 밀리 초 정도입니다. 그리고 복잡하지 않고 잘 구성된 웹 페이지를 스크래핑 할 때에는 Chrome / Firefox의 선택 도구를 사용하여 추출 요소의 XPath를 가져와 스크립트에 연결하면 불과 몇 초 만에 데이터를 추출 할 수 있습니다.

앞에서 언급한 바와 같이, 선택기(Selector)를 사용할 경우 확인해야 할 사항이 몇가지 있습니다.

- 브라우저간 실행 가능 여부를 확인해야 합니다. 브라우저마다 CSS 및 XPath 선택기를 적용하기 위해 다른 방법으로 엔진을 구현하고 있습니다. 따라서 매우 드물지만, 특정 브라우저/버전에서 작동하는 선택자라도 다른 브라우저에서는 작동하지 않을 수 있습니다. 다행히 오늘날 대부분의 브라우저는 브라우저 도구 자체에서 이러한 쿼리 확인 및 평가가 가능하므로 실행 가능 여부를 바로 확인할 수 있습니다.

DOM 관리자에서 Ctrl+F를 누르면 CSS 표현식 (또는 XPath)을 검색 쿼리로 사용할 수 있습니다. 브라우저가 모든 작업을 처리하고 일치되는 항목을 모두 보여주어 표현식이 실제로 작동하는지 빠르게 확인할 수 있습니다.

- ID별로 요소를 선택하는 것이 더 빠르므로 불가능한 경우를 제외하고는 ID를 이용해야 합니다.​

- XPpath는 CSS 선택기보다 HTML 구조에 더 밀접하게 연결되어 있습니다. 즉, 웹페이지의 Html 구성에 약간의 변화만 있어도 XPath가 중단 될 가능성이 높습니다.




이번 포스팅에서는 파이썬으로 웹스크래핑을 하기 위해 이용되는 도구, 라이브러리와 프레임워크에 대해 설명해 보았습니다. 다름 편에서는 캡챠 (Captcha) 와 아이프레임을(iframe) 어떻게 해결 하는지, 다른 유용한 도구에는 어떤 것들이 있는지 알아보며 이번 연재를 마무리 하도록 하겠습니다.


=========================

스파이더킴 (www.spiderkim.com)

데이터 수집/정제/분석/시각화에서 최고의 서비스를 제공합니다.

지금 바로 홈페이지를 방문하셔서, 문의 요청해 주십시오!

조회 234회

​고객센터

Tel: 02-596-8900  Fax : 02-6930-5709

10시 - 오후 7시(토, 일요일 및 공휴일은 휴무)

개인정보관리책임자 : 황재준   상호 : 유펜솔루션   대표자 : 김재훈   사업자등록번호 : 426-86-00939
주소 : (본사)대전광역시 유성구 엑스포로446번길 38, 3층 302호 / (지사 및 연구소)서울시 성동구 연무장 15길 11, B동 2층
​ⓒ 2019 UpennSolution Co., Ltd. All rights reserved.