Como usar o PyCharm para depurar projetos Scrapy

97

Estou trabalhando no Scrapy 0.20 com Python 2.7. Descobri que o PyCharm tem um bom depurador Python. Eu quero testar minhas aranhas Scrapy usando isso. Alguém sabe fazer isso por favor?

O que eu tentei

Na verdade, tentei executar o spider como um script. Como resultado, criei esse script. Então, tentei adicionar meu projeto Scrapy ao PyCharm como um modelo assim:
File->Setting->Project structure->Add content root.

Mas eu não sei o que mais eu tenho que fazer

William Kinaan
fonte

Respostas:

170

O scrapycomando é um script python, o que significa que você pode iniciá-lo de dentro do PyCharm.

Ao examinar o binário scrapy ( which scrapy), você notará que este é na verdade um script Python:

#!/usr/bin/python

from scrapy.cmdline import execute
execute()

Isso significa que um comando como scrapy crawl IcecatCrawlertambém pode ser executado assim:python /Library/Python/2.7/site-packages/scrapy/cmdline.py crawl IcecatCrawler

Tente encontrar o pacote scrapy.cmdline. No meu caso, o local era aqui:/Library/Python/2.7/site-packages/scrapy/cmdline.py

Crie uma configuração de execução / depuração dentro do PyCharm com esse script como script. Preencha os parâmetros do script com o comando scrapy e spider. Neste caso crawl IcecatCrawler.

Como isso: Configuração de execução / depuração do PyCharm

Coloque seus pontos de interrupção em qualquer lugar em seu código de rastreamento e ele deve funcionar ™.

Pullie
fonte
(<type 'exceptions.SyntaxError'>, SyntaxError ("caractere não ASCII '\\ xf3' no arquivo /Library/python/2.7/site-packages/scrapy/cmdline.pyc na linha 1, mas nenhuma codificação declarada;
Aymon Fournier
1
Ótima solução! Também tentei usar o próprio binário scrapy localizado principalmente em: / usr / bin / scrapy como o script com os mesmos parâmetros ou quaisquer outros comandos scrapy que você deseja depurar e funcionou perfeitamente. certifique-se de que o diretório de trabalho esteja apontando para a raiz do projeto scrapy, onde scrapy.cfg está localizado.
Nour Wolf
3
@AymonFournier Parece que você está tentando executar um arquivo .pyc. Em vez disso, execute o arquivo .py correspondente (scrapy / cmdline.py).
Artur Gaspar
4
Se estou fazendo isso, meu módulo de configurações não foi encontrado. ImportError: No module named settingsVerifiquei se o diretório de trabalho é o diretório do projeto. É usado em um projeto Django. Alguém mais encontrou este problema?
suntoch de
6
Não se esqueça de configurar Working directory, caso contrário ocorrerá um errono active project, Unknown command: crawl, Use "scrapy" to see available commands, Process finished with exit code 2
crifan
105

Você só precisa fazer isso.

Crie um arquivo Python na pasta do rastreador em seu projeto. Usei main.py.

  • Projeto
    • rastejante
      • rastejante
        • Aranhas
        • ...
      • main.py
      • scrapy.cfg

Dentro do seu main.py coloque este código abaixo.

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

E você precisa criar uma "Configuração de execução" para executar o main.py.

Fazendo isso, se você colocar um ponto de interrupção em seu código, ele irá parar por aí.

Rodrigo
fonte
1
Esta é uma solução incrível.
aristotll de
1
Este método é mais útil.
wyx
1
Este salva minha vida! Obrigado!
zsljulius de
5
Você pode querer configurar várias execuções para diferentes spiders, então aceite o nome do spider como um argumento de sua configuração de execução. Em seguida, importe sys spider = sys.argv [1] cmdline.execute ("scrapy crawl {}". Format (spider) .split ())
miguelfg
2
Definitivamente, a maneira mais limpa e rápida de fazer isso, e também a melhor maneira de armazená-lo em seu CVS.
José Tomás Tocino
23

A partir de 2018.1 isso se tornou muito mais fácil. Agora você pode selecionar Module nameno seu projeto Run/Debug Configuration. Defina como scrapy.cmdlinee Working directorycomo o diretório raiz do projeto scrapy (aquele com settings.pyele).

Igual a:

Configuração de depuração PyCharm Scrapy

Agora você pode adicionar pontos de interrupção para depurar seu código.

Rutger de Knijf
fonte
8

Estou executando o scrapy em um virtualenv com Python 3.5.0 e definindo o parâmetro "script" para /path_to_project_env/env/bin/scrapyresolver o problema para mim.

tumultuado
fonte
Estou surpreso que isso funcione, pensei que o scrapy não funcionava com o python 3
user1592380
1
Obrigado, isso funcionou com Python 3.5 e virtualenv. "script" como @rioted disse e definindo "diretório de trabalho" para project/crawler/crawler, ou seja, o diretório que contém __init__.py.
efel
5

idéia intellij também funciona.

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

mostre abaixo:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

LuciferJack
fonte
3

Para adicionar um pouco à resposta aceita, depois de quase uma hora descobri que tinha que selecionar a configuração de execução correta na lista suspensa (perto do centro da barra de ferramentas do ícone) e, em seguida, clicar no botão Depurar para fazê-lo funcionar. Espero que isto ajude!

Taylor
fonte
2

Também estou usando o PyCharm, mas não estou usando seus recursos de depuração integrados.

Estou usando para depuração ipdb. Eu configurei um atalho de teclado para inserir import ipdb; ipdb.set_trace()em qualquer linha onde desejo que o ponto de interrupção aconteça.

Então posso digitar npara executar a próxima instrução, spara entrar em uma função, digitar qualquer nome de objeto para ver seu valor, alterar o ambiente de execução, digitar cpara continuar a execução ...

Isso é muito flexível, funciona em ambientes diferentes do PyCharm, onde você não controla o ambiente de execução.

Basta digitar em seu ambiente virtual pip install ipdbe colocar import ipdb; ipdb.set_trace()em uma linha onde deseja que a execução seja interrompida.

Warvariuc
fonte
2

De acordo com a documentação 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
fonte
0

Eu uso este script simples:

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
fonte
0

Estendendo a versão de @Rodrigo da resposta, adicionei este script e agora posso definir o nome da aranha a partir da configuração em vez de alterar a string.

import sys
from scrapy import cmdline

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