es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ejecuta el rastreador Scrapy desde la vista DRF.

Usé Scrapy en mi proyecto y quiero llamar a mi spider con una URL desde una vista de DRF (Django Rest Framework), ¿cuál es la mejor manera?

Una de las formas que utilicé es:

from uuid import uuid4
from django.core.cache import cache
from urllib.parse import urlparse
from django.core.validators import URLValidator
from django.core.exceptions import ValidationError
from django.views.decorators.http import require_POST, require_http_methods
from django.shortcuts import render
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from scrapyd_api import ScrapydAPI
from main.models import Quote
from scrapy_app.scrapy_app.items import QouteItem
import os
from iCrawler.settings import BASE_DIR

scrapyd = ScrapydAPI(‘http://localhost:6800’)

def is_valid_url(url):
validate = URLValidator()
try:
validate(url)
except ValidationError:
return False

return True

@csrf_exempt
@require_http_methods([‘POST’, ‘GET’])
def crawl(request):
if request.method == ‘POST’:

    url = request.POST.get('url', None) 

    if not url:
        return JsonResponse({'error': 'Missing  args'})

    if not is_valid_url(url):
        return JsonResponse({'error': 'URL is invalid'})

    domain = urlparse(url).netloc 
    unique_id = str(uuid4()) 


    settings = {
        'unique_id': unique_id,
        'USER_AGENT': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
    }


    task = scrapyd.schedule('default', 'icrawler',
                            settings=settings, url=url, domain=domain)

    return JsonResponse({'task_id': task, 'unique_id': unique_id, 'status': 'started'})

elif request.method == 'GET':

    task_id = request.GET.get('task_id', None)
    unique_id = request.GET.get('unique_id', None)

    if not task_id or not unique_id:
        return JsonResponse({'error': 'Missing args'})

    status = scrapyd.job_status('default', task_id)
    if status == 'finished':
        try:
            item = QouteItem.objects.get(unique_id=unique_id)
            return JsonResponse({'data': item.to_dict['data']})
        except Exception as e:
            return JsonResponse({'error': str(e)})
    else:
        return JsonResponse({'status': status})

@csrf_exempt
@require_http_methods([‘POST’, ‘GET’])
def spiding(request):
url = request.POST.get(‘url’)
cwd = os.path.join(BASE_DIR, “start_spider.py”)

    os.system('{} {}'.format('python3', cwd))
    try:
        os.environ.pop('start_url')
    except:
        pass
    os.environ['start_url'] = url 
    myVars = {}


    return JsonResponse({'ok': 'running spider'},status=200)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay diferentes formas de llamar a una araña en Scrapy con una URL desde una vista de DRF, pero una de las formas que se pueden utilizar es mediante la API de Scrapyd. En el fragmento de código anterior, se utiliza la API de Scrapyd para programar una ejecución de araña con una solicitud POST que toma una URL como parámetro. Luego, se valida la URL y se genera un ID único para la ejecución de araña utilizando el módulo uuid4. La araña se programa para ejecutarse en el proyecto Scrapy predeterminado con los valores y parámetros dados.

    Además, se incluye otra función de vista en el fragmento de código que inicia la ejecución de la araña con una solicitud POST a una URL diferente, que establece la URL de inicio para la ejecución de la araña como una variable de entorno antes de ejecutar el script de araña.

    Ambos métodos se pueden utilizar para llamar a una araña de Scrapy con una URL desde una vista de DRF, pero dependiendo de los requisitos y el caso de uso, también se pueden utilizar otros métodos como la subprocesamiento o herramientas de gestión de arañas externas.

Comments are closed.