Oktatóanyag a Semalt-tól: webkaparás a Python-ban

Nemrégiben meglátogattam a KinoPoiskot (az IMDB orosz verziója), és rájöttem, hogy az évek során több mint 1000 filmet sikerült értékelnem. Arra gondoltam, hogy érdekes lenne ezeket az adatokat részletesebben kutatni: változott-e a film ízlésem az idő múlásával? Az év melyik évszakában nézhetek több filmet?

De mielőtt elemeznénk és szép grafikákat építnénk, meg kell szereznünk az adatokat. Sajnos sok szolgáltatásnak nincs nyilvános API-ja, ezért fel kell tekernie a hüvelyét és elemeznie a html oldalakat.

Ez a cikk azoknak szól, akik mindig is meg akarták tanulni, hogyan kell használni a webkaparást, de nem tudták megtenni a kezüket, vagy nem tudták, hová kezdjék.

Feladat

Feladatunk a már látott filmek adatainak kinyerése: a film címe, a megtekintés dátuma és ideje, a felhasználó minősítése.

Valójában munkánkat két szakaszban fogjuk elvégezni:

1. szakasz: töltse le és mentse a html oldalakat

2. szakasz: elemezze a html fájlt további elemzésre alkalmas formátumban (csv, json, pandas dataframe stb.)

Instruments

Nagyon sok python-könyvtár található a http-kérések küldéséhez. A leghíresebb és nagyon praktikus a Requests.

Azt is ki kell választani a könyvtárat a html elemzéshez.

BeatifulSoup, lxml

Ez a két legnépszerűbb könyvtár a html elemzéséhez, és egyikük kiválasztása csupán személyes preferencia. Sőt, ezek a könyvtárak szorosan kapcsolódnak egymáshoz: a BeautifulSoup az lxml-t kezdte használni a gyorsítás belső elemzőjének, és az lxml-ben egy leveskészítő modult adtak hozzá. A megközelítések összehasonlításához elemzem az adatokat a BeautifulSoup segítségével és az XPath választók használatával az lxml.html modulban.

Adatok letöltése

Kezdjük az adatok letöltésével. Először is, csak próbáljuk meg elérni az oldalt url alapján, és mentsük el egy helyi fájlba.

Nyitjuk meg a kapott fájlt, és látjuk, hogy nem olyan egyszerű: a webhely robotnak minket tartott, és nem jeleníti meg az adatokat.

Nézzük meg, hogyan működik az oldal

A böngészőnek nincs probléma az információk beszerzésével a webhelyről. Lássuk, pontosan hogyan küldi el a kérelmet. Ehhez a böngésző "Fejlesztő eszközei" "Hálózat" paneljét használjuk (erre Firebugot használok), általában a leghosszabb kérés szükséges.

Mint láthatjuk, a böngésző továbbküldi a fejlécbe a UserAgent, a cookie-kat és egy újabb számú paramétert. Először csak megpróbáljuk a helyes UserAgent-t elküldeni egy fejlécbe.

Ezúttal sikeresek vagyunk, és most megkaptuk a szükséges adatokat. Érdemes megjegyezni, hogy a webhely néha ellenőrzi a sütik érvényességét is, ebben az esetben a Kérések könyvtár munkamenete segít.

Töltse le az összes árat

Most egy oldalt menthetünk áron. De általában a felhasználónak nagyon sok ráfordítása van, és minden oldalon el kell végeznie az iterálást. A számunkra érdeklő oldalszámot könnyedén lehet közvetlenül átadni az URL-hez.

Adatok gyűjtése a HTML-ről

Most kezdjük el közvetlenül az adatok gyűjtését a html-ből. A html oldal felépítésének megértése a böngészőben az "Elem ellenőrzése" funkció használatával a legegyszerűbben. Ebben az esetben minden meglehetősen egyszerű: a teljes táblázat a tarifákkal szerepel a címkében. Válassza ki ezt a csomópontot:

a bs4-ből importálja a BeautifulSoup-ot

az lxml import html fájlból

# Gyönyörű leves

leves = BeautifulSoup (szöveg)

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

# lxml

fa = html.from (szöveg)

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

Tanuljuk meg, hogyan lehet kihúzni a film orosz címét és a film oldalára mutató linket (valamint a szöveg és az attribútum értékének beolvasása).

Ha angolul ki kellene töltenie a címet, akkor változtassa meg a "nameRus" -et "nameEng" -re.

Eredmények

Megtanultak webhelyek elemzésére, megismertük a Requests, a BeautifulSoup és az lxml könyvtárakat, valamint olyan adatokat kaptunk, amelyek alkalmasak a KinoPoiskon már látott filmek további elemzésére.

mass gmail