如何使用 PyCharm 调试 Scrapy 项目

Posted

技术标签:

【中文标题】如何使用 PyCharm 调试 Scrapy 项目【英文标题】:How to use PyCharm to debug Scrapy projects 【发布时间】:2014-03-14 09:06:37 【问题描述】:

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

我尝试过的

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

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

【问题讨论】:

【参考方案1】:

我也在使用 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++ 更好。

【讨论】:

【参考方案2】:

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

像这样:

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

【讨论】:

很好的解决方案!我还尝试使用主要位于/usr/bin/scrapy 中的scrapy 二进制文件作为具有相同参数的脚本或您想要调试的任何其他scrapy 命令,它工作得非常完美。确保工作目录指向scrapy.cfg所在的scrapy项目根目录。 @AymonFournier 看来您正在尝试运行 .pyc 文件。改为运行相应的 .py 文件(scrapy/cmdline.py)。 如果我这样做,则找不到我的设置模块。 ImportError: No module named settings我检查了工作目录是项目目录。它在 Django 项目中使用。还有其他人偶然发现了这个问题吗? 不要忘记配置Working directory,否则会报错no active project, Unknown command: crawl, Use "scrapy" to see available commands, Process finished with exit code 2 它说: from scrapy.http.headers import Headers ImportError: cannot import name 'Headers' from partial initialized module 'scrapy.http.headers' 很可能是由于循环导入 Python38【参考方案3】:

你只需要这样做。

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

项目 爬虫 爬虫 蜘蛛 ... ma​​in.py scrapy.cfg

在你的 main.py 中把这段代码放在下面。

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

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

这样做,如果您在代码处设置断点,它将停在那里。

【讨论】:

这是一个很棒的解决方案。 这个方法比较好用。 这个救了我的命!谢谢! 您可能想为不同的蜘蛛配置多个执行,因此接受蜘蛛名称作为运行配置的参数。然后导入 sys spider = sys.argv[1] cmdline.execute("scrapy crawl ".format(spider).split()) 绝对是最干净、最快捷的方式,也是将其存储在 CVS 中的最佳方式。【参考方案4】:

为了给已接受的答案添加一点内容,差不多一个小时后,我发现我必须从下拉列表中(靠近图标工具栏的中心)选择正确的运行配置,然后单击“调试”按钮才能得到它去工作。希望这可以帮助!

【讨论】:

【参考方案5】:

我正在使用 Python 3.5.0 在 vi​​rtualenv 中运行 scrapy,并将“脚本”参数设置为 /path_to_project_env/env/bin/scrapy 为我解决了这个问题。

【讨论】:

我很惊讶这个作品,我认为scrapy不能与python 3一起工作 谢谢,这适用于 Python 3.5 和 virtualenv。正如@rioted 所说的“脚本”并将“工作目录”设置为project/crawler/crawler,即包含__init__.py 的目录。【参考方案6】:

intellij idea 也可以。

创建ma​​in.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====================================================')

显示如下:

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

从 2018.1 开始,这变得容易多了。您现在可以在项目的Run/Debug Configuration 中选择Module name。将此设置为scrapy.cmdline,并将Working directory 设置为scrapy 项目的根目录(其中包含settings.py)。

像这样:

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

【讨论】:

【参考方案9】:

我使用这个简单的脚本:

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

【讨论】:

我使用了类似于 runner.py 的东西。这很重要的原因是它有意加载项目设置文件。如果您尝试加载管道,则必须这样做。【参考方案10】:

扩展@Rodrigo 的答案版本我添加了这个脚本,现在我可以从配置中设置蜘蛛名称,而不是更改字符串。

import sys
from scrapy import cmdline

cmdline.execute(f"scrapy crawl sys.argv[1]".split())

【讨论】:

以上是关于如何使用 PyCharm 调试 Scrapy 项目的主要内容,如果未能解决你的问题,请参考以下文章

pycharm下打开执行并调试scrapy爬虫程序

pycharm下虚拟环境执行并调试scrapy爬虫程序

Scrapy在PyCharm里面运行,调试

scrapy基础知识之 pycharm 调试小技巧:

使用pycharm运行调试scrapy

使用 PyCharm 运行 scrapy - 调试有效,但运行无效