web-dev-qa-db-fra.com

Comment utiliser PyCharm pour déboguer des projets Scrapy

Je travaille sur Scrapy 0.20 avec Python 2.7. J'ai trouvé que PyCharm avait un bon Python. Je souhaite tester mes araignées Scrapy. Tout le monde sait comment faire ça s'il vous plait?

Ce que j'ai essayé

En fait, j'ai essayé d'utiliser l'araignée comme 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 quoi d'autre je dois faire

86
William Kinaan

La commande scrapy est un script python qui signifie que vous pouvez le démarrer à partir de PyCharm.

Lorsque vous examinez le binaire scrapy (which scrapy) vous remarquerez qu’il s’agit d’un script python:

#!/usr/bin/python

from scrapy.cmdline import execute
execute()

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

Essayez de trouver le paquet scrapy.cmdline. Dans mon cas, le lieu était ici: /Library/Python/2.7/site-packages/scrapy/cmdline.py

Créez une configuration d'exécution/de débogage dans PyCharm avec ce script en tant que script. Remplissez les paramètres du script avec la commande scrapy et l'araignée. Dans ce cas crawl IcecatCrawler.

Comme ça: PyCharm Run/Debug Configuration

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

155
Pullie

Vous avez juste besoin de faire ça.

Créez un fichier Python dans 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.

Ce faisant, si vous mettez un point d'arrêt sur votre code, il s'arrête là.

97
Rodrigo

À compter de 2018.1, cela est devenu beaucoup plus facile. Vous pouvez maintenant sélectionner Module name dans votre projet Run/Debug Configuration. Définissez ceci sur scrapy.cmdline et le Working directory à la racine du projet scrapy (celui avec settings.py dedans).

Ainsi:

PyCharm Scrapy debug configuration

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

11
Rutger de Knijf

Je suis en train de courir dans un environnement virtuel avec Python 3.5.0 et en définissant le paramètre "script" sur /path_to_project_env/env/bin/scrapy résolu le problème pour moi.

8
rioted

intellij idea 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 __== '__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:

enter image description here

enter image description here

enter image description here

5
LuciferJack

Pour ajouter un peu à la réponse acceptée, après presque une heure, je me suis rendu compte que je devais sélectionner la configuration correcte dans la liste déroulante (près du centre de la barre d’icônes), puis cliquer sur le bouton Déboguer pour que cela fonctionne. J'espère que cela t'aides!

3
taylor

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

Pour le débogage, j'utilise ipdb . J'ai configuré un raccourci clavier pour insérer import ipdb; ipdb.set_trace() sur n'importe quelle ligne pour laquelle le point d'arrêt doit se produire.

Ensuite, je peux taper n pour exécuter l'instruction suivante, s pour entrer dans une fonction, saisir un nom d'objet pour afficher sa valeur, modifier l'environnement d'exécution, taper c pour continuer. 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.

Il suffit de taper votre environnement virtuel pip install ipdb Et de placer import ipdb; ipdb.set_trace() sur une ligne où vous souhaitez que l'exécution soit suspendue.

2
warvariuc

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
1
berardino

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()
0
gangabass