Как да използвате Scrap with Django Application

Има няколко статии как да интегрирате Scrap в приложение на Django (или обратно?). Но повечето от тях не покриват пълен пълен пример, който включва задействащи паяци от изгледите на Джанго. Тъй като това е уеб приложение, това трябва да бъде основната ни цел.

Какво ни трябва?

Преди да започнем, по-добре е да уточним какво искаме и как го искаме. Вижте тази диаграма:

Той показва как трябва да работи нашето приложение:

  • Клиентът изпраща заявка с URL адрес, за да го обходи. (1)
  • Django задейства Scrap, за да пусне паяк, който да обхожда този URL адрес. (2)
  • Django връща отговор, за да каже на клиента, че обхождането току-що е започнало. (3)
  • Scrap завършва обхождането и запазва извлечените данни в база данни. (4)
  • Django извлича тези данни от базата данни и ги връща на клиента. (5)

Изглежда страхотно и просто досега.

Бележка към това пето изявление

Django извлича тези данни от базата данни и ги връща на клиента. (5)

Нито Джанго, нито клиентът не знаят кога Скрапията завършва обхождането. Има метод за обратно извикване, наречен pipeline_closed, но той принадлежи към проекта Scrap. Не можем да върнем отговор от тръбопроводи Scrap. Използваме този метод само за да запаметяваме извлечени данни в база данни.

Е, в крайна сметка някъде трябва да кажем на клиента:

Хей! Обхождането завърши и аз ви изпращам обходени данни тук.

Има два възможни начина за това (Моля, коментирайте, ако откриете повече):

Можем да използваме уеб сокети, за да информираме клиента при завършване на обхождането.

Или,

Можем да започнем да изпращаме заявки на всеки 2 секунди (повече? Или по-малко?) От клиента, за да проверим състоянието на обхождането, след като получим отговора „стартиране на обхождането“.

Решението за уеб сокет звучи по-стабилно и стабилно. Но тя изисква втора услуга, която работи отделно и означава повече конфигурация. Засега ще пропусна тази опция. Но бих избрал уеб гнезда за моите приложения на ниво производство.

Да напишем някакъв код

Време е да свършите някаква истинска работа. Да започнем с подготовката на нашата среда.

Инсталиране на зависимости

Създайте виртуална среда и я активирайте:

$ python3.5 -m venv venv
$ source venv / bin / activate

След това инсталирайте необходимите зависимости с:

$ pip инсталиране на django scrapy scrapyd python-scrapyd-api

Scrapyd е демонска услуга за пускане на Scrap паяци. Можете да откриете подробностите му от тук.

python-scrapyd-api е обвивка, която ни позволява да говорим scrapd от нашата програма Python.

Забележка: Ще използвам Python 3.5 за този проект.

Създаване на проект на Django

Създайте проект на Django с приложение, наречено основно:

$ django-admin startproject iCrawler
$ cd iCrawler && python management.py maintapp main

Нуждаем се и от модел, за да запишем нашите изтрити данни. Нека да го опростим:

Добавете основно приложение в INSTALLED_APPS в settings.py И като последна стъпка, миграции:

$ python Manag.py makemigrations
$ python Manag.py мигрира

Нека добавим изглед и URL адрес към основното ни приложение:

Опитах се да документирам кода, доколкото мога.

Но основният трик е, unique_id. Обикновено записваме обект в базата данни, след което получаваме неговия идентификатор. В нашия случай ние уточняваме уникалния му_ид преди да го създадем. След като приключи обхождането и клиентът поиска обходените данни; можем да създадем заявка с този уникален_ид и извличане на резултати.

И URL адрес за този изглед:

Създаване на проекта за скрап

По-добре е, ако създадем проекта Scrap по (или до) нашия проект Django. Това улеснява свързването им. Затова нека го създадем в папката на проекта Django:

$ cd iCrawler
$ scrapy startproject scrapy_app

Сега трябва да създадем първия си паяк от папката scrapy_app:

