Jak używać PyCharm do debugowania projektów Scrapy

97

Pracuję nad Scrapy 0.20 z Pythonem 2.7. Odkryłem, że PyCharm ma dobry debugger Pythona. Chcę przetestować moje pająki Scrapy przy jego użyciu. Czy ktoś wie, jak to zrobić, proszę?

Co próbowałem

Właściwie to próbowałem uruchomić pająka jako skrypt. W rezultacie zbudowałem ten skrypt. Następnie próbowałem dodać mój projekt Scrapy do PyCharm jako model w następujący sposób:
File->Setting->Project structure->Add content root.

Ale nie wiem, co jeszcze mam zrobić

William Kinaan
źródło

Odpowiedzi:

171

scrapyKomenda jest skrypt Pythona, który oznacza, że można go uruchomić od wewnątrz pycharm.

Kiedy przyjrzysz się plikowi binarnemu scrapy ( which scrapy), zauważysz, że w rzeczywistości jest to skrypt w Pythonie:

#!/usr/bin/python

from scrapy.cmdline import execute
execute()

Oznacza to, że takie polecenie scrapy crawl IcecatCrawlermożna również wykonać w ten sposób:python /Library/Python/2.7/site-packages/scrapy/cmdline.py crawl IcecatCrawler

Spróbuj znaleźć pakiet scrapy.cmdline. W moim przypadku lokalizacja była tutaj:/Library/Python/2.7/site-packages/scrapy/cmdline.py

Utwórz konfigurację uruchamiania / debugowania w PyCharm z tym skryptem jako skryptem. Wypełnij parametry skryptu poleceniem scrapy i pająkiem. W tym przypadku crawl IcecatCrawler.

Lubię to: Konfiguracja uruchamiania / debugowania PyCharm

Umieść punkty przerwania w dowolnym miejscu kodu indeksującego i powinno działać ™.

Pullie
źródło
(<type 'exceptions.SyntaxError'>, SyntaxError ("Znak inny niż ASCII '\\ xf3' w pliku /Library/python/2.7/site-packages/scrapy/cmdline.pyc w linii 1, ale bez zadeklarowanego kodowania;
Aymon Fournier,
1
Świetne rozwiązanie! Próbowałem również użyć samego pliku binarnego scrapy znajdującego się głównie w: / usr / bin / scrapy jako skryptu z tymi samymi parametrami lub innymi poleceniami scrapy, które chcesz debugować i działało idealnie. upewnij się, że katalog roboczy wskazuje na katalog główny twojego projektu scrapy, w którym znajduje się scrapy.cfg.
Nour Wolf
3
@AymonFournier Wygląda na to, że próbujesz uruchomić plik .pyc. Zamiast tego uruchom odpowiedni plik .py (scrapy / cmdline.py).
Artur Gaspar
4
Jeśli to robię, mój moduł ustawień nie został znaleziony. ImportError: No module named settingsSprawdziłem, czy katalog roboczy to katalog projektu. Jest używany w projekcie Django. Czy ktoś jeszcze natknął się na ten problem?
suntoch
6
Nie zapomnij o konfiguracji Working directory, w przeciwnym razie wystąpi błądno active project, Unknown command: crawl, Use "scrapy" to see available commands, Process finished with exit code 2
crifan
106

Po prostu musisz to zrobić.

Utwórz plik Python w folderze robota w swoim projekcie. Użyłem main.py.

  • Projekt
    • Gąsienica
      • Gąsienica
        • Pająki
        • ...
      • main.py
      • scrapy.cfg

Wewnątrz swojego main.py umieść poniższy kod.

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

Aby uruchomić plik main.py, musisz utworzyć „Uruchom konfigurację”.

Robiąc to, jeśli umieścisz punkt przerwania w swoim kodzie, zatrzyma się na tym.

Rodrigo
źródło
1
To świetne rozwiązanie.
aristotll
1
Ta metoda jest bardziej przydatna.
wyx
1
Ten ratuje mi życie! Dzięki!
zsljulius
5
Możesz chcieć skonfigurować wiele wykonań dla różnych pająków, więc zaakceptuj nazwę pająka jako argument swojej konfiguracji uruchamiania. Następnie zaimportuj sys spider = sys.argv [1] cmdline.execute ("scrapy crawl {}". Format (pająk) .split ())
miguelfg
2
Zdecydowanie najczystszy i najszybszy sposób na zrobienie tego, a także najlepszy sposób na przechowywanie tego w CVS.
José Tomás Tocino
23

Od 2018.1 stało się to znacznie łatwiejsze. Możesz teraz wybrać Module namew swoim projekcie Run/Debug Configuration. Ustaw to scrapy.cmdlinei na Working directorykatalog główny projektu scrapy (tego, który jest settings.pyw nim).

Tak jak to:

Konfiguracja debugowania PyCharm Scrapy

Teraz możesz dodać punkty przerwania, aby debugować swój kod.

Rutger de Knijf
źródło
8

Uruchamiam scrapy w virtualenv z Pythonem 3.5.0 i ustawiam parametr „script”, aby /path_to_project_env/env/bin/scrapyrozwiązać problem.

zamieszki
źródło
Jestem zaskoczony, że to działa, myślałem, że scrapy nie działa z
Pythonem
1
Dzięki, to działało z Pythonem 3.5 i virtualenv. "skrypt", jak powiedział @rioted i ustawiając "katalog roboczy" na project/crawler/crawler, tj. katalog zawierający __init__.py.
efekt
5

pomysł intellij również działa.

utwórz 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====================================================')

pokaż poniżej:

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

LuciferJack
źródło
3

Aby dodać trochę do zaakceptowanej odpowiedzi, po prawie godzinie stwierdziłem, że muszę wybrać poprawną konfigurację Run Configuration z rozwijanej listy (w pobliżu środka paska narzędzi ikony), a następnie kliknąć przycisk Debug, aby uruchomić. Mam nadzieję że to pomoże!

Taylor
źródło
2

Używam również PyCharm, ale nie używam jego wbudowanych funkcji debugowania.

Do debugowania używam ipdb. Skonfigurowałem skrót klawiaturowy do wstawiania import ipdb; ipdb.set_trace()w dowolnym wierszu, w którym chcę, aby pojawił się punkt przerwania.

Następnie mogę wpisać, naby wykonać następną instrukcję, swejść w funkcję, wpisać dowolną nazwę obiektu, aby zobaczyć jego wartość, zmienić środowisko wykonywania, typ, caby kontynuować wykonywanie ...

Jest to bardzo elastyczne, działa w środowiskach innych niż PyCharm, w których nie kontrolujesz środowiska wykonawczego.

Po prostu wpisz swoje wirtualne środowisko pip install ipdbi umieść import ipdb; ipdb.set_trace()w linii, w której chcesz wstrzymać wykonanie.

warvariuc
źródło
2

Zgodnie z dokumentacją 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
źródło
0

Używam tego prostego skryptu:

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()
gangabas
źródło
0

Rozszerzając wersję odpowiedzi @ Rodrigo dodałem ten skrypt i teraz mogę ustawić nazwę pająka z konfiguracji zamiast zmieniać ją w ciągu.

import sys
from scrapy import cmdline

cmdline.execute(f"scrapy crawl {sys.argv[1]}".split())
Muhammad Haseeb
źródło