Clase 50: No se preocupe por la implementación de Scrapy, el principio y el uso de Scrapyd

En la última lección, la implementación de nuestro rastreador distribuido se completó y se puede ejecutar correctamente, pero hay un vínculo muy engorroso, es decir, la implementación de código.

Imaginamos los siguientes escenarios:

  • Si el código se implementa cargando archivos, primero debemos comprimir el código, luego cargar los archivos al servidor mediante SFTP o FTP, y luego conectarnos al servidor para descomprimir los archivos.Cada servidor debe configurarse así.

  • Si usamos la sincronización de Git para implementar el código, primero podemos enviar el código a un repositorio de Git y luego conectarnos a cada host de forma remota para realizar la operación de extracción, y para sincronizar el código, cada servidor también necesita realizar una operación.

Si el código se actualiza repentinamente, entonces debemos actualizar cada servidor, y si la versión de qué host no está bien controlada, también puede afectar el estado general de rastreo distribuido.

Entonces necesitamos una herramienta más conveniente para implementar el proyecto Scrapy, si podemos guardar la operación de iniciar sesión en el servidor una por una, será mucho más conveniente.

En esta sección, veremos Scrapyd, una herramienta que proporciona implementación distribuida.

1. Comprender Scrapyd

A continuación, echemos un vistazo más de cerca a Scrapyd. Scrapyd es un programa de servicio que ejecuta rastreadores Scrapy. Proporciona una serie de interfaces HTTP para ayudarnos a implementar, iniciar, detener y eliminar rastreadores. Scrapyd admite la administración de versiones y también puede administrar múltiples tareas del rastreador. Con él, podemos completar fácilmente la programación de tareas de implementación del proyecto del rastreador Scrapy.

Listo para trabajar

Primero, necesitamos instalar scrapyd. Generalmente, el servidor que implementamos es Linux, entonces aquí tomamos Linux como ejemplo.

Aquí se recomienda utilizar la instalación de pip, el comando es el siguiente:

pip3 install scrapyd 

Además de la preparación de nuestros proyectos se pueden ejecutar con éxito, es necesario instalar el proyecto en sí depende del entorno, como un proyecto a confiar en Scrapy, Scrapy-Redis, Gerapy-Pyppeteery otras bibliotecas, también necesita ser instalado en el servidor, de lo contrario habrá problemas de las implementaciones fallidas.
Después de la instalación, debe crear un nuevo archivo de configuración /etc/scrapyd/scrapyd.conf. Scrapyd leerá este archivo de configuración cuando se esté ejecutando.

Después de la versión de Scrapyd 1.2, este archivo no se creará automáticamente, debemos agregarlo nosotros mismos. Primero, ejecute el siguiente comando para crear un nuevo archivo:

sudo mkdir /etc/scrapyd   
sudo vi /etc/scrapyd/scrapyd.conf 

Luego escribe lo siguiente:

[scrapyd]   
eggs_dir    = eggs   
logs_dir    = logs   
items_dir   =   
jobs_to_keep = 5   
dbs_dir     = dbs   
max_proc    = 0   
max_proc_per_cpu = 10   
finished_to_keep = 100   
poll_interval = 5.0   
bind_address = 0.0.0.0   
http_port   = 6800   
debug       = off   
runner      = scrapyd.runner   
application = scrapyd.app.application   
launcher    = scrapyd.launcher.Launcher   
webroot     = scrapyd.website.Root   
​ 
[services]   
schedule.json     = scrapyd.webservice.Schedule   
cancel.json       = scrapyd.webservice.Cancel   
addversion.json   = scrapyd.webservice.AddVersion   
listprojects.json = scrapyd.webservice.ListProjects   
listversions.json = scrapyd.webservice.ListVersions   
listspiders.json  = scrapyd.webservice.ListSpiders   
delproject.json   = scrapyd.webservice.DeleteProject   
delversion.json   = scrapyd.webservice.DeleteVersion   
listjobs.json     = scrapyd.webservice.ListJobs   
daemonstatus.json = scrapyd.webservice.DaemonStatus 

