Веб-скрапинг — это мощная техника, которая позволяет разработчикам автоматически извлекать данные с веб-сайтов. Он имеет множество вариантов использования, включая конкурентный анализ, интеллектуальный анализ данных и агрегацию контента. Django — это популярная веб-инфраструктура для создания веб-приложений, а Scrapy — мощная платформа для очистки веб-страниц. В этой статье мы рассмотрим, как объединить Django и Scrapy для создания парсеров, которые можно интегрировать в приложения Django.

Во-первых, давайте начнем с настройки нового проекта Django. Мы создадим новое приложение Django с именем «scrapers» и установим Scrapy в качестве зависимости. Вот как это сделать:

# create a new Django project
django-admin startproject myproject
# create a new Django app
python manage.py startapp scrapers
# install Scrapy
pip install scrapy

Далее мы создадим новый паук Scrapy, который будет очищать данные с веб-сайта. В этом примере мы будем собирать данные с веб-сайта Hacker News. Вот код нашего паука Scrapy:

import scrapy

class HackerNewsSpider(scrapy.Spider):
    name = "hacker_news"
    start_urls = [
        "https://news.ycombinator.com/"
    ]
    def parse(self, response):
        for article in response.css("tr.athing"):
            yield {
                "title": article.css("a.storylink::text").get(),
                "url": article.css("a.storylink::attr(href)").get(),
                "votes": int(article.css("span.score::text").re_first(r"\d+"))
            }
        next_page = response.css("a.morelink::attr(href)").get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

Этот паук будет извлекать заголовок, URL-адрес и количество голосов для каждой статьи на главной странице Hacker News. Он также перейдет по ссылке «Дополнительно» внизу страницы, чтобы очистить дополнительные страницы.

Теперь, когда у нас есть наш паук Scrapy, нам нужно интегрировать его в наше приложение Django. Мы создадим представление Django, которое запустит паука Scrapy и вернет очищенные данные. Вот код нашего представления Django:

from django.http import JsonResponse
from scrapy.crawler import CrawlerProcess
from scrapers.spiders.hacker_news_spider import HackerNewsSpider

def scrape_hacker_news(request):
    process = CrawlerProcess(settings={
        "FEEDS": {
            "items.json": {"format": "json"},
        },
    })
    process.crawl(HackerNewsSpider)
    process.start()
    with open("items.json", "r") as f:
        data = f.read()
    return JsonResponse(data, safe=False)

Это представление запустит паука Scrapy и сохранит очищенные данные в файл JSON. Затем он прочитает файл JSON и вернет данные в виде ответа JSON.

Наконец, мы создадим URL-маршрут Django, который будет отображаться в нашем новом представлении. Вот код для нашего URL-маршрута Django:

from django.urls import path
from .views import scrape_hacker_news

urlpatterns = [
    path("scrape-hacker-news/", scrape_hacker_news, name="scrape_hacker_news"),
]

Теперь мы можем перейти по URL-адресу «/scrape-hacker-news/» в нашем приложении Django, чтобы запустить паука Scrapy и вернуть очищенные данные в виде ответа JSON.

В заключение, объединение Django и Scrapy может стать мощным способом создания парсеров, которые можно интегрировать в приложения Django. Следуя шагам, описанным в этой статье, вы сможете легко создавать парсеры, которые извлекают данные с веб-сайтов и возвращают результаты в виде ответов JSON.