Proč Scrapy?
Scrapy je robustní knihovna pro škrábání webů, která poskytuje možnost stahovat webové stránky, obrázky a všechna data, na která si vzpomenete, rychlostí blesku. Rychlost má při výpočtu velký význam a Scrapy na tom pracuje tak, že navštěvuje webové stránky asynchronně a dělá spoustu práce na pozadí, takže celý úkol vypadá snadno.
Je třeba říci, že Python má další knihovny, které lze použít ke škrábání dat z webových stránek, ale žádná z nich není srovnatelná se Scrapy, pokud jde o efektivitu.
Instalace
Pojďme se rychle podívat, jak lze tuto výkonnou knihovnu nainstalovat do vašeho počítače.
Stejně jako u většiny knihoven Pythonu můžete Scrapy nainstalovat pomocí pip modulu:
pip nainstalujte ScrapyMůžete zkontrolovat, zda instalace proběhla úspěšně, importováním scrapy do interaktivního prostředí Pythonu.
$ pythonPython 3.5.2 (výchozí, 14. září 2017, 22:51:06)
[GCC 5.4.0 20160609] na Linuxu
Další informace získáte zadáním „help“, „copyright“, „credit“ nebo „license“.
>>> import scrapyTeď, když jsme s instalací hotovi, pojďme do toho.
Vytvoření projektu škrábání webu
Během instalace bylo do cesty přidáno klíčové slovo scrapy, abychom mohli klíčové slovo použít přímo z příkazového řádku. To bychom využívali během našeho používání knihovny.
Z adresáře podle vašeho výběru spusťte následující příkaz:
scrapy startproject webscraperTím by se vytvořil adresář s názvem webový škrabák v aktuálním adresáři a scrapy.soubor CFG. V webový škrabák adresář by měl __init__.py, položky.py, střední zboží.py, potrubí.py, nastavení.py soubory a adresář s názvem pavouci.
Naše pavoučí soubory i.E. skript, který pro nás dělá webový scraping, by byl uložen v pavouci adresář.
Psaní našeho pavouka
Než se pustíme do psaní našeho pavouka, očekává se, že už víme, jaký web chceme seškrábat. Pro účely tohoto článku škrábáme ukázkový web pro vytváření webů: http: // příklad.webcraping.com.
Tento web má pouze názvy zemí a jejich vlajky, s různými stránkami a my sešrotujeme tři stránky. Tři stránky, na kterých bychom pracovali, jsou:
http: // příklad.webcraping.com / places / default / index / 0
http: // příklad.webcraping.com / places / default / index / 1
http: // příklad.webcraping.com / places / default / index / 2
Zpět k našemu pavoukovi vytvoříme sample_spider.py v adresáři pavouků. Z terminálu jednoduché klepněte na sample_spider.py příkaz by pomohl vytvořit nový soubor.
Po vytvoření souboru bychom jej naplnili následujícími řádky kódu:
importovat scrapytřída SampleSpider (scrapy.Pavouk):
name = "sample"
start_urls = [
"http: // příklad.webcraping.com / places / default / index / 0 ",
"http: // příklad.webcraping.com / places / default / index / 1 ",
"http: // příklad.webcraping.com / places / default / index / 2 "
]
def parse (self, response):
page_number = response.url.split ('/') [- 1]
file_name = "stránka .html ".formát (číslo_stránky)
s otevřeným (název_souboru, 'wb') jako soubor:
soubor.zápis (odpověď.tělo)
Na nejvyšší úrovni adresáře projektu spusťte následující příkaz:
scrapy crawl samplePřipomeňme, že jsme dali naše SampleSpider třída a název atribut vzorek.
Po spuštění tohoto příkazu byste si všimli, že tři soubory s názvem page0.html, stránka1.html, stránka2.html jsou uloženy do adresáře.
Pojďme se podívat na to, co se stane s kódem:
importovat scrapyNejprve importujeme knihovnu do našeho jmenného prostoru.
třída SampleSpider (scrapy.Pavouk):name = "sample"
Potom vytvoříme třídu pavouků, které nazýváme SampleSpider. Náš pavouk dědí z škrábání.Pavouk. Všichni naši pavouci musí zdědit po škrábání.Pavouk. Po vytvoření třídy dáme našemu pavoukovi a název atribut, toto název atribut se používá k vyvolání pavouka z terminálu. Pokud si vzpomínáte, spustili jsme scrapy crawl sample příkaz ke spuštění našeho kódu.
start_urls = ["http: // příklad.webcraping.com / places / default / index / 0 ",
"http: // příklad.webcraping.com / places / default / index / 1 ",
"http: // příklad.webcraping.com / places / default / index / 2 "
]
Máme také seznam adres URL, které má pavouk navštívit. Seznam musí být vyvolán start_urls. Pokud chcete seznamu dát jiný název, museli bychom definovat a start_requests funkce, která nám dává další možnosti. Chcete-li se dozvědět více, můžete si prohlédnout scrapy dokumentaci.
Bez ohledu na to nezapomeňte uvést http: // nebo https: // pro vaše odkazy, jinak byste se museli vypořádat s chybějící chybou schématu.
def parse (self, response):Poté pokračujeme v deklaraci funkce syntaktické analýzy a zadání parametru odpovědi. Po spuštění kódu se vyvolá funkce analýzy a odešle se objekt odpovědi, který obsahuje všechny informace o navštívené webové stránce.
page_number = response.url.split ('/') [- 1]file_name = "stránka .html ".formát (číslo_stránky)
To, co jsme s tímto kódem udělali, je rozdělit řetězec obsahující adresu a uložit číslo stránky samostatně do a číslo stránky proměnná. Pak vytvoříme a název souboru proměnná vložení číslo stránky v řetězci, který by byl názvem souborů, které vytváříme.
s otevřeným (název_souboru, 'wb') jako soubor:soubor.zápis (odpověď.tělo)
Nyní jsme soubor vytvořili a obsah webové stránky zapisujeme do souboru pomocí tělo atribut Odezva objekt.
Můžeme udělat víc než jen uložit webovou stránku. Knihovnu BeautifulSoup lze použít k analýze souboru tělo.Odezva. Pokud nejste obeznámeni s knihovnou, můžete si prohlédnout tento tutoriál BeautiulSoup.
Ze stránky, která má být vyřazena, je výňatek z html obsahující data, která potřebujeme:
Všimli jste si, že všechna potřebná data jsou uzavřena ve značkách div, takže přepíšeme kód, abychom analyzovali html.
Tady je náš nový skript:
z importu bs4 BeautifulSoup
třída SampleSpider (scrapy.Pavouk):
name = "sample"
start_urls = [
"http: // příklad.webcraping.com / places / default / index / 0 ",
"http: // příklad.webcraping.com / places / default / index / 1 ",
"http: // příklad.webcraping.com / places / default / index / 2 "
]
def parse (self, response):
page_number = response.url.split ('/') [- 1]
file_name = "stránka .txt ".formát (číslo_stránky)
s otevřeným (název_souboru, 'w') jako soubor:
html_content = BeautifulSoup (odpověď.body, "lxml")
div_tags = html_content.find ("div", "id": "results")
country_tags = div_tags.find_all ("div")
country_name_position = zip (range (len (country_tags)), country_tags)
pro pozici, country_name v country_name_position:
soubor.write ("číslo země : \ n".formát (pozice + 1, country_name.text))
Kód je do značné míry stejný jako ten původní, ale do našeho jmenného prostoru jsem přidal BeautifulSoup a změnil jsem logiku ve funkci analýzy.
Pojďme se rychle podívat na logiku.
def parse (self, response):Zde jsme definovali funkci analýzy a dali jí parametr odpovědi.
page_number = response.url.split ('/') [- 1]file_name = "stránka .txt ".formát (číslo_stránky)
s otevřeným (název_souboru, 'w') jako soubor:
To dělá to samé, co je popsáno v úvodním kódu, jediný rozdíl je v tom, že pracujeme s textovým souborem místo s html souborem. Uložili bychom načtená data do textového souboru, a ne celý webový obsah do html, jak bylo provedeno dříve.
html_content = BeautifulSoup (odpověď.body, "lxml")To, co jsme v tomto řádku kódu udělali, je zaslat Odezva.tělo jako argument do knihovny BeautifulSoup a výsledky přiřadil html_content proměnná.
div_tags = html_content.find ("div", "id": "results")Vezmeme-li obsah html, analyzujeme jej zde hledáním a div značka, která má také a id atribut s Výsledek protože je to hodnota, pak ji můžeme uložit do a div_tags proměnná.
country_tags = div_tags.find_all ("div")Pamatujte, že země existovaly v div tagy také, nyní jednoduše dostáváme všechny div značky a uložit je jako seznam do složky country_tags proměnná.
country_name_position = zip (range (len (country_tags)), country_tags)pro pozici, country_name v country_name_position:
soubor.write ("číslo země : \ n".formát (pozice + 1, country_name.text))
Zde iterujeme pozicí zemí mezi všemi značkami zemí a poté ukládáme obsah do textového souboru.
Takže ve svém textovém souboru byste měli něco jako:
země číslo 1: Afghánistánzemě číslo 2: Alandské ostrovy
země číslo 3: Albánie
…
Závěr
Scrapy je bezpochyby jedna z nejsilnějších knihoven, je velmi rychlá a v podstatě stahuje webovou stránku. Pak vám dává svobodu v tom, co si s webovým obsahem přejete.
Měli bychom si uvědomit, že Scrapy dokáže mnohem víc, než jsme se zde odhlásili. Pokud chcete, můžete data analyzovat pomocí selektorů Scrapy CSS nebo Xpath. Pokud potřebujete udělat něco složitějšího, můžete si přečíst dokumentaci.