El contenido del archivo de configuración se puede encontrar en el documento oficial https://scrapyd.readthedocs.io/en/stable/config.html#example-configuration-file . Aquí se han modificado los archivos de configuración. Uno de ellos es max_proc_per_cpu. El valor predeterminado oficial es 4, es decir, un host puede ejecutar hasta 4 tareas Scrapy por CPU, que se incrementa a 10. El otro es bind_address, que por defecto es local 127.0.0.1, que se modifica aquí a 0.0.0.0 para que la red externa sea accesible.

Scrapyd es un proyecto de Python puro, puede llamarlo directamente para que se ejecute aquí. Para mantener el programa ejecutándose en segundo plano, Linux y Mac pueden usar los siguientes comandos:

(scrapyd > /dev/null &) 

De esta manera, Scrapyd puede continuar ejecutándose en segundo plano y la salida de la consola se ignora directamente. Por supuesto, si desea registrar el registro de salida, puede modificar el destino de salida de la siguiente manera:

(scrapyd> ~/scrapyd.log &) 

En este momento, los resultados de ejecución de Scrapyd se enviarán al archivo ~ / scrapyd.log. Por supuesto, también puede utilizar screen, tmux, supervisor y otras herramientas para implementar la protección de procesos.

Después de instalar y ejecutar Scrapyd, podemos visitar el puerto 6800 del servidor para ver una página de WebUI. Por ejemplo, la dirección de mi servidor es 120.27.34.25. Después de instalar Scrapyd en él y ejecutarlo correctamente, puedo abrirlo en el navegador local. : http://120.27.34.25:6800, Puede ver la página de inicio de Scrapyd, aquí reemplácela con la dirección de su servidor para ver, como se muestra en la figura:
Inserte la descripción de la imagen aquí
Si puede acceder con éxito a esta página, entonces demuestra que no hay ningún problema con la configuración de Scrapyd.

2. Características de Scrapyd

Scrapyd proporciona una serie de interfaces HTTP para implementar diversas operaciones, aquí podemos ordenar las funciones de la interfaz y tomar la IP 120.27.34.25 de Scrapyd como ejemplo para explicar.

2.1 daemonstatus.json

Esta interfaz es responsable de ver el estado actual de los servicios y tareas de Scrapyd. Podemos usar el comando curl para solicitar esta interfaz. El comando es el siguiente:

curl http://139.217.26.30:6800/daemonstatus.json 

Entonces obtendremos el siguiente resultado:

{
    
    "status": "ok", "finished": 90, "running": 9, "node_name": "datacrawl-vm", "pending": 0} 

El resultado devuelto es una cadena Json, el estado es el estado actual en ejecución, terminado representa la tarea Scrapy completada actualmente, en ejecución representa la tarea Scrapy en ejecución, pendiente representa la tarea Scrapyd esperando ser programada, node_name es el nombre del host.

2.2 addversion.json

Esta interfaz se utiliza principalmente para implementar el proyecto Scrapy. Cuando lo implementamos, primero debemos empaquetar el proyecto en un archivo Egg y luego pasar el nombre del proyecto y la versión de implementación.

Podemos implementar el despliegue de proyectos de las siguientes formas:

curl http://120.27.34.25:6800/addversion.json -F project=wenbo -F version=first -F egg=@weibo.egg 

Aquí -F significa agregar un parámetro, y también necesitamos empaquetar el proyecto en un archivo Egg y colocarlo localmente.
Después de realizar la solicitud de esta manera, podemos obtener los siguientes resultados:

{
    
    "status": "ok", "spiders": 3} 

Este resultado indica que la implementación fue exitosa y la cantidad de arañas que contenía fue de 3. Este método puede ser complicado de implementar, más adelante presentaré herramientas más convenientes para implementar la implementación del proyecto.

