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

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

Але перед тим, як проаналізувати та побудувати гарну графіку, нам потрібно отримати дані. На жаль, у багатьох сервісах немає публічного API, тому вам доведеться закатати рукави та проаналізувати HTML-сторінки.

Ця стаття призначена для тих, хто завжди хотів навчитися користуватися веб-перехопленням, але не брав до цього рук або не знав, з чого почати.

Завдання

Наше завдання - отримати дані про вже переглянуті фільми: назва фільму, дата та час перегляду, рейтинг користувача.

Насправді наша робота буде виконуватися у 2 етапи:

Етап 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

дерево = html.fromstring (текст)

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

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

Якщо вам потрібно витягнути заголовок англійською мовою, просто змініть "nameRus" на "nameEng".

Результати

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

mass gmail