Semalt의 튜토리얼 : Python에서 웹 스크랩 핑

최근에 KinoPoisk (러시아 버전의 IMDB)를 방문하여 수년 동안 1000 편 이상의 영화를 평가할 수 있음을 알게되었습니다. 이 데이터를 더 자세히 조사하는 것이 흥미로울 것이라고 생각했습니다. 시간이지나면서 영화 취향이 바뀌 었습니까? 일년 중 어느 계절에 더 많은 영화를 보나요?

그러나 아름다운 그래픽을 분석하고 구축하기 전에 데이터를 얻어야합니다. 불행히도 많은 서비스에는 공용 API가 없으므로 소매를 롤업하고 html 페이지를 구문 분석해야합니다.

이 기사는 웹 스크래핑 사용법을 배우고 싶지만 손에 손을 대지 않았거나 어디서부터 시작해야할지 모르는 사용자를 위해 작성되었습니다.

직무

우리의 임무는 이미 본 영화에 대한 데이터를 추출하는 것입니다 : 영화 제목, 시청 날짜 및 시간, 사용자 등급.

실제로 우리의 작업은 2 단계로 진행될 것입니다.

1 단계 : HTML 페이지 다운로드 및 저장

2 단계 : 추가 분석에 적합한 형식으로 HTML 구문 분석 (csv, json, pandas 데이터 프레임 등)

계기

http-requests를 보내기위한 많은 파이썬 라이브러리가 있습니다. 가장 유명하고 매우 편리한 것은 요청입니다.

html 파싱을위한 라이브러리를 선택해야합니다.

BeatifulSoup, lxml

이들은 html을 파싱하는 데 가장 인기있는 두 가지 라이브러리이며 그중 하나를 선택하는 것은 개인적인 취향입니다. 또한이 라이브러리들은 서로 밀접하게 연결되어 있습니다. BeautifulSoup은 가속을 위해 내부 파서로 lxml을 사용하기 시작했으며 lxml에는 수프 파서 모듈이 추가되었습니다. 접근 방식을 비교하기 위해 BeautifulSoup으로 데이터를 구문 분석하고 lxml.html 모듈에서 XPath 선택기를 사용합니다.

데이터 다운로드

데이터 다운로드를 시작하겠습니다. 우선, URL로 페이지를 가져 와서 로컬 파일에 저장해 봅시다.

우리는 결과 파일을 열고 그것이 간단하지 않다는 것을 알았습니다. 사이트는 우리를 로봇으로 간주하고 데이터를 표시하지 않습니다.

사이트가 어떻게 작동하는지 알아 봅시다

브라우저는 사이트에서 정보를 얻는 데 아무런 문제가 없습니다. 요청이 정확히 어떻게 전송되는지 봅시다. 이를 위해 브라우저의 "개발자 도구"에있는 "네트워크"패널을 사용합니다 (저는 Firebug를 사용합니다). 일반적으로 필요한 요청이 가장 깁니다.

보시다시피 브라우저는 헤더 UserAgent, 쿠키 및 다른 많은 매개 변수로도 보냅니다. 먼저 올바른 UserAgent를 헤더로 보내려고합니다.

이번에는 성공했으며 이제 필요한 데이터가 제공됩니다. 때로는 사이트에서 쿠키의 유효성을 검사하는 경우도 있습니다.이 경우 요청 라이브러리의 세션이 도움이됩니다.

모든 요금 다운로드

이제 한 페이지를 요율로 저장할 수 있습니다. 그러나 일반적으로 사용자에게는 많은 요금이 부과되므로 모든 페이지를 반복해야합니다. 관심있는 페이지 번호는 URL로 직접 쉽게 옮길 수 있습니다.

HTML에서 데이터 수집

이제 html에서 데이터를 직접 수집 해 봅시다. html 페이지의 구조를 이해하는 가장 쉬운 방법은 브라우저에서 "요소 검사"기능을 사용하는 것입니다. 이 경우 모든 것이 매우 간단합니다. 요율이 포함 된 전체 테이블이 태그에 있습니다. 이 노드를 선택하십시오 :

bs4에서 가져 오기 BeautifulSoup

lxml 가져 오기 HTML에서

# 아름다운 수프

수프 = BeautifulSoup (텍스트)

film_list = soup.find ( 'div', ( '클래스': 'profileFilmsList'))

# lxml

트리 = html.fromstring (텍스트)

film_list_lxml = tree.xpath ( '// div [@class =' 'profileFilmList' ']') [0]

영화의 러시아어 제목과 영화 페이지의 링크를 가져 오는 방법 (텍스트 및 속성 값을 얻는 방법)을 알아 봅니다.

영어로 제목을 추출해야하는 경우 "nameRus"를 "nameEng"로 변경하십시오.

결과

우리는 웹 사이트를 파싱하는 방법, 도서관 Requests, BeautifulSoup 및 lxml에 익숙해졌으며 KinoPoisk에서 이미 본 영화에 대한 추가 분석에 적합한 데이터를 받았습니다.