2.3 horario.json

Esta interfaz es responsable de programar la ejecución del proyecto Scrapy implementado. Podemos implementar la programación de tareas a través de las siguientes interfaces:

curl http://120.27.34.25:6800/schedule.json -d project=weibo -d spider=weibocn 

Se deben pasar dos parámetros aquí, proyecto es el nombre del proyecto Scrapy, araña es el nombre de la araña. Los resultados devueltos son los siguientes:

{
    
    "status": "ok", "jobid": "6487ec79947edab326d6db28a2d86511e8247444"} 

status representa el estado de inicio del proyecto Scrapy y jobid representa el código de la tarea de rastreo actualmente en ejecución.

2.4 cancelar.json

Esta interfaz se puede utilizar para cancelar una tarea de rastreo. Si la tarea está pendiente, se eliminará. Si la tarea está en ejecución, se terminará.

Podemos usar el siguiente comando para cancelar la ejecución de la tarea:

curl http://120.27.34.25:6800/cancel.json -d project=weibo -d job=6487ec79947edab326d6db28a2d86511e8247444 

Se deben pasar dos parámetros aquí, proyecto es el nombre del proyecto, trabajo es el código de la tarea de rastreo. Los resultados devueltos son los siguientes:

{
    
    "status": "ok", "prevstate": "running"} 

status representa la ejecución de la solicitud y prevstate representa el estado de ejecución anterior.

2.5 listprojects.json

Esta interfaz se utiliza para enumerar todas las descripciones de proyectos implementadas en el servicio Scrapyd. Podemos usar el siguiente comando para obtener todas las descripciones del proyecto en el servidor Scrapyd:

curl http://120.27.34.25:6800/listprojects.json 

No es necesario pasar ningún parámetro. Los resultados devueltos son los siguientes:

{
    
    "status": "ok", "projects": ["weibo", "zhihu"]} 

status representa el estado de ejecución de la solicitud y proyectos es una lista de nombres de proyectos.

2.6 listversions.json

Esta interfaz se utiliza para obtener todos los números de versión de un proyecto, los números de versión están ordenados y la última entrada es el número de versión más reciente.

Podemos usar el siguiente comando para obtener el número de versión del proyecto:

curl http://120.27.34.25:6800/listversions.json?project=weibo 

Aquí se requiere un proyecto de parámetros, que es el nombre del proyecto. Los resultados devueltos son los siguientes:

{
    
    "status": "ok", "versions": ["v1", "v2"]} 

status representa el estado de ejecución de la solicitud y versiones es una lista de números de versión.

2.7 listspiders.json

Esta interfaz se utiliza para obtener todos los nombres de Spider de la última versión de un proyecto. Podemos usar el siguiente comando para obtener el nombre de araña del proyecto:

curl http://120.27.34.25:6800/listspiders.json?project=weibo 

Aquí se requiere un proyecto de parámetros, que es el nombre del proyecto. Los resultados devueltos son los siguientes:

{
    
    "status": "ok", "spiders": ["weibocn"]} 

status representa el estado de ejecución de la solicitud, spiders es una lista de nombres de arañas.

2.8 listjobs.json

Esta interfaz se utiliza para obtener los detalles de todas las tareas que se ejecutan actualmente en un proyecto. Podemos usar el siguiente comando para obtener todos los detalles de la tarea:

curl http://120.27.34.25:6800/listjobs.json?project=weibo 

Aquí se requiere un proyecto de parámetros, que es el nombre del proyecto. Los resultados devueltos son los siguientes:

{
    
    "status": "ok", 
 "pending": [{
    
    "id": "78391cc0fcaf11e1b0090800272a6d06", "spider": "weibocn"}], 
 "running": [{
    
    "id": "422e608f9f28cef127b3d5ef93fe9399", "spider": "weibocn", "start_time": "2017-07-12 10:14:03.594664"}], 
 "finished": [{
    
    "id": "2f16646cfcaf11e1b0090800272a6d06", "spider": "weibocn", "start_time": "2017-07-12 10:14:03.594664", "end_time": "2017-07-12 10:24:03.594664"}]} 

