Jak používat Scrapy s aplikací Django

Existuje několik článků o tom, jak integrovat Scrapy do aplikace Django (nebo naopak?). Většina z nich však nepokrývá úplný úplný příklad, který zahrnuje spouštění pavouků z zobrazení Django. Protože se jedná o webovou aplikaci, musí to být náš hlavní cíl.

Co potřebujeme?

Než začneme, je lepší určit, co chceme a jak chceme. Zkontrolujte tento diagram:

Ukazuje, jak by naše aplikace měla fungovat:

  • Klient odešle požadavek s URL k jeho procházení. (1)
  • Django spustí Scrapy a spustí pavouka, který bude procházet tuto URL. (2)
  • Django vrací odpověď a sdělí klientovi, že procházení právě začalo. (3)
  • Scrapy dokončí procházení a uloží extrahovaná data do databáze. (4)
  • Django získá tato data z databáze a vrátí je klientovi. (5)

Zatím to vypadá skvěle a jednoduše.

Poznámka k tomuto 5. výroku

Django získá tato data z databáze a vrátí je klientovi. (5)

Django ani klient neví, kdy Scrapy dokončí procházení. Existuje metoda zpětného volání s názvem pipeline_closed, ale patří do projektu Scrapy. Od potrubí Scrapy nemůžeme vrátit odpověď. Tuto metodu používáme pouze k ukládání extrahovaných dat do databáze.

Nakonec, někde, musíme klientovi říct:

Ahoj! Procházení bylo dokončeno a já vám posílám procházená data zde.

Existují dva možné způsoby, jak toho dosáhnout (prosím, pokud zjistíte více):

Po dokončení procházení můžeme klienta informovat o webových soketech.

Nebo,

Můžeme začít odesílat žádosti každé 2 sekundy (více? Nebo méně?) Od klienta, abychom zkontrolovali stav procházení poté, co dostaneme odpověď „procházení zahájeno“.

Řešení Web Socket zní mnohem stabilněji a robustněji. Vyžaduje však druhou službu, která běží samostatně a znamená více konfigurace. Prozatím tuto možnost přeskočím. Ale pro své aplikace na úrovni výroby bych si vybral webové zásuvky.

Napíšeme nějaký kód

Je čas udělat nějakou skutečnou práci. Začněme přípravou našeho prostředí.

Instalace závislostí

Vytvořte virtuální prostředí a aktivujte jej:

$ python3.5 -m ven ven ven
$ source venv / bin / Activate

Poté nainstalujte požadované závislosti pomocí:

$ pip install django scrapy scrapyd python-scrapyd-api

Scrapyd je služba démona pro spouštění pavouků Scrapy. Podrobnosti najdete zde.

python-scrapyd-api je obal, který nám umožňuje mluvit scrapyd z našeho programu Python.

Poznámka: Budu používat Python 3.5 pro tento projekt.

Vytvoření projektu Django

Vytvořte projekt Django s aplikací s názvem main:

$ django-admin startproject iCrawler
$ cd iCrawler && python manage.py startapp main

Potřebujeme také model pro uložení našich seškrabaných dat. Nechme to jednoduché:

Přidejte hlavní aplikaci do INSTALLED_APPS v settings.py A jako poslední krok migrace:

$ python manage.py makemigrations
$ python manage.py migrovat

Přidejme pohled a URL do naší hlavní aplikace:

Pokusil jsem se dokument zdokumentovat co nejvíce.

Ale hlavní trik je, unique_id. Normálně ukládáme objekt do databáze a poté získáme jeho ID. V našem případě určíme jeho unique_id před vytvořením. Po dokončení procházení a klient požádá o prolezená data; můžeme vytvořit dotaz s tímto jedinečným ID a výsledky načtení.

A URL pro toto zobrazení:

Vytvoření projektu Scrapy

Je lepší, když vytvoříme projekt Scrapy v rámci (nebo vedle) našeho projektu Django. To usnadňuje jejich vzájemné propojení. Vytvořme jej tedy ve složce projektu Django:

$ cd iCrawler
$ scrapy startproject scrapy_app

Nyní musíme vytvořit našeho prvního pavouka z vnitřní složky scrapy_app:

