如何使用PyCharm调试Scrapy项目


97

我正在使用Python 2.7开发Scrapy 0.20。我发现PyCharm具有良好的Python调试器。我想使用它测试我的Scrapy蜘蛛。有人知道该怎么做吗?

我尝试过的

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

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

Answers:


171

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运行/调试配置

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


(<类型'exceptions.SyntaxError'>,SyntaxError(“第1行的/Library/python/2.7/site-packages/scrapy/cmdline.pyc文件中的非ASCII字符'\\ xf3',但未声明编码;
Aymon Fournier 2014年

1
很好的解决方案!我还尝试使用主要位于/ usr / bin / scrapy的scrapy二进制本身作为脚本,该脚本具有相同的参数或要调试的任何其他scrapy命令,它运行得非常完美。确保工作目录指向scrapy.cfg所在的scrapy项目根目录。
Nour Wolf

3
@AymonFournier看来您正在尝试运行.pyc文件。而是运行相应的.py文件(scrapy / cmdline.py)。
Artur Gaspar 2015年

4
如果执行此操作,则找不到我的设置模块。 ImportError: No module named settings我检查了工作目录是否为项目目录。它在Django项目中使用。还有其他人偶然发现这个问题吗?
suntoch '16

6
不要忘记进行配置Working directory,否则将出错no active project, Unknown command: crawl, Use "scrapy" to see available commands, Process finished with exit code 2
crifan

106

您只需要这样做。

在项目的搜寻器文件夹上创建一个Python文件。我使用了main.py。

  • 项目
    • 履带式
      • 履带式
        • 蜘蛛网
        • ...
      • main.py
      • scrapy.cfg

在您的main.py内部,将下面的代码。

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

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

这样做,如果在代码上放置断点,它将在此处停止。


1
这是一个很棒的解决方案。
aristotll

1
此方法更有用。
wyx

1
这救了我一命!谢谢!
zsljulius

5
您可能想为不同的蜘蛛配置多个执行,因此接受蜘蛛名称作为运行配置的参数。然后导入sys spider = sys.argv [1] cmdline.execute(“ scrapy crawl {}”。format(spider).split())
miguelfg

2
绝对是最干净,最快的方法,也是将其存储在CVS中的最佳方法。
何塞托马斯腌肠

23

截至2018.1,这变得容易得多。现在Module name,您可以在项目的中进行选择Run/Debug Configuration。将此设置为,scrapy.cmdline并将其设置Working directory为scrapy项目的根目录(其中有一个目录settings.py)。

像这样:

PyCharm Scrapy调试配置

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


8

我正在使用Python 3.5.0在virtualenv中运行scrapy,并设置“ script”参数/path_to_project_env/env/bin/scrapy为我解决了该问题。


我对此工程感到惊讶,我认为scrapy不适用于python 3
user1592380 '16

1
谢谢,这可用于Python 3.5和virtualenv。@rioted说的“脚本”并将“工作目录”设置为project/crawler/crawler,即目录hold __init__.py
effel

5

intellij的想法也可以。

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

显示如下:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明


3

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


2

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

为了调试,我使用ipdb。我设置了键盘快捷键,可以import ipdb; ipdb.set_trace()在希望断点发生的任何行上插入。

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

这非常灵活,可以在PyCharm之外的其他环境中使用,在这些环境中您无法控制执行环境。

只需输入您的虚拟环境,pip install ipdb然后放在import ipdb; ipdb.set_trace()您要暂停执行的行上即可。


2

根据该文件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

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

0

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

import sys
from scrapy import cmdline

cmdline.execute(f"scrapy crawl {sys.argv[1]}".split())
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.