如何使用PyCharm来调试Scrapy项目

Wil*_*aan 90 python debugging scrapy pycharm python-2.7

我正在使用Python 2.7开发Scrapy 0.20.我发现PyCharm有一个很好的Python调试器.我想用它来测试我的Scrapy蜘蛛.有人知道怎么做吗?

我试过了什么

实际上我试图将蜘蛛作为一个脚本运行.结果,我构建了这个脚本.然后,我尝试将我的Scrapy项目添加到PyCharm作为这样的模型:

File->Setting->Project structure->Add content root.
Run Code Online (Sandbox Code Playgroud)

但我不知道还有什么需要做的

Pul*_*lie 160

scrapy命令是一个python脚本,这意味着你可以从PyCharm内部启动它.

当你检查scrapy binary(which scrapy)时,你会注意到这实际上是一个python脚本:

#!/usr/bin/python

from scrapy.cmdline import execute
execute()
Run Code Online (Sandbox Code Playgroud)

这意味着像这样的命令 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命令和spider填充脚本参数.在这种情况下crawl IcecatCrawler.

像这样: PyCharm运行/调试配置

将您的断点放在爬行代码中的任何位置,它应该可以工作.

  • 不要忘记配置`工作目录`,否则将错误`没有活动项目,未知命令:抓取,使用"scrapy"查看可用命令,处理完成退出代码2 (5认同)
  • 如果我这样做,找不到我的设置模块.`ImportError:没有名为settings的模块`我已经检查过工作目录是项目目录.它在Django项目中使用.其他人偶然发现了这个问题? (4认同)
  • @AymonFournier看来你正在尝试运行.pyc文件.改为运行相应的.py文件(scrapy/cmdline.py). (3认同)

小智 98

你只需要这样做.

在项目的crawler文件夹上创建一个Python文件.我用了main.py.

  • 项目
    • 履带
      • 履带
        • 蜘蛛
        • ...
      • main.py
      • scrapy.cfg

你的main.py里面放了这个代码.

from scrapy import cmdline    
cmdline.execute("scrapy crawl spider".split())
Run Code Online (Sandbox Code Playgroud)

你需要创建一个"运行配置"来运行你的main.py.

这样做,如果你在你的代码上放置一个断点,它就会停在那里.

  • 您可能希望为不同的蜘蛛配置多个执行,因此接受蜘蛛名称作为运行配置的参数.然后导入sys spider = sys.argv [1] cmdline.execute("scrapy crawl {}".format(spider).split()) (4认同)
  • 绝对是最干净,最快速的方式,也是将其存储在CVS中的最佳方式. (2认同)

Rut*_*ijf 15

截至2018.1,这变得容易多了.您现在可以Module name在项目中选择Run/Debug Configuration.设置这scrapy.cmdlineWorking directory到scrapy项目(具有的根目录settings.py中的话).

像这样:

PyCharm Scrapy调试配置

现在您可以添加断点来调试代码.


rio*_*ted 8

我在使用Python 3.5.0的virtualenv中运行scrapy并设置"script"参数来/path_to_project_env/env/bin/scrapy解决我的问题.


Luc*_*ack 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====================================================')
Run Code Online (Sandbox Code Playgroud)

显示如下:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明