Érdes

Webes kaparás Python Scrapy Modullal

Webes kaparás Python Scrapy Modullal
A webes kaparás készsége ma arannyá vált, ezért tanuljuk meg, hogyan szerezhetjük be a szükséges adatokat a weboldalakról. Ebben a cikkben a Scrapy Python könyvtárról beszélnénk, arról, hogy mire képes és hogyan kell használni. Kezdjük el.

Miért Scrapy?

A Scrapy egy robusztus web-lekaparó könyvtár, amely lehetővé teszi weboldalak, képek és minden olyan adat letöltését, amelyre villámgyorsan gondolhat. A sebességnek nagy jelentősége van a számításban, és a Scrapy ezen dolgozik, mivel aszinkron módon látogatja meg a weboldalakat, és rengeteg háttérmunkát végez, így az egész feladat könnyűnek tűnik.

El kell mondani, hogy a Pythonnak vannak más könyvtárai, amelyek felhasználhatók az adatok lekaparására a webhelyekről, de egyik sem hasonlítható a Scrapy-hez, ha a hatékonyságról van szó.

Telepítés

Vessünk egy gyors pillantást arra, hogyan telepíthető ez a hatékony könyvtár a számítógépére.

A legtöbb Python-könyvtárhoz hasonlóan a Scrapy telepíthető a pip modul segítségével:

pip install Scrapy

Ellenőrizheti, hogy a telepítés sikeres volt-e, ha hulladékot importál a Python interaktív shelljébe.

$ python
Python 3.5.2 (alapértelmezett, 2017. szeptember 14., 22:51:06)
[ÖET 5.4.0 20160609] a linuxon

Írja be a „help”, a „copyright”, a „credits” vagy a „license” szót további információkért.

>>> hulladék importálása

Most, hogy végeztünk a telepítéssel, menjünk bele a dolgok sűrűjébe.

Webkaparási projekt létrehozása

A telepítés során a scrapy kulcsszót hozzáadták az útvonalhoz, így közvetlenül a parancssorból használhatjuk a kulcsszót. Ezt kihasználnánk a könyvtár egész ideje alatt.

A kívánt könyvtárból futtassa a következő parancsot:

scrapy startproject weblapozó

Ezzel létrehoznánk egy nevű könyvtárat webkaparó az aktuális könyvtárban és selejt.cfg fájl. Ban,-ben webkaparó  könyvtárnak lenne __benne__.py, tárgyak.py, köztes eszközök.py, csővezetékek.py, beállítások.py fájlok és egy könyvtár pókok.

Pókfájljaink i.e. az a szkript, amely elvégzi a weblapolást nekünk, a pókok Könyvtár.

Pókunk írása

Mielőtt elkezdenénk megírni a pókunkat, várhatóan már tudjuk, hogy melyik webhelyet akarjuk megkaparni. A cikk céljaira áttekintjük a weblapozó webhely mintáját: http: // example.webkaparás.com.

Ez a weboldal csak országneveket és zászlóikat tartalmaz, különböző oldalakkal, és három oldalt selejtezünk. A három oldal, amin dolgoznánk:

http: // példa.webkaparás.com / helyek / alapértelmezett / index / 0
http: // példa.webkaparás.com / helyek / alapértelmezett / index / 1
http: // példa.webkaparás.com / helyek / alapértelmezett / index / 2

Visszatérve a pókunkhoz, létrehozunk egy minta_pókot.py a pók könyvtárban. A terminálról egy egyszerű érintse meg a minta_pók elemet.py parancs segít új fájl létrehozásában.

A fájl létrehozása után feltöltjük a következő kódsorokkal:

import hulladék
 
osztály SampleSpider (selejt.Pók):
név = "minta"
start_urls = [
"http: // példa.webkaparás.com / places / default / index / 0 ",
"http: // példa.webkaparás.com / helyek / alapértelmezett / index / 1 ",
"http: // példa.webkaparás.com / helyek / alapértelmezett / index / 2 "
]
 
