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 ScrapyEllenőrizheti, hogy a telepítés sikeres volt-e, ha hulladékot importál a Python interaktív shelljébe.
$ pythonPython 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ásaMost, 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ékosztá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ómintaEmlé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ékElő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:
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án2. 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.