HTML 스크랩 하기

../_images/34268661876_442428e122_k_d.jpg

웹 스크랩 하기

웹사이트는 HTML로 작성된다. 이는 곧 각각의 웹페이지는 구조화된 문서라는 의미이다. 구조화 된 포맷 덕분에 HTML에서 데이터를 얻기에 아주 좋다. 그러니 이 작업을 하는 동안 데이터 구조를 보존하는 게 좋다. 웹사이트들이 항상 자신의 데이터를 CSV나 JSON 처럼 쓰기 편한 방식으로 제공하는 것은 아니다.

이 지점에서 웹 스크랩이 시작된다. 웹 스크랩핑은 컴퓨터 프로그램을 사용하여 웹 페이지를 검색한 후 데이터 구조를 보존하면서 사용자에게 가장 유용한 형식으로 필요한 데이터를 수집하는 작업입니다.

lxml과 Requests

lxml 은 XML과 HTML 문서를 아주 빠르게 처리하기 위하여 작성된 대규모 라이브러리이다. 심지어 구문 분석 중에 잘못된 태그를 처리해주기도 한다. Requests 모듈도 사용할 것이다. urllib2 모듈보다 속도와 가독성 면에서 뛰어나기 때문이다. pip install lxmlpip install requests 로 둘 다 간단히 설치할 수 있다.

import부터 시작하자

from lxml import html
import requests

그 단계는 requests.get 이다. 우리의 데이터로 웹페이지를 조회하고 html 모듈로 파싱할 것이다. 그리고 tree 에에 저장할 것이다.

page = requests.get('http://econpy.pythonanywhere.com/ex/001.html')
tree = html.fromstring(page.content)

(page.text 보다는 page.content 를 사용하는 게 좋다. 왜냐하면 html.fromstring 은 묵시적으로 bytes 을 인풋으로 하기 때문이다.

이제 tree 는 HTML 파일 전체를 멋진 트리 구조에 담았다. 이제 2가지 접근법이 가능하다. XPath 와 CSSSelect 이다. 예제에서는 XPath로 하겠다.

XPath는 HTML 또는 XML 문서와 같은 구조화된 문서에서 정보를 찾는 방법입니다. XPath에 대한 좋은 소개는 `W3Schools <http://www.w3schools.com/xml/xpath_intro.asp>`_에 있습니다.

또한 FireBug for Firefox 또는 Chrome Inspector와 같은 엘리먼트의 XPath를 얻기 위한 다양한 도구가 있습니다. 크롬을 사용하는 경우 엘리먼트를 마우스 오른쪽 버튼으로 클릭하고 '요소 검사'를 선택한 후 코드를 강조 표시하고 다시 마우스 오른쪽 버튼을 클릭한 후 'Copy XPath'를 선택할 수 있습니다.

빠른 분석 후, 우리는 우리 페이지에서 데이터가 두 가지 요소에 포함되어 있음을 알 수 있습니다. 하나는 'buyer-name'이라는 제목이 있는 div고 다른 하나는 class 'item-price'이 있는 span입니다.

<div title="buyer-name">Carson Busses</div>
<span class="item-price">$29.95</span>

이를 알고 올바른 XPath 쿼리를 만들어 다음과 같은 lxml xpath 함수를 사용할 수 있습니다.

#This will create a list of buyers:
buyers = tree.xpath('//div[@title="buyer-name"]/text()')
#This will create a list of prices
prices = tree.xpath('//span[@class="item-price"]/text()')

정확히 어떤 것들이 있는지 봅시다.

print('Buyers: ', buyers)
print('Prices: ', prices)
Buyers:  ['Carson Busses', 'Earl E. Byrd', 'Patty Cakes',
'Derri Anne Connecticut', 'Moe Dess', 'Leda Doggslife', 'Dan Druff',
'Al Fresco', 'Ido Hoe', 'Howie Kisses', 'Len Lease', 'Phil Meup',
'Ira Pent', 'Ben D. Rules', 'Ave Sectomy', 'Gary Shattire',
'Bobbi Soks', 'Sheila Takya', 'Rose Tattoo', 'Moe Tell']

Prices:  ['$29.95', '$8.37', '$15.26', '$19.25', '$19.25',
'$13.99', '$31.57', '$8.49', '$14.47', '$15.86', '$11.11',
'$15.98', '$16.27', '$7.50', '$50.85', '$14.26', '$5.68',
'$15.00', '$114.07', '$10.09']

축하합니다! lxml 와 Requests를 사용하여 웹 페이지에서 원하는 모든 데이터를 성공적으로 스크랩했습니다. 우리는 그것을 두 개의 목록으로 메모리에 저장했습니다. 이제 우리는 파이썬을 사용하여 웹을 분석하거나 파일에 저장하여 세상과 공유할 수 있습니다.

이 예제 데이터 세트의 나머지 페이지를 반복하도록 이 스크립트를 수정하거나, 속도를 높이기 위해 스레드를 사용하도록 이 응용 프로그램을 다시 작성하는 방법을 생각해 볼 수 있습니다.