Scrapy projelerinde hata ayıklamak için PyCharm nasıl kullanılır?


100

Python 2.7 ile Scrapy 0.20 üzerinde çalışıyorum. PyCharm'ın iyi bir Python hata ayıklayıcısına sahip olduğunu buldum. Scrapy örümceklerimi bunu kullanarak test etmek istiyorum. Bunu nasıl yapacağını bilen var mı lütfen?

Ne denedim

Aslında örümceği bir senaryo olarak çalıştırmayı denedim. Sonuç olarak, o senaryoyu ben oluşturdum. Daha sonra Scrapy projemi PyCharm'a şöyle bir model olarak eklemeye çalıştım:
File->Setting->Project structure->Add content root.

Ama başka ne yapmam gerektiğini bilmiyorum

Yanıtlar:


172

scrapyKomut içinizde pycharm dan başlatabilirsiniz anlamına gelen bir piton komut dosyasıdır.

Scrapy binary'yi ( which scrapy) incelediğinizde, bunun aslında bir python betiği olduğunu fark edeceksiniz:

#!/usr/bin/python

from scrapy.cmdline import execute
execute()

Bu, aşağıdaki gibi bir komutun scrapy crawl IcecatCrawlerda çalıştırılabileceği anlamına gelir :python /Library/Python/2.7/site-packages/scrapy/cmdline.py crawl IcecatCrawler

Scrapy.cmdline paketini bulmaya çalışın. Benim durumumda konum buradaydı:/Library/Python/2.7/site-packages/scrapy/cmdline.py

PyCharm içinde bu komut dosyasıyla bir çalıştırma / hata ayıklama yapılandırması oluşturun. Komut dosyası parametrelerini scrapy komutu ve örümcek ile doldurun. Bu durumda crawl IcecatCrawler.

Bunun gibi: PyCharm Çalıştır / Hata Ayıklama Yapılandırması

Kesme noktalarınızı tarama kodunuzun herhangi bir yerine koyun ve ™ çalışmalıdır.


(<'exceptions.SyntaxError' yazın>, SyntaxError (1. satırda /Library/python/2.7/site-packages/scrapy/cmdline.pyc dosyasında "ASCII olmayan '\\ xf3' karakteri var, ancak kodlama bildirilmemiş;
Aymon Fournier

1
Harika çözüm! Aynı parametrelere sahip betik olarak çoğunlukla / usr / bin / scrapy konumunda bulunan hurda ikilinin kendisini veya hata ayıklamak istediğiniz diğer hurda komutlarını kullanmayı da denedim ve mükemmel çalıştı. çalışma dizininin scrapy.cfg'nin bulunduğu hurda proje köküne işaret ettiğinden emin olun.
Nour Wolf

3
@AymonFournier Görünüşe göre bir .pyc dosyası çalıştırmaya çalışıyorsunuz. Bunun yerine ilgili .py dosyasını çalıştırın (scrapy / cmdline.py).
Artur Gaspar

4
Bunu yaparsam, ayarlar modülüm bulunmaz. ImportError: No module named settingsÇalışma dizininin proje dizini olduğunu kontrol ettim. Bir Django projesinde kullanılır. Bu problemle karşılaşan başka kimse var mı?
2016

6
Yapılandırmayı unutmayın Working directory, aksi takdirde hata olurno active project, Unknown command: crawl, Use "scrapy" to see available commands, Process finished with exit code 2
crifan

108

Sadece bunu yapmalısın.

Projenizdeki tarayıcı klasöründe bir Python dosyası oluşturun. Main.py'yi kullandım.

  • Proje
    • Paletli
      • Paletli
        • Örümcekler
        • ...
      • main.py
      • scrapy.cfg

Main.py dosyanızın içine bu kodu girin.

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

Ve main.py dosyanızı çalıştırmak için bir "Çalıştırma Yapılandırması" oluşturmanız gerekir.

Bunu yaptığınızda, kodunuza bir kesme noktası koyarsanız orada duracaktır.


1
Bu harika bir çözüm.
aristotll

1
Bu yöntem daha kullanışlıdır.
wyx

1
Bu benim hayatımı kurtarıyor! Teşekkürler!
zsljulius

6
Farklı örümcekler için birden çok çalıştırma yapılandırmak isteyebilirsiniz, bu nedenle örümcek adını çalıştırma yapılandırmanızın bir argümanı olarak kabul edin. Ardından sys spider = sys.argv [1] cmdline.execute ("scrapy crawl {}". Format (spider) .split ())
miguelfg

2
Kesinlikle bunu yapmanın en temiz ve en hızlı yolu, aynı zamanda CVS'nizde saklamanın en iyi yolu.
José Tomás Tocino

26

2018.1 itibariyle bu çok daha kolay hale geldi. Artık Module nameprojelerinizde seçim yapabilirsiniz Run/Debug Configuration. Bu şekilde ayarlayın scrapy.cmdlineve Working directoryscrapy projesi (biri kök dizinine settings.pyiçinde).

Şöyle:

PyCharm Scrapy hata ayıklama yapılandırması

Artık kodunuzda hata ayıklamak için kesme noktaları ekleyebilirsiniz.


8

Python 3.5.0 ile bir virtualenv'de scrapy çalıştırıyorum /path_to_project_env/env/bin/scrapyve sorunu benim için çözmek için "script" parametresini ayarlıyorum .


Bunun işe yaramasına şaşırdım,
scrapy'nin

1
Teşekkürler, bu Python 3.5 ve virtualenv ile çalıştı. @rioted'in söylediği gibi "komut dosyası" ve "çalışma dizini" olarak project/crawler/crawler, yani dizini tutuyor __init__.py.
effel

5

intellij fikri de işe yarıyor.

main.py oluştur :

#!/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====================================================')

aşağıda göster:

görüntü açıklamasını buraya girin

görüntü açıklamasını buraya girin

görüntü açıklamasını buraya girin


3

Kabul edilen yanıta biraz eklemek için, neredeyse bir saat sonra, açılır listeden (simge araç çubuğunun ortasına yakın) doğru Çalıştırma Yapılandırmasını seçmem ve ardından çalışmasını sağlamak için Hata Ayıkla düğmesine tıklamam gerekti. Bu yardımcı olur umarım!


2

Ayrıca PyCharm kullanıyorum, ancak yerleşik hata ayıklama özelliklerini kullanmıyorum.

Hata ayıklama için kullanıyorum ipdb. import ipdb; ipdb.set_trace()Kesme noktasının olmasını istediğim herhangi bir satıra eklemek için bir klavye kısayolu ayarladım .

Sonra bir nsonraki ifadeyi yürütmek için yazabilirim s, bir işleve adım atabilir , değerini görmek için herhangi bir nesne adını yazabilir, yürütme ortamını değiştirebilir, yürütmeye cdevam etmek için yazabilirim ...

Bu çok esnektir, yürütme ortamını kontrol etmediğiniz PyCharm dışındaki ortamlarda çalışır.

Sadece sanal ortamınızı yazın pip install ipdbve import ipdb; ipdb.set_trace()yürütmenin duraklamasını istediğiniz bir satıra yerleştirin.


2

Belgelere göre 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

Bu basit komut dosyasını kullanıyorum:

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

@ Rodrigo'nun cevabın sürümünü genişletmek Bu komut dosyasını ekledim ve şimdi dizeyi değiştirmek yerine yapılandırmadan örümcek adını ayarlayabilirim.

import sys
from scrapy import cmdline

cmdline.execute(f"scrapy crawl {sys.argv[1]}".split())
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.