Cómo utilizar PyCharm para depurar proyectos Scrapy

97

Estoy trabajando en Scrapy 0.20 con Python 2.7. Descubrí que PyCharm tiene un buen depurador de Python. Quiero probar mis arañas Scrapy usándolo. Alguien sabe como hacer eso por favor?

Lo que he probado

De hecho, intenté ejecutar la araña como un script. Como resultado, construí ese guión. Luego, intenté agregar mi proyecto Scrapy a PyCharm como un modelo como este:
File->Setting->Project structure->Add content root.

Pero no se que mas tengo que hacer

William Kinaan
fuente

Respuestas:

170

El scrapycomando es un script de Python, lo que significa que puede iniciarlo desde dentro de PyCharm.

Cuando examine el binario scrapy ( which scrapy), notará que en realidad se trata de un script de Python:

#!/usr/bin/python

from scrapy.cmdline import execute
execute()

Esto significa que un comando como este scrapy crawl IcecatCrawlertambién se puede ejecutar así:python /Library/Python/2.7/site-packages/scrapy/cmdline.py crawl IcecatCrawler

Intente encontrar el paquete scrapy.cmdline. En mi caso, la ubicación estaba aquí:/Library/Python/2.7/site-packages/scrapy/cmdline.py

Cree una configuración de ejecución / depuración dentro de PyCharm con ese script como script. Complete los parámetros del script con el comando scrapy y spider. En este caso crawl IcecatCrawler.

Me gusta esto: Configuración de ejecución / depuración de PyCharm

Coloque sus puntos de interrupción en cualquier lugar de su código de rastreo y debería funcionar ™.

Pullie
fuente
(<escriba 'exceptions.SyntaxError'>, SyntaxError ("Carácter no ASCII '\\ xf3' en el archivo /Library/python/2.7/site-packages/scrapy/cmdline.pyc en la línea 1, pero sin codificación declarada;
Aymon Fournier
1
¡Gran solución! También intenté usar el propio binario scrapy ubicado principalmente en: / usr / bin / scrapy como el script con los mismos parámetros o cualquier otro comando scrapy que desee depurar y funcionó perfectamente. asegúrese de que el directorio de trabajo apunte a la raíz de su proyecto scrapy donde se encuentra scrapy.cfg.
Nour Wolf
3
@AymonFournier Parece que está intentando ejecutar un archivo .pyc. En su lugar, ejecute el archivo .py correspondiente (scrapy / cmdline.py).
Artur Gaspar
4
Si estoy haciendo eso, no se encuentra mi módulo de configuración. ImportError: No module named settingsHe comprobado que el directorio de trabajo es el directorio del proyecto. Se usa dentro de un proyecto de Django. ¿Alguien más se topó con este problema?
suntoch
6
No te olvides de configurar Working directory, de lo contrario habrá un errorno active project, Unknown command: crawl, Use "scrapy" to see available commands, Process finished with exit code 2
crifan
105

Solo necesitas hacer esto.

Cree un archivo de Python en la carpeta del rastreador de su proyecto. Usé main.py.

  • Proyecto
    • Tractor
      • Tractor
        • Arañas
        • ...
      • main.py
      • scrapy.cfg

Dentro de su main.py, ponga este código a continuación.

from scrapy import cmdline    
cmdline.execute("scrapy crawl spider".split())

Y necesita crear una "Configuración de ejecución" para ejecutar su main.py.

Al hacer esto, si coloca un punto de interrupción en su código, se detendrá allí.

Rodrigo
fuente
1
Esta es una solución asombrosa.
aristotll
1
Este método es más útil.
wyx
1
¡Este me salva la vida! ¡Gracias!
zsljulius
5
Es posible que desee configurar varias ejecuciones para diferentes arañas, así que acepte el nombre de la araña como argumento de su configuración de ejecución. Luego, importe sys spider = sys.argv [1] cmdline.execute ("scrapy crawl {}". Format (spider) .split ())
miguelfg
2
Definitivamente la forma más limpia y rápida de hacerlo, también la mejor forma de almacenarlo en tu CVS.
José Tomás Tocino
23

A partir de 2018.1, esto se volvió mucho más fácil. Ahora puede seleccionar Module nameen su proyecto Run/Debug Configuration. Establezca esto en scrapy.cmdliney Working directoryen el directorio raíz del proyecto scrapy (el que contiene settings.py).

Al igual que:

Configuración de depuración de PyCharm Scrapy

Ahora puede agregar puntos de interrupción para depurar su código.

Rutger de Knijf
fuente
8

Estoy ejecutando scrapy en un virtualenv con Python 3.5.0 y estableciendo el parámetro "script" para /path_to_project_env/env/bin/scrapyresolver el problema por mí.

alborotado
fuente
Me sorprende que esto funcione, pensé que scrapy no funcionaba con python 3
user1592380
1
Gracias, esto funcionó con Python 3.5 y virtualenv. "script" como dijo @rioted y configurando "directorio de trabajo" project/crawler/crawler, es decir, el directorio que contiene __init__.py.
effel
5

intellij idea también funciona.

crear main.py :

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#coding=utf-8
import sys
from scrapy import cmdline
def main(name):
    if name:
        cmdline.execute(name.split())



if __name__ == '__main__':
    print('[*] beginning main thread')
    name = "scrapy crawl stack"
    #name = "scrapy crawl spa"
    main(name)
    print('[*] main thread exited')
    print('main stop====================================================')

mostrar a continuación:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

LuciferJack
fuente
3

Para agregar un poco a la respuesta aceptada, después de casi una hora descubrí que tenía que seleccionar la Configuración de ejecución correcta de la lista desplegable (cerca del centro de la barra de herramientas del icono), luego hacer clic en el botón Depurar para que funcione. ¡Espero que esto ayude!

Taylor
fuente
2

También estoy usando PyCharm, pero no estoy usando sus funciones de depuración integradas.

Para depurar estoy usando ipdb. Configuré un atajo de teclado para insertar import ipdb; ipdb.set_trace()en cualquier línea que desee que ocurra el punto de interrupción.

Luego puedo escribir npara ejecutar la siguiente declaración, singresar a una función, escribir cualquier nombre de objeto para ver su valor, alterar el entorno de ejecución, escribir cpara continuar con la ejecución ...

Esto es muy flexible, funciona en entornos distintos a PyCharm, donde no controlas el entorno de ejecución.

Simplemente escriba su entorno virtual pip install ipdby colóquelo import ipdb; ipdb.set_trace()en una línea donde desee que se detenga la ejecución.

warvariuc
fuente
2

Según la documentación https://doc.scrapy.org/en/latest/topics/practices.html

import scrapy
from scrapy.crawler import CrawlerProcess

class MySpider(scrapy.Spider):
    # Your spider definition
    ...

process = CrawlerProcess({
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})

process.crawl(MySpider)
process.start() # the script will block here until the crawling is finished
berardino
fuente
0

Yo uso este sencillo script:

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

process = CrawlerProcess(get_project_settings())

process.crawl('your_spider_name')
process.start()
gangabass
fuente
0

Ampliando la versión de @ Rodrigo de la respuesta, agregué este script y ahora puedo establecer el nombre de la araña desde la configuración en lugar de cambiar la cadena.

import sys
from scrapy import cmdline

cmdline.execute(f"scrapy crawl {sys.argv[1]}".split())
Muhammad Haseeb
fuente