如何使用 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。
项目 爬虫 爬虫 蜘蛛 ... main.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 在 virtualenv 中运行 scrapy,并将“脚本”参数设置为 /path_to_project_env/env/bin/scrapy
为我解决了这个问题。
【讨论】:
我很惊讶这个作品,我认为scrapy不能与python 3一起工作 谢谢,这适用于 Python 3.5 和 virtualenv。正如@rioted 所说的“脚本”并将“工作目录”设置为project/crawler/crawler
,即包含__init__.py
的目录。【参考方案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====================================================')
显示如下:
【讨论】:
【参考方案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 项目的主要内容,如果未能解决你的问题,请参考以下文章