Django-Scrapy生成后端json接口的方法示例

  

Django-Scrapy生成后端json接口的方法示例

简介

Django-Scrapy是一个Python社区开发的用于将Scrapy爬虫数据转换为JSON格式并通过Django框架提供后端数据接口的应用程序。Scrapy是一个快速、高效的Web爬虫框架,而Django是一个强大的Web应用程序框架。将这两个框架结合使用可以帮助我们快速地搭建可靠性高、性能优越的Web爬虫和数据接口服务。

安装

首先需要确保已经安装好了Django和Scrapy。在此基础上,执行以下命令安装Django-Scrapy:

pip install django-scrapy

接下来,在你的Django项目的settings.py文件中添加django_scrapy应用程序:

INSTALLED_APPS = [
    # ...
    'django_scrapy',
    # ...
]

配置

首先需要在Scrapy项目的settings.py文件中添加Django-Scrapy的配置项:

DJANGO_SCRAPE_ITEMS = {
    'default': {
        'URL': 'http://localhost:8000/api/scrape',
        'METHOD': 'POST',
    }
}

其中URLMETHOD需要根据实际情况进行修改。在URL中填写的是Django项目提供数据接口的URL,METHOD是请求的方法,常见的有POST和GET。

接下来需要在Django项目中创建一个数据模型,并将其注册到Django-Scrapy中。假设我们创建了一个Students模型来存储学生信息,数据表中包括字段nameage

# 在Django项目的models.py中定义数据模型
from django.db import models

class Student(models.Model):
    name = models.CharField(max_length=50)
    age = models.IntegerField()

然后需要在Django-Scrapy的配置文件settings.py中设置该数据模型对应的Scrapy Item 类。

DJANGO_SCRAPE_ITEMS = {
    'default': {
        'URL': 'http://localhost:8000/api/scrape',
        'METHOD': 'POST',
        'ITEM': 'myapp.models.Student',  # 设置Item对应的Model
    }
}

使用

在Scrapy项目的爬虫代码中,对数据进行处理和抓取后,需要将数据生成为Scrapy Item,并通过Django-Scrapy提供的数据接口传输到Django项目中。

# 在Scrapy项目的spider中生成Item并通过Django-Scrapy的数据接口发送到Django项目
import scrapy
from django_scrapy import DjangoItem

class StudentItem(DjangoItem):
    django_model = Student

class MySpider(scrapy.Spider):
    name = 'myspider'
    allowed_domains = ['example.com']
    start_urls = ['http://example.com/']

    def parse(self, response):
        # 抓取数据并处理
        student = {}
        student['name'] = 'Alice'
        student['age'] = 18

        # 将数据生成为Item并发送到Django项目中
        item = StudentItem(student)
        yield item

在上面的代码中,我们将原始的student字典转换为了Scrapy Item,然后将其通过Django-Scrapy提供的数据接口发送到了Django项目中。

示例

假设我们的Django项目名为myproject,数据模型为Student,数据接口为/api/scrape:

# 在Django项目的views.py中定义数据接口
from django.http import JsonResponse
from myapp.models import Student

def scrape(request):
    if request.method == 'POST':
        # 从请求中获取数据并存储到数据库中
        data = request.POST
        student = Student(name=data['name'], age=data['age'])
        student.save()
        return JsonResponse({'status': 'ok'})
    else:
        return JsonResponse({'status': 'error'})

现在,我们在Scrapy项目中生成了student信息,并将其通过Django-Scrapy提供的数据接口发送到Django项目中。经过Django的处理后,我们可以通过浏览器访问/myproject/students/,获取到刚才保存的学生信息。

# 在Django项目中的urls.py中定义路由
from django.urls import path
from myapp.views import StudentListView

urlpatterns = [
    path('students/', StudentListView.as_view(), name='student-list'),
]
# 在Django项目的views.py中定义URL对应的视图函数
from django.shortcuts import render
from django.views.generic import ListView
from myapp.models import Student

class StudentListView(ListView):
    queryset = Student.objects.all()
    template_name = 'myapp/student_list.html'

templates/myapp/student_list.html文件中,我们可以按照Django的模板语言输出学生信息。

{% extends 'base.html' %}

{% block content %}
  <table>
    <thead>
      <tr>
        <th>Name</th>
        <th>Age</th>
      </tr>
    </thead>
    <tbody>
      {% for student in object_list %}
      <tr>
        <td>{{ student.name }}</td>
        <td>{{ student.age }}</td>
      </tr>
      {% endfor %}
    </tbody>
  </table>
{% endblock %}

这样,我们就完成了将Scrapy爬虫数据转换为JSON格式并通过Django框架提供后端数据接口的过程。

相关文章