$ cd scrapy_app
$ scrapy genspider -t crawl icrawler https://google.com

Jako pavouk jmenuji pavouka. Můžete to pojmenovat jako cokoli. Podívejte se na prolézanou část. Určíme základní šablonu pro našeho pavouka. Všechny dostupné šablony můžete zobrazit pomocí:

$ scrapy genspider -l
Dostupné šablony:
základní
plazit se
csvfeed
xmlfeed

Nyní bychom měli mít strukturu složek, jako je tato:

Připojení Scrapy k Djangu

Abychom měli přístup k modelům Django ze Scrapy, musíme je propojit. Přejděte do souboru settings.py pod scrapy_app / scrapy_app / a vložte:

A je to. Nyní začneme scrapyd, abychom se ujistili, že je vše správně nainstalováno a nakonfigurováno. Uvnitř scrapy_app / spuštění složky:

$ scrapyd

Tím se spustí scrapyd a vygenerují se některé výstupy. Scrapyd má také velmi minimální a jednoduchou webovou konzoli. Nepotřebujeme ji na výrobu, ale můžeme ji použít k sledování aktivních pracovních míst při vývoji. Jakmile spustíte program scrapyd, přejděte na adresu http://127.0.0.1:6800 a podívejte se, zda funguje.

Konfigurace našeho projektu Scrapy

Vzhledem k tomu, že tento příspěvek není o základech scrapy, přeskočím část o úpravě pavouků. Můžete si vytvořit pavouka s oficiální dokumentací. Zde však uvedu svůj příklad pavouka:

Nahoře je soubor icrawler.py od scrapy_app / scrapy_app / pavouků. Pozor na metodu __init__. To je důležité. Pokud chceme, aby byla metoda nebo vlastnost dynamická, musíme ji definovat pod metodou __init__, abychom mohli předat argumenty od Djanga a použít je zde.

Musíme také vytvořit položku Pipeline pro náš scrapy projekt. Potrubí je třída pro provádění akcí na poškrábaných položkách. Z dokumentace:

Typické použití potrubí potrubí je:
  • čištění HTML dat
  • ověření dat seškrábaných (kontrola, zda položky obsahují určitá pole)
  • kontrola duplikátů (a jejich vyřazení)
  • uložení poškrábané položky do databáze

Yay! Uložení poškrábané položky do databáze. Nyní vytvořme jeden. Ve složce scrapy_project je již soubor s názvem pipelines.py. A tento soubor také obsahuje prázdný, ale připravený plynovod. Potřebujeme to trochu upravit:

A jako poslední krok musíme povolit (zrušit) toto potrubí v souboru scrapy settings.py:

# Konfigurovat potrubí potrubí
# Viz http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
    'scrapy_app.pipelines.ScrapyAppPipeline': 300,
}
Nezapomeňte restartovat scraypd, pokud to funguje.

Tento šikovný projekt v podstatě

  • Prochází web (pochází ze zobrazení Django)
  • Extrahujte všechny adresy URL z webu
  • Vložte je do seznamu
  • Seznam uložte do databáze prostřednictvím modelů Django.

A to vše pro zadní část. Django a Scrapy jsou integrovány a měly by fungovat dobře.

Poznámky k části front-end

Tato část je tak subjektivní. Máme spoustu možností. Osobně jsem si vytvořil svůj front-end s Reactem. Jedinou částí, která není subjektivní, je použití setInterval. Ano, nezapomeňte na naše možnosti: webové zásuvky a odesílat požadavky na server každých X sekund.

Pro objasnění základní logiky je to zjednodušená verze mé složky React:

Podrobnosti můžete zjistit pomocí komentářů, které jsem přidal. Ve skutečnosti je to docela jednoduché.

Oh, to je vše. Trvalo to déle, než jsem čekal. Zanechte prosím komentář pro jakoukoli zpětnou vazbu.

Ukázkové projekty

Níže naleznete několik příkladů implementací založených na tomto článku. Pokud ji máte, uveďte ji jako komentář. Budu pokračovat v aktualizaci této sekce.

Toto je pěkná šablona aplikace od Adrian Castellanos Zaragoza:

-

To od 심명훈 a zahrnuje také frontendovou část s prostým Javascriptem. Koukni na tohle!

-