Verwendung von PyCharm zum Debuggen von Scrapy-Projekten


97

Ich arbeite an Scrapy 0.20 mit Python 2.7. Ich fand, dass PyCharm einen guten Python-Debugger hat. Ich möchte meine Scrapy-Spinnen damit testen. Weiß jemand wie man das bitte macht?

Was ich versucht habe

Eigentlich habe ich versucht, die Spinne als Skript auszuführen. Als Ergebnis habe ich dieses Skript erstellt. Dann habe ich versucht, mein Scrapy-Projekt als Modell wie folgt zu PyCharm hinzuzufügen:
File->Setting->Project structure->Add content root.

Aber ich weiß nicht, was ich sonst noch tun muss

Antworten:


170

Der scrapyBefehl ist ein Python-Skript, dh Sie können ihn in PyCharm starten.

Wenn Sie die Scrapy Binary ( which scrapy) untersuchen, werden Sie feststellen, dass dies tatsächlich ein Python-Skript ist:

#!/usr/bin/python

from scrapy.cmdline import execute
execute()

Dies bedeutet, dass ein Befehl wie scrapy crawl IcecatCrawlerauch folgendermaßen ausgeführt werden kann:python /Library/Python/2.7/site-packages/scrapy/cmdline.py crawl IcecatCrawler

Versuchen Sie, das Paketrapy.cmdline zu finden. In meinem Fall war der Ort hier:/Library/Python/2.7/site-packages/scrapy/cmdline.py

Erstellen Sie in PyCharm eine Run / Debug-Konfiguration mit diesem Skript als Skript. Füllen Sie die Skriptparameter mit dem Scrapy-Befehl und der Spinne. In diesem Fall crawl IcecatCrawler.

So was: PyCharm Run / Debug-Konfiguration

Platzieren Sie Ihre Haltepunkte an einer beliebigen Stelle in Ihrem Crawler-Code, und es sollte funktionieren ™.


(<Typ 'Ausnahmen.SyntaxError'>, SyntaxError ("Nicht-ASCII-Zeichen '\\ xf3' in Datei /Library/python/2.7/site-packages/scrapy/cmdline.pyc in Zeile 1, aber keine Codierung deklariert;
Aymon Fournier

1
Tolle Lösung! Ich habe auch versucht, die Scrapy-Binärdatei selbst zu verwenden, die sich hauptsächlich in: / usr / bin / Scrapy befindet, als Skript mit denselben Parametern oder anderen Scrapy-Befehlen, die Sie debuggen möchten, und es hat einfach perfekt funktioniert. Stellen Sie sicher, dass das Arbeitsverzeichnis auf Ihr Scrapy-Projektstammverzeichnis verweist, in dem sich Scrapy.cfg befindet.
Nour Wolf

3
@AymonFournier Es scheint, dass Sie versuchen, eine .pyc-Datei auszuführen. Führen Sie stattdessen die entsprechende .py-Datei aus (Scrapy / cmdline.py).
Artur Gaspar

4
Wenn ich das mache, wird mein Einstellungsmodul nicht gefunden. ImportError: No module named settingsIch habe überprüft, ob das Arbeitsverzeichnis das Projektverzeichnis ist. Es wird in einem Django-Projekt verwendet. Ist sonst noch jemand auf dieses Problem gestoßen?
Suntoch

6
Vergessen Sie nicht zu konfigurieren Working directory, sonst wird Fehlerno active project, Unknown command: crawl, Use "scrapy" to see available commands, Process finished with exit code 2
Crifan

103

Sie müssen dies nur tun.

Erstellen Sie eine Python-Datei im Crawler-Ordner Ihres Projekts. Ich habe main.py verwendet.

  • Projekt
    • Crawler
      • Crawler
        • Spinnen
        • ...
      • main.py.
      • Scrapy.cfg

Geben Sie diesen Code in Ihre main.py ein.

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

Und Sie müssen eine "Run Configuration" erstellen, um Ihre main.py auszuführen.

Wenn Sie dabei einen Haltepunkt an Ihrem Code setzen, wird dieser dort gestoppt.


1
Dies ist eine großartige Lösung.
Aristotll

1
Diese Methode ist nützlicher.
Wyx

1
Dieser rettet mein Leben! Vielen Dank!
Zsljulius

4
Möglicherweise möchten Sie mehrere Ausführungen für verschiedene Spider konfigurieren. Akzeptieren Sie daher den Spider-Namen als Argument für Ihre Ausführungskonfiguration. Importieren Sie dann sys spider = sys.argv [1] cmdline.execute ("Scrapy Crawl {}". Format (Spider) .split ())
miguelfg

2
Auf jeden Fall die sauberste und schnellste Art, dies zu tun, und auch die beste Art, es in Ihrem CVS zu speichern.
José Tomás Tocino

22

Ab 2018.1 wurde dies viel einfacher. Sie können jetzt Module namein Ihrem Projekt auswählen Run/Debug Configuration. Setzen Sie dies auf scrapy.cmdlineund Working directoryauf das Stammverzeichnis des Scrapy-Projekts (das mit dem settings.pydarin enthaltenen).

Wie so:

PyCharm Scrapy-Debug-Konfiguration

Jetzt können Sie Haltepunkte hinzufügen, um Ihren Code zu debuggen.


8

Ich führe Scrapy in einer virtuellen Umgebung mit Python 3.5.0 aus und setze den Parameter "script", um /path_to_project_env/env/bin/scrapydas Problem für mich zu lösen.


Ich bin überrascht, dass dies funktioniert. Ich dachte, Scrapy funktioniert nicht mit Python 3
user1592380

1
Danke, das hat mit Python 3.5 und virtualenv funktioniert. "script" wie @rioted sagte und "Arbeitsverzeichnis" auf project/crawler/crawlerdas Verzeichnis setzen, das enthält __init__.py.
Effel

5

Intellij Idee funktioniert auch.

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

unten zeigen:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein


3

Um der akzeptierten Antwort etwas hinzuzufügen, musste ich nach fast einer Stunde die richtige Ausführungskonfiguration aus der Dropdown-Liste (nahe der Mitte der Symbolsymbolleiste) auswählen und dann auf die Schaltfläche Debuggen klicken, damit sie funktioniert. Hoffe das hilft!


2

Ich verwende auch PyCharm, aber ich verwende nicht die integrierten Debugging-Funktionen.

Zum Debuggen verwende ich ipdb. Ich habe eine Tastenkombination eingerichtet, die import ipdb; ipdb.set_trace()in jede Zeile eingefügt werden soll, in der der Haltepunkt auftreten soll.

Dann kann ich eingeben n, um die nächste Anweisung auszuführen, seine Funktion einzugeben, einen beliebigen Objektnamen eingeben, um seinen Wert anzuzeigen, die Ausführungsumgebung ändern, eingeben c, um die Ausführung fortzusetzen ...

Dies ist sehr flexibel und funktioniert in anderen Umgebungen als PyCharm, in denen Sie die Ausführungsumgebung nicht steuern.

Geben Sie einfach Ihre virtuelle Umgebung ein pip install ipdbund platzieren Sie sie import ipdb; ipdb.set_trace()in einer Zeile, in der die Ausführung angehalten werden soll.


2

Gemäß der Dokumentation 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

Ich benutze dieses einfache Skript:

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

Erweitern der @ Rodrigo-Version der Antwort Ich habe dieses Skript hinzugefügt und kann jetzt den Spinnennamen aus der Konfiguration festlegen, anstatt die Zeichenfolge zu ändern.

import sys
from scrapy import cmdline

cmdline.execute(f"scrapy crawl {sys.argv[1]}".split())
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.