PyCharmを使用してScrapyプロジェクトをデバッグする方法


97

私はScrapy 0.20とPython 2.7で作業しています。PyCharmには優れたPythonデバッガーがあることがわかりました。Scrapyクモを使ってテストしたい。誰でもそれを行う方法を知っていますか?

私が試したこと

実際、私はクモをスクリプトとして実行しようとしました。その結果、そのスクリプトを作成しました。次に、Scrapyプロジェクトを次のようなモデルとしてPyCharmに追加しようとしました。
File->Setting->Project structure->Add content root.

しかし、私は他に何をしなければならないのか分かりません

回答:


170

scrapyコマンドを使用すると、内部PyCharmからそれを起動することができることを意味Pythonスクリプトです。

スクレイピーバイナリ(which scrapy)を調べると、これが実際にはpythonスクリプトであることがわかります。

#!/usr/bin/python

from scrapy.cmdline import execute
execute()

つまり、次のようなコマンド scrapy crawl IcecatCrawlerも実行できます。python /Library/Python/2.7/site-packages/scrapy/cmdline.py crawl IcecatCrawler

scrapy.cmdlineパッケージを見つけてみてください。私の場合、場所はここにありました:/Library/Python/2.7/site-packages/scrapy/cmdline.py

スクリプトとしてスクリプトを使用して、PyCharm内で実行/デバッグ構成を作成します。スクリプトパラメーターに、scrapyコマンドとスパイダーを入力します。この場合crawl IcecatCrawler

このような: PyCharm実行/デバッグ構成

クロールコードの任意の場所にブレークポイントを置くと、動作します™。


(<type 'exceptions.SyntaxError'>、SyntaxError( "Non-ASCII character '\\ xf3' in file /Library/python/2.7/site-packages/scrapy/cmdline.pyc in line 1 but not encoding encoding;
エイモンフルニエ

1
素晴らしい解決策!私はまた、ほとんどが/ usr / bin / scrapyにあるスクレイピーバイナリ自体を、同じパラメーターを使用するスクリプトまたはデバッグしたい他のスクレイピーコマンドとして使用してみましたが、それは完璧に機能しました。作業ディレクトリが、scrapy.cfgが配置されているscrapyプロジェクトのルートを指していることを確認してください。
Nour Wolf

3
@AymonFournier .pycファイルを実行しようとしているようです。代わりに、対応する.pyファイルを実行します(scrapy / cmdline.py)。
Artur Gaspar

4
それを行っている場合、設定モジュールが見つかりません。 ImportError: No module named settings作業ディレクトリがプロジェクトディレクトリであることを確認しました。Djangoプロジェクト内で使用されます。他の誰かがこの問題に遭遇しましたか?
2016年

6
設定することを忘れないでくださいWorking directory。そうしないとエラーになりますno active project, Unknown command: crawl, Use "scrapy" to see available commands, Process finished with exit code 2
crifan

104

これを行うだけです。

プロジェクトのクローラーフォルダーにPythonファイルを作成します。main.pyを使用しました。

  • 事業
    • 昇降補助具
      • 昇降補助具
        • クモ
        • ...
      • main.py
      • scrapy.cfg

main.py内にこのコードを下に配置します。

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

また、main.pyを実行するには、「実行構成」を作成する必要があります。

これを行うと、コードにブレークポイントを設定すると、そこで停止します。


1
これは素晴らしいソリューションです。
aristotll 2016年

1
この方法はより便利です。
wyx 2016年

1
これは私の命を救います!ありがとう!
zsljulius 2017

5
異なるスパイダーに対して複数の実行を構成する場合があるため、実行構成の引数としてスパイダー名を受け入れます。次に、sys spider = sys.argv [1] cmdline.execute( "scrapy crawl {}"。format(spider).split())を
インポートします

2
間違いなく最もクリーンで最速の方法であり、CVSに保存する最良の方法でもあります。
ホセ・トマスTocino

23

2018.1以降、これは非常に簡単になりました。Module nameプロジェクトので選択できるようになりましたRun/Debug Configuration。これをscrapy.cmdlineとに設定してWorking directory、スクレイピープロジェクトのルートディレクトリ(その中にあるプロジェクトsettings.py)に設定します。

そのようです:

PyCharm Scrapyデバッグ構成

これで、ブレークポイントを追加してコードをデバッグできます。


8

Python 3.5.0を使用してvirtualenvでスクレイピーを実行し、「スクリプト」パラメーターを設定し/path_to_project_env/env/bin/scrapyて問題を解決しました。


私はこの作品に
驚いた、scrapy

1
おかげで、これはPython 3.5とvirtualenvで動作しました。@riotedが言った "script"は "working directory"をproject/crawler/crawler、つまりを保持するディレクトリに設定し__init__.pyます。
16

5

intellijのアイデアも機能します。

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

以下に示します。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください


3

受け入れられた回答に少し追加するには、ほぼ1時間後に、ドロップダウンリスト(アイコンツールバーの中央近く)から正しい実行構成を選択し、それを機能させるために[デバッグ]ボタンをクリックする必要があることがわかりました。お役に立てれば!


2

PyCharmも使用していますが、組み込みのデバッグ機能は使用していません。

デバッグにはを使用していipdbます。import ipdb; ipdb.set_trace()ブレークポイントを発生させたい行に挿入するキーボードショートカットを設定しました。

次にn、入力して次のステートメントを実行sし、関数をステップインし、オブジェクト名を入力してその値を確認し、実行環境を変更し、入力cして実行を続行します...

これは非常に柔軟で、実行環境を制御しないPyCharm以外の環境で機能します。

仮想環境pip install ipdbを入力してimport ipdb; ipdb.set_trace()、実行を一時停止する行に配置します。


2

ドキュメントによると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

私はこの簡単なスクリプトを使用します:

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のバージョンを拡張して、このスクリプトを追加しました。文字列を変更する代わりに、構成からスパイダー名を設定できます。

import sys
from scrapy import cmdline

cmdline.execute(f"scrapy crawl {sys.argv[1]}".split())
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.