Comment utiliser PyCharm pour déboguer des projets Scrapy

97

Je travaille sur Scrapy 0.20 avec Python 2.7. J'ai trouvé que PyCharm avait un bon débogueur Python. Je veux tester mes araignées Scrapy en l'utilisant. Quelqu'un sait comment faire ça s'il vous plait?

Ce que j'ai essayé

En fait, j'ai essayé d'exécuter l'araignée en tant que script. En conséquence, j'ai construit ce script. Ensuite, j'ai essayé d'ajouter mon projet Scrapy à PyCharm en tant que modèle comme celui-ci:
File->Setting->Project structure->Add content root.

Mais je ne sais pas ce que je dois faire d'autre

William Kinaan
la source

Réponses:

170

La scrapycommande est un script python, ce qui signifie que vous pouvez la démarrer depuis PyCharm.

Lorsque vous examinez le binaire scrapy ( which scrapy), vous remarquerez qu'il s'agit en fait d'un script python:

#!/usr/bin/python

from scrapy.cmdline import execute
execute()

Cela signifie qu'une commande comme celle-ci scrapy crawl IcecatCrawlerpeut également être exécutée comme ceci:python /Library/Python/2.7/site-packages/scrapy/cmdline.py crawl IcecatCrawler

Essayez de trouver le package scrapy.cmdline. Dans mon cas, l'emplacement était ici:/Library/Python/2.7/site-packages/scrapy/cmdline.py

Créez une configuration d'exécution / débogage dans PyCharm avec ce script comme script. Remplissez les paramètres du script avec la commande scrapy et spider. Dans ce cas crawl IcecatCrawler.

Comme ça: Configuration d'exécution / débogage PyCharm

Mettez vos points d'arrêt n'importe où dans votre code d'exploration et cela devrait fonctionner ™.

Pullie
la source
(<type 'exceptions.SyntaxError'>, SyntaxError ("Caractère non-ASCII '\\ xf3' dans le fichier /Library/python/2.7/site-packages/scrapy/cmdline.pyc à la ligne 1, mais aucun encodage déclaré;
Aymon Fournier
1
Excellente solution! J'ai également essayé d'utiliser le binaire scrapy lui-même situé principalement dans: / usr / bin / scrapy comme script avec les mêmes paramètres ou toute autre commande scrapy que vous souhaitez déboguer et cela a fonctionné parfaitement. assurez-vous que le répertoire de travail pointe vers la racine de votre projet scrapy où se trouve scrapy.cfg.
Nour Wolf
3
@AymonFournier Il semble que vous essayez d'exécuter un fichier .pyc. Exécutez le fichier .py correspondant à la place (scrapy / cmdline.py).
Artur Gaspar
4
Si je fais cela, mon module de paramètres est introuvable. ImportError: No module named settingsJ'ai vérifié que le répertoire de travail est le répertoire du projet. Il est utilisé dans un projet Django. Quelqu'un d'autre est tombé sur ce problème?
suntoch
6
N'oubliez pas de config Working directory, sinon erreurno active project, Unknown command: crawl, Use "scrapy" to see available commands, Process finished with exit code 2
crifan
105

Vous avez juste besoin de le faire.

Créez un fichier Python sur le dossier du robot d'exploration de votre projet. J'ai utilisé main.py.

  • Projet
    • Crawler
      • Crawler
        • Les araignées
        • ...
      • main.py
      • scrapy.cfg

Dans votre main.py mettez ce code ci-dessous.

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

Et vous devez créer une "Configuration d'exécution" pour exécuter votre main.py.

En faisant cela, si vous mettez un point d'arrêt à votre code, il s'arrêtera là.

Rodrigo
la source
1
C'est une solution formidable.
aristotll
1
Cette méthode est plus utile.
wyx
1
Celui-ci me sauve la vie! Merci!
zsljulius
5
Vous voudrez peut-être configurer plusieurs exécutions pour différentes araignées, acceptez donc le nom de l'araignée comme argument de votre configuration d'exécution. Puis importez sys spider = sys.argv [1] cmdline.execute ("scrapy crawl {}". Format (spider) .split ())
miguelfg
2
Certainement le moyen le plus propre et le plus rapide de le faire, aussi le meilleur moyen de le stocker dans votre CVS.
José Tomás Tocino
23

À partir de 2018.1, cela est devenu beaucoup plus facile. Vous pouvez maintenant sélectionner Module namedans votre projet Run/Debug Configuration. Définissez ceci sur scrapy.cmdlineet Working directorysur le répertoire racine du projet scrapy (celui qui contient settings.py).

Ainsi:

Configuration de débogage de PyCharm Scrapy

Vous pouvez maintenant ajouter des points d'arrêt pour déboguer votre code.

Rutger de Knijf
la source
8

J'utilise scrapy dans un virtualenv avec Python 3.5.0 et je règle le paramètre "script" pour /path_to_project_env/env/bin/scrapyrésoudre le problème pour moi.

émeute
la source
Je suis surpris que cela fonctionne, je pensais que scrapy ne fonctionnait pas avec python 3
user1592380
1
Merci, cela a fonctionné avec Python 3.5 et virtualenv. "script" comme @rioted l'a dit et définissant "répertoire de travail" sur project/crawler/crawler, c'est- à -dire, le répertoire contenant __init__.py.
effel
5

L'idée intellij fonctionne également.

créez 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====================================================')

montrer ci-dessous:

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

LuciferJack
la source
3

Pour ajouter un peu à la réponse acceptée, après presque une heure, j'ai trouvé que je devais sélectionner la bonne configuration d'exécution dans la liste déroulante (près du centre de la barre d'outils de l'icône), puis cliquez sur le bouton Déboguer pour la faire fonctionner. J'espère que cela t'aides!

taylor
la source
2

J'utilise également PyCharm, mais je n'utilise pas ses fonctionnalités de débogage intégrées.

Pour le débogage que j'utilise ipdb. J'ai configuré un raccourci clavier à insérer import ipdb; ipdb.set_trace()sur n'importe quelle ligne que je souhaite que le point d'arrêt se produise.

Ensuite, je peux taper npour exécuter l'instruction suivante, spour entrer dans une fonction, taper n'importe quel nom d'objet pour voir sa valeur, modifier l'environnement d'exécution, taper cpour continuer l'exécution ...

Ceci est très flexible, fonctionne dans des environnements autres que PyCharm, où vous ne contrôlez pas l'environnement d'exécution.

Tapez simplement votre environnement virtuel pip install ipdbet placez-le import ipdb; ipdb.set_trace()sur une ligne où vous voulez que l'exécution s'arrête.

warvariuc
la source
2

Selon la documentation 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
la source
0

J'utilise ce script simple:

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
la source
0

Extension de la version de la réponse de @ Rodrigo J'ai ajouté ce script et maintenant je peux définir le nom de l'araignée à partir de la configuration au lieu de changer la chaîne.

import sys
from scrapy import cmdline

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