Apmācība no Semalt: Web kasīšana Python

Nesen esmu apmeklējis KinoPoisk (IMDB krievu versija) un uzzināju, ka gadu gaitā man izdevās novērtēt vairāk nekā 1000 filmas. Es domāju, ka būtu interesanti šos datus izpētīt sīkāk: vai laika gaitā ir mainījušās manu filmu gaumes? Kurā gadalaikā es skatos vairāk filmu?

Bet pirms mēs analizējam un veidojam skaistu grafiku, mums ir jāsaņem dati. Diemžēl daudziem pakalpojumiem nav publiskās API, tāpēc jums ir jāapvelk piedurknes un parsēt html lapas.

Šis raksts ir paredzēts tiem, kas vienmēr vēlējās iemācīties izmantot Web nokopēšanu, bet nedabūja tai roku vai nezināja, kur sākt.

Uzdevums

Mūsu uzdevums ir iegūt datus par jau redzētām filmām: filmas nosaukumu, skatīšanās datumu un laiku, lietotāja vērtējumu.

Faktiski mūsu darbs tiks veikts 2 posmos:

1. posms: lejupielādējiet un saglabājiet HTML lapas

2. posms: parsēt HTML formātā, kas piemērots turpmākai analīzei (csv, json, pandas dataframe uc)

Instrumenti

Ir daudz python bibliotēku http-pieprasījumu nosūtīšanai. Visslavenākais un ļoti ērts ir pieprasījumi.

Ir arī jāizvēlas bibliotēka html parsēšanai.

BeatifulSoup, lxml

Šīs ir divas populārākās bibliotēkas html parsēšanai, un vienas no tām izvēle ir tikai personiska izvēle. Turklāt šīs bibliotēkas ir cieši saistītas viena ar otru: BeautifulSoup sāka izmantot lxml kā iekšēju parsētāju paātrināšanai, un lxml tika pievienots soupparser modulis. Lai salīdzinātu pieejas, es datus parsēšu ar BeautifulSoup un izmantojot XPath selektorus modulī lxml.html.

Datu lejupielāde

Sāksim datu lejupielādi. Pirmkārt, mēģināsim iegūt lapu ar URL un saglabājiet to lokālā failā.

Mēs atveram iegūto failu un redzam, ka tas nav tik vienkārši: vietne mūs uzskatīja par robotu un nerādīs datus.

Uzzināsim, kā darbojas vietne

Pārlūkprogrammai nav problēmu iegūt informāciju no vietnes. Redzēsim, cik precīzi tas nosūta pieprasījumu. Lai to izdarītu, pārlūkprogrammā “Izstrādātāju rīki” izmantojam paneli “Tīkls” (šim nolūkam izmantoju Firebug), parasti pieprasījums, kas mums nepieciešams, ir visgarākais.

Kā redzam, pārlūks arī nosūta galvenēm UserAgent, sīkfailu un citu parametru skaitu. Pirmkārt, mēs vienkārši mēģināsim nosūtīt pareizo UserAgent uz galveni.

Šoreiz mums veicas, un tagad mums ir doti nepieciešamie dati. Ir vērts atzīmēt, ka dažreiz vietne pārbauda arī sīkfailu derīgumu, un tādā gadījumā sesijas Pieprasījumu bibliotēkā palīdzēs.

Lejupielādējiet visas cenas

Tagad mēs varam saglabāt vienu lapu ar tarifiem. Bet parasti lietotājam ir daudz tarifu, un tas ir nepieciešams atkārtot visās lapās. Mūs interesējošās lapas numuru ir viegli pārsūtīt tieši uz URL.

Datu vākšana no HTML

Tagad ķersimies pie datu vākšanas no HTML. Vienkāršākais veids, kā izprast html lapas struktūru, ir pārlūkprogrammā izmantojot funkciju “Pārbaudīt elementu”. Šajā gadījumā viss ir pavisam vienkārši: visa tabula ar likmēm atrodas tagā. Atlasiet šo mezglu:

no bs4 importa BeautifulSoup

no lxml importa html

# Skaista zupa

zupa = BeautifulSoup (teksts)

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

# lxml

koks = html.from (teksts)

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

Uzzināsim, kā izvilkt filmas krievu valodas nosaukumu un saiti uz filmas lapu (arī kā iegūt tekstu un atribūta vērtību).

Ja jums ir nepieciešams iegūt virsrakstu angļu valodā, vienkārši nomainiet “nameRus” uz “nameEng”.

Rezultāti

Mēs iemācījāmies parsēt vietnes, iepazināmies ar bibliotēku pieprasījumiem, BeautifulSoup un lxml, kā arī saņēmām datus, kas piemēroti KinoPoisk jau redzēto filmu turpmākai analīzei.

mass gmail