Падручнік Semalt: Web Scraping In Python

Нядаўна я наведаў KinoPoisk (руская версія IMDB) і высветліў, што за гэтыя гады мне ўдалося ацаніць больш за 1000 фільмаў. Я думаў, што было б цікава вывучыць гэтыя дадзеныя больш падрабязна: ці змяніліся густы майго фільма з часам? У якія сезоны года я гляджу больш фільмаў?

Але перад тым, як прааналізаваць і пабудаваць прыгожую графіку, нам трэба атрымаць дадзеныя. На жаль, у многіх службах няма публічнага API, таму вам прыйдзецца закатаць рукавы і разабраць старонкі HTML.

Гэты артыкул прызначана для тых, хто заўжды хацеў навучыцца карыстацца Інтэрнэт-пераходамі, але не ўзяўся за іх альбо не ведаў, з чаго пачаць.

Заданне

Наша задача складаецца ў тым, каб здабыць дадзеныя пра ўжо адлюстраваныя фільмы: назва фільма, дата і час прагляду, рэйтынг карыстальніка.

Фактычна наша праца будзе ажыццяўляцца ў два этапы:

1 этап: загрузка і захаванне HTML-старонак

2 этап: разабраць HTML у фармаце, прыдатным для далейшага аналізу (csv, json, рамкі дадзеных панды і г.д.)

Інструменты

Існуе шмат бібліятэк python для адпраўкі http-запытаў. Самы вядомы і вельмі зручны - Запыты.

Таксама неабходна выбраць бібліятэку для разбору html.

BeatifulSoup, lxml

Гэта дзве самыя папулярныя бібліятэкі для разбору HTML і выбару адной з іх - толькі асабістыя перавагі. Больш за тое, гэтыя бібліятэкі цесна звязаны паміж сабой: BeautifulSoup пачаў выкарыстоўваць lxml як унутраны аналізатар для паскарэння, і ў lxml быў дададзены модуль супарсер. Для параўнання падыходаў я разбяру дадзеныя з BeautifulSoup і з дапамогай селектараў XPath у модулі lxml.html.

Загрузка дадзеных

Пачнем загрузку дадзеных. Перш за ўсё, давайце паспрабуем атрымаць старонку па URL і захаваць яе ў лакальны файл.

Мы адкрываем атрыманы файл і бачым, што гэта не так проста: сайт палічыў нас робатам і не пакажа дадзеныя.

Давайце даведаемся, як працуе сайт

У браўзэры няма праблем з атрыманнем інфармацыі з сайта. Давайце паглядзім, як менавіта ён адпраўляе запыт. Для гэтага мы выкарыстоўваем панэль "Сетка" ў "Сродкі распрацоўшчыкаў" у браўзэры (для гэтага я выкарыстоўваю Firebug), звычайна запыт, які нам патрэбны, самы доўгі.

Як мы бачым, браўзэр таксама адпраўляе ў загалоўкі UserAgent, cookie і яшчэ шэраг параметраў. Па-першае, мы проста паспрабуем адправіць правільны UserAgent ў загаловак.

На гэты раз мы паспяховыя, і цяпер нам даюць неабходныя дадзеныя. Варта адзначыць, што часам сайт таксама правярае сапраўднасць файлаў cookie, у гэтым выпадку дапамогуць заняткі ў бібліятэцы запытаў.

Спампаваць усе цэны

Цяпер мы можам захаваць адну старонку са стаўкамі. Але звычайна карыстальнік мае вялікія тарыфы, і яго неабходна перабіраць праз усе старонкі. Нумар старонкі, які нас цікавіць, лёгка перанесці непасрэдна на URL.

Збор дадзеных з Html

Зараз пераходзім непасрэдна да збору дадзеных з html. Самы просты спосаб зразумець, як структуравана старонка HTML, гэта выкарыстанне ў аглядальніку функцыі "Праверыць элемент". У гэтым выпадку ўсё даволі проста: уся табліца са стаўкамі знаходзіцца ў тэгу. Выберыце гэты вузел:

ад bs4 імпартаваць BeautifulSoup

з lxml імпарту html

# Прыгожы суп

суп = BeautifulSoup (тэкст)

film_list = sou.find ('div', ('class': 'profileFilmsList'))

# lxml

tree = html.fromstring (тэкст)

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

Давайце даведаемся, як выцягнуць рускую назву фільма і спасылку на старонку фільма (таксама, як атрымаць тэкст і значэнне атрыбута).

Калі вам трэба здабыць загаловак на англійскай мове, проста змяніце "nameRus" на "nameEng".

Вынікі

Мы даведаліся, як разбіраць вэб-сайты, пазнаёміліся з запытамі бібліятэк, BeautifulSoup і lxml, а таксама атрымалі дадзеныя, прыдатныя для далейшага аналізу ўжо пабачаных фільмаў на KinoPoisk.