estado representa la ejecución de la solicitud, pendientes representa las tareas en espera actualmente, en ejecución representa las tareas en ejecución actualmente y terminado representa las tareas completadas.

2.9 delversion.json

Esta interfaz se utiliza para eliminar una determinada versión del proyecto. Podemos eliminar la versión del proyecto con el siguiente comando:

curl http://120.27.34.25:6800/delversion.json -d project=weibo -d version=v1 

Aquí necesitamos un proyecto de parámetro, que es el nombre del proyecto, y una versión de parámetro, que es la versión del proyecto. Los resultados devueltos son los siguientes:

{
    
    "status": "ok"} 

status representa la ejecución de la solicitud, de modo que la eliminación sea exitosa.

2.10 delproject.json

Esta interfaz se utiliza para eliminar un elemento. Podemos eliminar un elemento con el siguiente comando:

curl http://120.27.34.25:6800/delproject.json -d project=weibo 

Aquí se requiere un proyecto de parámetros, que es el nombre del proyecto. Los resultados devueltos son los siguientes:

{
    
    "status": "ok"} 

status representa la ejecución de la solicitud, de modo que la eliminación sea exitosa.
Las anteriores son todas las interfaces de Scrapyd, podemos solicitar directamente la interfaz HTTP para controlar la implementación, inicio y operación del proyecto.

3. Uso de ScrapydAPI

Las interfaces anteriores pueden no ser muy convenientes de usar, no importa, hay una biblioteca ScrapydAPI que encapsula estas interfaces nuevamente, y el método de instalación es el siguiente:

pip3 install python-scrapyd-api 

Echemos un vistazo al uso de ScrapydAPI. De hecho, el principio central es el mismo que el método de solicitud de la interfaz HTTP, pero es más conveniente de usar después de haber sido empaquetado en Python.
Podemos crear un objeto ScrapydAPI de la siguiente manera:

from scrapyd_api import ScrapydAPI 
scrapyd = ScrapydAPI('http://120.27.34.25:6800') 

Luego, puede implementar la operación de interfaz correspondiente llamando a su método. Por ejemplo, la operación de implementación puede usar los siguientes métodos:

egg = open('weibo.egg', 'rb') 
scrapyd.add_version('weibo', 'v1', egg) 

De esta manera, podemos empaquetar el proyecto como un archivo Egg y luego implementar el proyecto Egg empaquetado localmente en el Scrapyd remoto.

Además, ScrapydAPI también implementa todas las interfaces API proporcionadas por Scrapyd, con los mismos nombres y los mismos parámetros.

Por ejemplo, podemos llamar al método list_projects para listar todos los proyectos implementados en Scrapyd:

scrapyd.list_projects() 
['weibo', 'zhihu'] 

Además, hay otros métodos que no se enumeran aquí. Los nombres y parámetros son los mismos. Para operaciones más detalladas, consulte su documento oficial: http://python-scrapyd-api.readthedocs.io/ .
Podemos usarlo para implementar el proyecto y controlar el funcionamiento de la tarea a través de la interfaz HTTP. Sin embargo, hay un inconveniente aquí es el proceso de implementación. Primero, necesita empaquetar el archivo Egg y luego cargarlo. Es aún más engorroso. Aquí hay otro. Herramientas Scrapyd-Client.

4. Implementación de Scrapyd-Client

Para facilitar el despliegue de proyectos Scrapy, Scrapyd-Client proporciona dos funciones:

  • Empaqueta el proyecto en un archivo Egg.

  • Implemente el archivo Egg empaquetado en Scrapyd a través de la interfaz addversion.json.