$ cd scrapy_app
$ scrapy genspider -t обхожда icrawler https://google.com

Аз наричам паяка като икраулер. Можете да го наречете като всичко. Вижте - не част за обхождане. Ние определяме основен шаблон за нашия паяк. Можете да видите всички налични шаблони с:

$ scrapy genspider -l
Налични шаблони:
основен
кроул
csvfeed
xmlfeed

Сега трябва да имаме структура на папките така:

Свързване на Scrap с Django

За да имаме достъп до моделите на Django от Scrapy, трябва да ги свържем заедно. Отидете на settings.py файла под scrapy_app / scrapy_app / и поставете:

Това е. Сега нека започнем scrapd, за да се уверим, че всичко е инсталирано и конфигурирано правилно. Вътре в scrap_app / папка работи:

$ scrapd

Това ще започне scrapd и ще генерира някои резултати. Scrapyd също има много минимална и проста уеб конзола. Не ни е нужен в производството, но можем да го използваме, за да наблюдаваме активни работни места, докато се развиваме. След като стартирате scrapd, отидете на http://127.0.0.1:6800 и вижте дали работи.

Конфигуриране на нашия проект за скрап

Тъй като тази публикация не е за основите на скрепията, ще пропусна частта за модифицирането на паяци. Можете да създадете своя паяк с официална документация. Ще дам тук моя пример за паяк:

По-горе е icrawler.py файл от scrapy_app / scrapy_app / spiders. Внимание към метода __init__ Важно е. Ако искаме да направим метод или свойство динамичен, трябва да го дефинираме под метод __init__, така че да можем да предаваме аргументи от Django и да ги използваме тук.

Трябва също така да създадем тръбопровод за артикули за нашия проект за скрап. Тръбопроводът е клас за извършване на действия върху надраскани елементи. От документацията:

Типичните приложения на тръбопроводите за артикули са:
  • почистване на HTML данни
  • валидиране на надраскани данни (проверка дали елементите съдържат определени полета)
  • проверка за дубликати (и пускането им)
  • съхраняване на изстъргания елемент в база данни

Супер! Съхраняване на изстъргания елемент в база данни. Сега нека създадем такъв. Всъщност вече има файл с име pipelines.py вътре в папката scrapy_project. И също така този файл съдържа празен, но готов готов тръбопровод. Просто трябва да го модифицираме малко:

И като последна стъпка, ние трябва да активираме (коментираме) този тръбопровод в scrap settings.py файл:

# Конфигуриране на тръбопроводи за елементи
# Вижте http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
    'scrapy_app.pipelines.ScrapyAppPipeline': 300,
}
Не забравяйте да рестартирате scraypd, ако работи.

Този скрап проект основно

  • Обхожда уебсайт (идва от изгледа на Django)
  • Извадете всички URL адреси от уебсайта
  • Поставете ги в списък
  • Запазете списъка в базата данни за модели на Django.

И това е всичко за задния край. Django и Scrapy са интегрирани и трябва да работят добре.

Бележки за предна част

Е, тази част е толкова субективна. Имаме много опции. Лично аз изградих своя преден край с React. Единствената част, която не е субективна, е използването на setInterval. Да, нека си припомним нашите възможности: уеб сокети и да изпращаме заявки до сървъра на всеки X секунди.

За да изясним основната логика, това е опростена версия на моя реактивен компонент:

Можете да откриете детайлите чрез коментари, които добавих. Всъщност е съвсем просто.

О, това е всичко Това отне повече време, отколкото очаквах. Моля, оставете коментар за всякакъв вид отзиви.

Примерни проекти

По-долу можете да намерите примерни реализации въз основа на тази статия. Ако имате такъв, моля, споменете го като коментар. Ще продължа да актуализирам този раздел.

Това е хубаво приложение за шаблон от Адриан Кастеланос Сарагоса:

-

Това е от 심명훈 и също включва фронтална част с обикновен Javascript. Виж това!

-