Урок от Semalt: Web Scraping In Python

Наскоро посетих KinoPoisk (руска версия на IMDB) и разбрах, че през годините успях да оценя над 1000 филма. Мислех, че би било интересно да проуча тези данни по-подробно: променили ли се са ми вкусовете на филмите във времето? През кои сезони на годината гледам повече филми?

Но преди да анализираме и изградим красива графика, трябва да вземем данните. За съжаление, много услуги нямат публичен API, така че трябва да запретнете ръкави и да анализирате html страниците.

Тази статия е предназначена за онези, които винаги са искали да научат как да използват Web Scrapping, но не са успели да го направят или не знаят откъде да започнат.

задача

Нашата задача е да извлечем данните за вече гледаните филми: заглавието на филма, датата и часа на гледане, рейтингът на потребителя.

Всъщност работата ни ще се извърши на два етапа:

Етап 1: изтегляне и запазване на HTML страници

Етап 2: анализиране на HTML във формат, подходящ за по-нататъшен анализ (csv, json, рамка от данни на панди и т.н.)

инструменти

Има много python-библиотеки за изпращане на http-заявки. Най-известният и много удобен е „Искания“.

Необходимо е също така да изберете библиотека за html разбор.

BeatifulSoup, lxml

Това са двете най-популярни библиотеки за анализ на html и избирането на една от тях е само лично предпочитание. Нещо повече, тези библиотеки са тясно свързани помежду си: BeautifulSoup започна да използва lxml като вътрешен анализатор за ускорение и в lxml беше добавен модул за разделяне на супа. За да сравня подходите, ще анализирам данните с BeautifulSoup и използвайки XPath селектори в модула lxml.html.

Изтегляне на данни

Нека започнем да изтегляме данни. На първо място, нека просто се опитаме да вземем страницата чрез url и да я запишем в локален файл.

Отваряме получения файл и виждаме, че не е толкова просто: сайтът ни смята за робот и няма да показва данните.

Нека да разберем как работи сайтът

Браузърът няма проблем с получаването на информация от сайта. Нека видим как точно изпраща заявката. За целта използваме панела "Мрежа" в "Инструменти за програмисти" в браузъра (използвам Firebug за това), обикновено заявката, от която се нуждаем, е най-дългата.

Както виждаме, браузърът изпраща и до заглавки UserAgent, бисквитка и друг брой параметри. Първо, просто ще се опитаме да изпратим правилен UserAgent в заглавие.

Този път сме успешни и сега ни се предоставят необходимите данни. Струва си да се отбележи, че понякога сайтът също проверява валидността на бисквитките, в този случай сесиите в библиотеката с заявки ще помогнат.

Изтеглете всички цени

Сега ние сме в състояние да запазим една страница с тарифи. Но обикновено потребителят има много проценти и е необходимо да се повтаря през всички страници. Номерът на страницата, който ни интересува, е лесно да се прехвърли директно в URL адреса.

Събиране на данни от Html

Сега нека преминем директно към събирането на данните от html. Най-лесният начин да разберете как е структурирана html страницата е с помощта на функцията "Проверка на елемент" в браузъра. В този случай всичко е съвсем просто: цялата таблица с проценти е в маркера. Изберете този възел:

от bs4 import 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.