Легкий способ веб-парсинга с Django и Scrapy
Веб-парсинг - это мощная техника, которая позволяет разработчикам автоматически извлекать данные с веб-сайтов. У него есть множество применений, включая конкурентный анализ, добычу данных и агрегацию контента. Django - популярный веб-фреймворк для создания веб-приложений, а Scrapy - мощный фреймворк для веб-парсинга. В этой статье мы рассмотрим, как объединить Django и Scrapy для создания веб-парсеров, которые можно интегрировать в приложения Django.
Сначала давайте начнем с настройки нового проекта Django. Мы создадим новое приложение Django с именем "scrapers" и установим Scrapy в качестве зависимости. Вот как это сделать:
# создать новый проект Django
django-admin startproject myproject
# создать новое приложение Django
python manage.py startapp scrapers
# установить 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. Он также будет переходить по ссылке "More" внизу страницы для парсинга дополнительных страниц.
Теперь, когда у нас есть наш паук 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-ответов.