Туторијал од Semalt: Web Scraping во Пајтон

Неодамна ја посетив КиноПоиск (руска верзија на IMDB) и дознав дека со текот на годините успеав да оценам над 1000 филмови. Мислев дека би било интересно да се истражат овие податоци подетално: дали ми се менуваат вкусовите на филмот со текот на времето? Во кои сезони од годината гледам повеќе филмови?

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

Оваа статија е наменета за оние кои отсекогаш сакале да научат како да користат Веб Отсекување, но не ги фатија рацете или не знаеја од каде да започнат.

Задача

Наша задача е да ги извлечеме податоците за веќе видените филмови: насловот на филмот, датумот и времето на гледање, рејтингот на корисникот.

Всушност, нашата работа ќе се одвива во 2 фази:

Фаза 1: преземете и зачувајте ги HTML страниците

Фаза 2: анализирајте HTML во формат погоден за понатамошна анализа (csv, json, pandas dataframe итн.)

Инструменти

Постојат многу питони-библиотеки за испраќање на Барања за http. Најпознатата и многу корисна е Барањата.

Исто така, неопходно е да се избере библиотека за html парсирање.

BeatifulSoup, lxml

Овие се двете најпопуларни библиотеки за анализирање html и изборот на една од нив е само личен избор. Покрај тоа, овие библиотеки се тесно поврзани едни со други: BeautifulSoup започна да користи lxml како внатрешен парсер за забрзување, а во lxml, додаден е модул за суперсајзер. За да ги споредим приодите, ќе ги анализирам податоците со BeautifulSoup и користејќи селектори на XPath во модулот lxml.html.

Преземање на податоци

Ајде да започнеме со преземање на податоците. Прво на сите, ајде да се обидеме да ја добиеме страницата преку урл и да ја зачуваме на локална датотека.

Ние ја отвориме добиената датотека и гледаме дека не е толку едноставно: страницата нè сметаше за робот и нема да ги прикажува податоците.

Ајде да откриеме како функционира страницата

Прелистувачот нема проблем со добивање информации од страницата. Ајде да видиме како точно го испраќа барањето. За да го направите ова, ние го користиме панелот "Мрежа" во "Алатки за развој" во прелистувачот (јас го користам Firebug за ова), обично, барањето што ни треба е најдолго.

Како што можеме да видиме, прелистувачот исто така испраќа до заглавјата UserAgent, колаче и друг број параметри. Прво, ние само ќе се обидеме да испратиме точен UserAgent на заглавието.

Овој пат сме успешни, а сега ни ги даваат потребните податоци. Вреди да се напомене дека понекогаш страницата ја проверува валидноста на колачето, во кој случај сесиите во библиотеката Барања ќе ви помогнат.

Преземете ги сите цени

Сега можеме да зачуваме една страница со цени. Но, вообичаено, корисникот има многу стапки, и неопходно е да се изврши повторување низ сите страници. Бројот на страницата што нè интересира е лесно да се пренесе директно на адресата.

Собирање на податоци од HTML

Сега ајде директно да ги собереме податоците од html. Најлесен начин да се разбере како е структурирана страницата html е со употреба на функцијата "Inspect element" во прелистувачот. Во овој случај, сè е прилично едноставно: целата табела со стапки е во ознаката. Изберете го овој јазол:

од bs4 увезување убава група

од lxml увоз html

# Прекрасна супа

супа = убава супа (текст)

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

# lxml

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

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

Ајде да научиме како да го извлечеме рускиот наслов на филмот и врска до страницата на филмот (исто така, како да го добиете текстот и вредноста на атрибутот).

Ако треба да извлечете наслов на англиски, само променете го "nameRus" во "nameEng".

Резултати

Научивме како да анализираме веб-страници, се запознавме со барањата за библиотеки, BeautifulSoup и lxml, како и добивме податоци погодни за понатамошна анализа на веќе видени филмови на KinoPoisk.