如何使用PyCharm调试Scrapy项目

问题描述 投票:0回答:12

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

我已经尝试过了

实际上我尝试将蜘蛛作为脚本运行。结果,我构建了该脚本。然后,我尝试将我的 Scrapy 项目作为模型添加到 PyCharm 中,如下所示:
File->Setting->Project structure->Add content root.

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

python debugging python-2.7 scrapy pycharm
12个回答
206
投票

scrapy
命令是一个Python脚本,这意味着您可以从PyCharm内部启动它。

当您检查 scrapy 二进制文件 (

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命令和spider填充脚本参数。在这种情况下

crawl IcecatCrawler

像这样: PyCharm Run/Debug Configuration

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


124
投票

你只需要这样做。

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

  • 项目
    • 爬行器
      • 爬行器
        • 蜘蛛
        • ...
      • main.py
      • scrapy.cfg

在你的 main.py 中将此代码放在下面。

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

您需要创建一个“运行配置”来运行您的 main.py。

执行此操作时,如果您在代码处放置断点,它将停在那里。


50
投票

从 2018.1 开始,这变得容易多了。您现在可以在项目的

Module name
中选择
Run/Debug Configuration
。将其设置为
scrapy.cmdline
并将
Working directory
设置为 scrapy 项目的根目录(其中带有
settings.py
的目录)。

像这样:

PyCharm Scrapy debug configuration

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


12
投票

我正在使用 Python 3.5.0 在 virtualenv 中运行 scrapy 并将“script”参数设置为

/path_to_project_env/env/bin/scrapy
为我解决了这个问题。


6
投票

intellij idea也可以工作。

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

如下所示:

enter image description here

enter image description here

enter image description here


3
投票

要在已接受的答案中添加一些内容,几乎一个小时后,我发现我必须从下拉列表(靠近图标工具栏中心)中选择正确的运行配置,然后单击“调试”按钮才能使其正常工作。希望这有帮助!


3
投票

根据文档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

3
投票

我也在使用 PyCharm,但我没有使用其内置的调试功能。

为了调试,我使用

ipdb
。我设置了一个键盘快捷键,在我希望断点发生的任何行上插入
import ipdb; ipdb.set_trace()

然后我可以输入

n
执行下一条语句,
s
进入函数,输入任何对象名称以查看其值,更改执行环境,输入
c
继续执行...

这非常灵活,可以在 PyCharm 以外的环境中工作,在这些环境中您无法控制执行环境。

只需输入您的虚拟环境

pip install ipdb
并将
import ipdb; ipdb.set_trace()
放在您想要暂停执行的行上。

更新

您还可以

pip install pdbpp
并使用标准
import pdb; pdb.set_trace
代替
ipdb
。我认为 PDB++ 更好。


3
投票

可能有点晚了,但也许对某人有帮助:

从最新的 PyCharm 版本开始,它实际上非常简单,您可以直接调用 Scrapy - 请参阅运行时配置的附图(Scrapy 教程)。

使用 PyCharm 2022.1.4 进行测试。

enter image description here


2
投票

我使用这个简单的脚本:

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())

0
投票

我喜欢在蜘蛛实例时让 python 脚本基于 PYTHON_DEBUG 环境变量调用 pdb:

. . .
# include imports 
import pdb
import traceback
. . .
# include an __init__ that attaches to pdb if SCRAPY_DEBUG is defined 
class SourceDataSpider(scrapy.Spider):
. . .
    def __init__(self):
        self.debug = 0
        self.date = os.getenv("DATE")
        if os.getenv("SCRAPY_DEBUG") and int(os.getenv("SCRAPY_DEBUG")):
            self.debug = int(os.getenv("SCRAPY_DEBUG"))
            pdb.set_trace()
. . .
© www.soinside.com 2019 - 2024. All rights reserved.