En otras palabras, para Scrapyd-Clientayudarnos a implementar todo el despliegue, ya no necesitamos preocuparnos por cómo se genera el archivo Egg, y no es necesario leer el archivo Egg y solicitar que la interfaz se cargue. Todas estas operaciones solo necesitan ejecutar un comando. Implementación con un clic.

Para implementar el proyecto Scrapy, primero necesitamos modificar el archivo de configuración del proyecto. Por ejemplo, en el proyecto Scrapy que escribimos antes, habrá un archivo scrapy.cfg en la primera capa del proyecto. Su contenido es el siguiente:

[settings] 
default = scrapypyppeteer.settings 
​ 
[deploy] 
#url = http://localhost:6800/ 
project = scrapypyppeteer 

Aquí necesitamos configurar la implementación. Por ejemplo, si queremos implementar el proyecto en Scrapyd en 120.27.34.25, debemos modificarlo de la siguiente manera:

[deploy] 
url = http://120.27.34.25:6800/ 
project = scrapypyppeteer 

Luego ejecutamos el siguiente comando en la ruta donde se ubica el archivo scrapy.cfg:

scrapyd-deploy 

Los resultados son los siguientes:

Packing version 1501682277 
Deploying to project "weibo" in http://120.27.34.25:6800/addversion.json 
Server response (200): 
{
    
    "status": "ok", "spiders": 1, "node_name": "datacrawl-vm", "project": "scrapypyppeteer", "version": "1501682277"} 

Devolver este resultado significa que la implementación se realizó correctamente.

También podemos especificar la versión del proyecto. Si no se especifica, se utilizará de forma predeterminada la marca de tiempo actual. Si se especifica, pasar el parámetro de versión, por ejemplo:

scrapyd-deploy --version 201707131455 

Vale la pena señalar que en la versión Scrapyd 1.2.0 de Python3, no especificamos el número de versión como una cadena con letras, debe ser un número puro, de lo contrario puede ocurrir un error.

Además, si tenemos varios hosts, podemos configurar el alias de cada host, por ejemplo, podemos modificar el archivo de configuración para:

[deploy:vm1] 
url = http://120.27.34.24:6800/ 
project = scrapypyppeteer 
​ 
[deploy:vm2] 
url = http://139.217.26.30:6800/ 
project = scrapypyppeteer 

Si hay varios hosts, configúrelos aquí. Un host corresponde a un conjunto de configuraciones. Agregue el alias del host después de la implementación, por lo que si queremos implementar el proyecto en el host vm2 con IP 139.217.26.30, solo necesitamos Ejecute los siguientes comandos:

scrapyd-deploy vm2 

Entonces podemos implementar el proyecto en el host llamado vm2.
De esta forma, si tenemos varios hosts, solo necesitamos configurar la dirección Scrapyd de cada host en el archivo scrapy.cfg, y luego llamar al comando scrapyd-deploy y el nombre del host para implementar la implementación, lo cual es muy conveniente.

Si Scrapyd ha establecido restricciones de acceso, podemos agregar el nombre de usuario y la configuración de contraseña en el archivo de configuración, y modificar el puerto al mismo tiempo para cambiarlo al puerto proxy Nginx. Si usamos 6801 en el módulo 1, entonces debemos cambiarlo a 6801, modificar como sigue:

[deploy:vm1] 
url = http://120.27.34.24:6801/ 
project = scrapypyppeteer 
username = admin 
password = admin 
​ 
[deploy:vm2] 
url = http://139.217.26.30:6801/ 
project = scrapypyppeteer 
username = germey 
password = germey 

De esta manera, al agregar los campos de nombre de usuario y contraseña, podemos realizar automáticamente la verificación de autenticación durante la implementación y luego implementar con éxito la implementación.

5. Resumen

Anteriormente presentamos los métodos de implementación de Scrapyd, Scrapyd-API y Scrapyd-Client. Espero que pueda probar más.

Supongo que te gusta

Origin blog.csdn.net/weixin_38819889/article/details/108685372
Recomendado
Clasificación