我正在使用 Python 2.7 开发 Scrapy 0.20。我发现 PyCharm 有一个很好的 Python 调试器。我想用它来测试我的 Scrapy 蜘蛛。请问有人知道怎么做吗?
File->Setting->Project structure->Add content root.
但我不知道我还需要做什么
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
。
像这样:
将断点放在爬行代码中的任何位置,它应该可以工作™。
你只需要这样做。
在项目的crawler文件夹中创建一个Python文件。我用了main.py。
在你的 main.py 中将此代码放在下面。
from scrapy import cmdline
cmdline.execute("scrapy crawl spider".split())
您需要创建一个“运行配置”来运行您的 main.py。
执行此操作时,如果您在代码处放置断点,它将停在那里。
我正在使用 Python 3.5.0 在 virtualenv 中运行 scrapy 并将“script”参数设置为
/path_to_project_env/env/bin/scrapy
为我解决了这个问题。
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====================================================')
如下所示:
要在已接受的答案中添加一些内容,几乎一个小时后,我发现我必须从下拉列表(靠近图标工具栏中心)中选择正确的运行配置,然后单击“调试”按钮才能使其正常工作。希望这有帮助!
根据文档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
我也在使用 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++ 更好。
我使用这个简单的脚本:
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()
扩展@Rodrigo 的答案版本,我添加了此脚本,现在我可以从配置中设置蜘蛛名称,而不是在字符串中进行更改。
import sys
from scrapy import cmdline
cmdline.execute(f"scrapy crawl {sys.argv[1]}".split())
我喜欢在蜘蛛实例时让 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()
. . .