def parse (én, válasz):
page_number = válasz.url.felosztás ('/') [- 1]
file_name = "oldal .html ".formátum (oldalszám)
az open (fájlnév, 'wb') fájlként:
fájl.ír (válasz.test)

A projekt könyvtárának legfelső szintjén futtassa a következő parancsot:

selejtes csúszóminta

Emlékezzünk vissza, hogy mi adtuk meg a SampleSpider A osztály név tulajdonság minta.

A parancs futtatása után észreveheti, hogy három page0 nevű fájl található.html, 1. oldal.html, 2. oldal.A html fájlok a könyvtárba kerülnek.

Vessünk egy pillantást arra, hogy mi történik a kóddal:

import hulladék

Először a könyvtárat importáljuk a névtérünkbe.

osztály SampleSpider (selejt.Pók):
név = "minta"

Ezután létrehozunk egy pók osztályt, amelyet hívunk SampleSpider. Pókunk örököl érdes.Pók. Minden pókunknak meg kell örökölnie a selejtezést.Pók. Az osztály létrehozása után a pókunknak a név attribútum, ez név attribútummal hívják fel a pókot a terminálról. Ha emlékszel, mi futottunk a selejtes csúszóminta parancsot futtatni a kódunkat.

start_urls = [
 
"http: // példa.webkaparás.com / places / default / index / 0 ",
"http: // példa.webkaparás.com / helyek / alapértelmezett / index / 1 ",
"http: // példa.webkaparás.com / helyek / alapértelmezett / index / 2 "
]

Van egy listánk is azokról az URL-ekről, amelyeket a pók meglátogat. A listát meg kell hívni start_urls. Ha más nevet szeretne adni a listának, meg kell határoznunk a start_requests funkció, amely további képességeket ad nekünk. További információkért olvassa el a selejtezési dokumentációt.

Ettől függetlenül ne felejtse el megadni a http: // vagy a https: // linkeket a linkjeihez, különben hiányzó sémahibával kell megküzdenie.

def parse (én, válasz):

Ezután folytatjuk az elemzési függvény deklarálását és válaszparamétert adunk neki. A kód futtatásakor az elemzési függvény meghívásra kerül és elküldik a válaszobjektumot, amely tartalmazza a meglátogatott weboldal összes információját.

page_number = válasz.url.felosztás ('/') [- 1]
file_name = "oldal .html ".formátum (oldalszám)

Amit ezzel a kóddal tettünk, az az, hogy felosztottuk a címet tartalmazó karakterláncot, és az oldalszámot egyedül mentettük el az a-ba oldalszám változó. Ezután létrehozunk egy fájl név változó beillesztése a oldalszám a karakterláncban, amely a létrehozandó fájlok fájlneve lenne.

az open (fájlnév, 'wb') fájlként:
fájl.ír (válasz.test)

Most létrehoztuk a fájlt, és a weblap tartalmát a fájlba írjuk test attribútuma válasz tárgy.

Nem csak a weboldal mentésén túl tehetünk. A BeautifulSoup könyvtár segítségével elemezhető a test.válasz. Megtekintheti ezt a BeautiulSoup oktatóanyagot, ha nem ismeri a könyvtárat.

A selejtezendő oldalról itt van egy részlet a html-ből, amely a szükséges adatokat tartalmazza:

Észreveheti, hogy az összes szükséges adat div címkékbe van foglalva, ezért átírjuk a kódot a html elemzéséhez.
Íme az új szkriptünk:

import hulladék
a bs4-ből a BeautifulSoup importálása
 
osztály SampleSpider (selejt.Pók):
név = "minta"
 
start_urls = [
"http: // példa.webkaparás.com / places / default / index / 0 ",
"http: // példa.webkaparás.com / helyek / alapértelmezett / index / 1 ",
"http: // példa.webkaparás.com / places / default / index / 2 "
]
 
