我正在使用Python 2.7开发Scrapy 0.20。我发现PyCharm有一个很好的Python调试器。我想用它来测试我的Scrapy蜘蛛。有人知道怎么做吗?
实际上我试图将蜘蛛作为一个脚本运行。结果,我构建了这个脚本。然后,我尝试将我的Scrapy项目添加到PyCharm作为这样的模型:
File->Setting->Project structure->Add content root.
但我不知道还有什么需要做什么
答案 0 :(得分:152)
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
。
像这样:
将您的断点放在抓取代码中的任何位置,它应该有效。
答案 1 :(得分:93)
你只需要这样做。
在项目的crawler文件夹上创建一个Python文件。我用了main.py。
在main.py中,将此代码放在下面。
from scrapy import cmdline
cmdline.execute("scrapy crawl spider".split())
您需要创建一个“运行配置”来运行main.py。
这样做,如果你在你的代码上设置一个断点,它就会停在那里。
答案 2 :(得分:8)
我在使用Python 3.5.0的virtualenv中运行scrapy并将“script”参数设置为/path_to_project_env/env/bin/scrapy
为我解决了这个问题。
答案 3 :(得分:8)
从2018.1开始,这变得容易得多。现在,您可以在项目的Module name
中选择Run/Debug Configuration
。将此设置为scrapy.cmdline
,并将Working directory
设置为scrapy项目的根目录(其中包含settings.py
的目录)。
像这样:
现在,您可以添加断点来调试代码。
答案 4 :(得分:5)
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====================================================')
显示如下:
答案 5 :(得分:3)
要为接受的答案添加一点,几乎一个小时后,我发现我必须从下拉列表中选择正确的运行配置(靠近图标工具栏的中心),然后单击调试按钮以获取它上班。希望这可以帮助!
答案 6 :(得分:2)
我也在使用PyCharm,但我没有使用它的内置调试功能。
对于调试我正在使用ipdb
。我设置了一个键盘快捷键,可以在我希望断点发生的任何一行上插入import ipdb; ipdb.set_trace()
。
然后我可以键入n
来执行下一个语句,s
来执行函数,键入任何对象名称以查看其值,更改执行环境,键入c
以继续执行...
这非常灵活,适用于PyCharm以外的环境,您无法控制执行环境。
只需输入您的虚拟环境pip install ipdb
,然后将import ipdb; ipdb.set_trace()
放在您希望执行暂停的行上。
答案 7 :(得分:0)
根据文件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 :(得分:0)
我使用以下简单脚本:
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()
答案 9 :(得分:0)
扩展了答案的@Rodrigo版本,我添加了此脚本,现在我可以通过配置设置蜘蛛网名称,而不用更改字符串。
import sys
from scrapy import cmdline
cmdline.execute(f"scrapy crawl {sys.argv[1]}".split())