Come utilizzare PyCharm per eseguire il debug di progetti Scrapy


97

Sto lavorando su Scrapy 0.20 con Python 2.7. Ho scoperto che PyCharm ha un buon debugger Python. Voglio testare i miei ragni Scrapy che lo usano. Qualcuno sa come farlo per favore?

Quello che ho provato

In realtà ho provato a eseguire lo spider come script. Di conseguenza, ho creato quello script. Quindi, ho provato ad aggiungere il mio progetto Scrapy a PyCharm come modello in questo modo:
File->Setting->Project structure->Add content root.

Ma non so cos'altro devo fare

Risposte:


170

Il scrapycomando è uno script Python, il che significa che puoi avviarlo dall'interno di PyCharm.

Quando esamini scrapy binary ( which scrapy) noterai che questo è in realtà uno script python:

#!/usr/bin/python

from scrapy.cmdline import execute
execute()

Ciò significa che un comando come scrapy crawl IcecatCrawlerpuò essere eseguito anche in questo modo:python /Library/Python/2.7/site-packages/scrapy/cmdline.py crawl IcecatCrawler

Prova a trovare il pacchetto scrapy.cmdline. Nel mio caso la posizione era qui:/Library/Python/2.7/site-packages/scrapy/cmdline.py

Crea una configurazione di esecuzione / debug all'interno di PyCharm con quello script come script. Riempi i parametri dello script con il comando scrapy e spider. In questo caso crawl IcecatCrawler.

Come questo: Configurazione di esecuzione / debug di PyCharm

Metti i tuoi punti di interruzione ovunque nel codice di scansione e dovrebbe funzionare ™.


(<tipo 'exceptions.SyntaxError'>, SyntaxError ("Carattere non ASCII '\\ xf3' nel file /Library/python/2.7/site-packages/scrapy/cmdline.pyc sulla riga 1, ma nessuna codifica dichiarata;
Aymon Fournier

1
Ottima soluzione! Ho anche provato a utilizzare il binario scrapy stesso che si trova principalmente in: / usr / bin / scrapy come script con gli stessi parametri o qualsiasi altro comando scrapy di cui desideri eseguire il debug e ha funzionato perfettamente. assicurati che la directory di lavoro punti alla radice del tuo progetto scrapy dove si trova scrapy.cfg.
Nour Wolf

3
@AymonFournier Sembra che tu stia cercando di eseguire un file .pyc. Esegui invece il file .py corrispondente (scrapy / cmdline.py).
Artur Gaspar

4
Se lo faccio, il mio modulo delle impostazioni non viene trovato. ImportError: No module named settingsHo verificato che la directory di lavoro sia la directory del progetto. Viene utilizzato all'interno di un progetto Django. Qualcun altro si è imbattuto in questo problema?
Suntoch

6
Non dimenticare di configurare Working directory, altrimenti si verificherà un erroreno active project, Unknown command: crawl, Use "scrapy" to see available commands, Process finished with exit code 2
crifan

105

Hai solo bisogno di farlo.

Crea un file Python nella cartella del crawler nel tuo progetto. Ho usato main.py.

  • Progetto
    • Crawler
      • Crawler
        • Ragni
        • ...
      • main.py
      • scrapy.cfg

All'interno del tuo main.py metti questo codice di seguito.

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

E devi creare una "Configurazione di esecuzione" per eseguire main.py.

In questo modo, se inserisci un punto di interruzione nel codice, si fermerà lì.


1
Questa è una soluzione fantastica.
aristotll

1
Questo metodo è più utile.
wyx

1
Questo mi salva la vita! Grazie!
zsljulius

5
Potresti voler configurare più esecuzioni per diversi spider, quindi accetta il nome dello spider come argomento della tua configurazione di esecuzione. Quindi importa sys spider = sys.argv [1] cmdline.execute ("scrapy crawl {}". Format (spider) .split ())
miguelfg

2
Sicuramente il modo più pulito e veloce per farlo, anche il modo migliore per memorizzarlo nel tuo CVS.
José Tomás Tocino

23

A partire dal 2018.1 questo è diventato molto più semplice. Ora puoi selezionare Module namenei file Run/Debug Configuration. Impostalo su scrapy.cmdlinee sulla Working directorydirectory radice del progetto scrapy (quello con settings.pydentro).

Così:

Configurazione di debug di PyCharm Scrapy

Ora puoi aggiungere punti di interruzione per eseguire il debug del codice.


8

Sto eseguendo scrapy in un virtualenv con Python 3.5.0 e impostando il parametro "script" per /path_to_project_env/env/bin/scrapyrisolvere il problema per me.


Sono sorpreso che funzioni, pensavo che scrapy non funzionasse con python 3
user1592380

1
Grazie, ha funzionato con Python 3.5 e virtualenv. "script" come ha detto @rioted e impostando "working directory" su project/crawler/crawler, cioè, la directory che contiene __init__.py.
effel

5

Anche l'idea di intellij funziona.

creare 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====================================================')

mostra sotto:

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


3

Per aggiungere un po 'alla risposta accettata, dopo quasi un'ora ho scoperto che dovevo selezionare la configurazione di esecuzione corretta dall'elenco a discesa (vicino al centro della barra degli strumenti delle icone), quindi fare clic sul pulsante Debug per farlo funzionare. Spero che questo ti aiuti!


2

Sto anche usando PyCharm, ma non sto usando le sue funzionalità di debug integrate.

Per il debug che sto usando ipdb. Ho impostato una scorciatoia da tastiera da inserire import ipdb; ipdb.set_trace()su qualsiasi riga in cui desidero che si verifichi il punto di interruzione.

Quindi posso digitare nper eseguire l'istruzione successiva, sper entrare in una funzione, digitare qualsiasi nome di oggetto per vedere il suo valore, modificare l'ambiente di esecuzione, digitare cper continuare l'esecuzione ...

Questo è molto flessibile, funziona in ambienti diversi da PyCharm, dove non controlli l'ambiente di esecuzione.

Basta digitare il proprio ambiente virtuale pip install ipdbe posizionarlo import ipdb; ipdb.set_trace()su una riga in cui si desidera sospendere l'esecuzione.


2

Secondo la documentazione 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

0

Uso questo semplice 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()

0

Estendendo la versione della risposta di @ Rodrigo ho aggiunto questo script e ora posso impostare il nome dello spider dalla configurazione invece di cambiare nella stringa.

import sys
from scrapy import cmdline

cmdline.execute(f"scrapy crawl {sys.argv[1]}".split())
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.