def parse (én, válasz):
page_number = válasz.url.felosztás ('/') [- 1]
file_name = "oldal .txt ".formátum (oldalszám)
az open (fájlnév, 'w') fájlként:
html_content = BeautifulSoup (válasz.törzs, "lxml")
div_tags = html_content.keresés ("div", "id": "results")
country_tags = div_tags.find_all ("div")
country_name_position = zip (tartomány (len (country_tags)), country_tags)
a pozícióhoz az országnév az országnév_pozícióban:
fájl.write ("országszám : \ n".formátum (pozíció + 1, ország_név.szöveg))

A kód nagyjából megegyezik az eredetivel, azonban felvettem a BeautifulSoup-ot a névtérünkbe, és megváltoztattam a logikát az elemzési függvényben.

Vessünk egy gyors pillantást a logikára.

def parse (én, válasz):

Itt definiáltuk az elemzési függvényt, és válaszparamétert adtunk neki.

page_number = válasz.url.felosztás ('/') [- 1]
file_name = "oldal .txt ".formátum (oldalszám)
az open (fájlnév, 'w') fájlként:

Ez ugyanazt csinálja, mint amit az intial kódban tárgyaltunk, az egyetlen különbség az, hogy szöveges fájllal dolgozunk html fájl helyett. A lemásolt adatokat a szöveges fájlba mentenénk, és nem a teljes webtartalmat html-be, mint korábban tettük.

html_content = BeautifulSoup (válasz.törzs, "lxml")

Amit ebben a kódsorban tettünk, az a válasz.test érvként a BeautifulSoup könyvtárhoz, és az eredményeket a html_content változó.

div_tags = html_content.keresés ("div", "id": "results")

A html tartalmat figyelembe véve itt elemezzük a keresésével div tag, amely szintén rendelkezik és id attribútum a eredmények mivel értéke, akkor el kell mentenünk a div_tags változó.

country_tags = div_tags.find_all ("div")

Ne feledje, hogy az országok léteztek div címkék is, most egyszerűen megszerezzük az összes div címkék és listaként mentse őket a country_tags változó.

country_name_position = zip (tartomány (len (country_tags)), country_tags)
 
a pozícióhoz az országnév az országnév_pozícióban:
fájl.write ("országszám : \ n".formátum (pozíció + 1, ország_név.szöveg))

Itt végigvezetjük az országok helyzetét az összes országcímke között, majd szöveges fájlba mentjük a tartalmat.

Tehát a szöveges fájljában valami ilyesmi lenne:

1. országszám: Afganisztán
2. országszám: Aland-szigetek
országszám 3: Albánia

Következtetés

A selejtezés kétségtelenül az egyik legerősebb könyvtár ott, nagyon gyors és alapvetően letölti a weboldalt. Ezután a webtartalommal szabadon megadhatja, amit csak kíván.

Meg kell jegyeznünk, hogy a Scrapy sokkal többet tehet, mint amit itt megnéztünk. Szükség szerint elemezheti az adatokat Scrapy CSS vagy Xpath választókkal. Elolvashatja a dokumentációt, ha valami összetettebb feladatot kell tennie.

Hogyan lehet játékot fejleszteni Linuxon
Egy évtizeddel ezelőtt nem sok Linux-felhasználó jósolta, hogy kedvenc operációs rendszerük egy napon a videojátékok népszerű játékplatformja lesz. El...
Kereskedelmi játékmotorok nyílt forráskódú portjai
Ingyenes, nyílt forráskódú és platformokon átívelő játékmotorok szabadidős programjai felhasználhatók a régi, valamint a meglehetősen friss játékcímek...
A legjobb parancssori játékok Linuxhoz
A parancssor nem csak a legnagyobb szövetséges a Linux használatakor, hanem a szórakozás forrása is lehet, mert sok olyan szórakoztató játék lejátszás...