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

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

我尝试过的

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

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

【问题讨论】:

    标签: python debugging python-2.7 scrapy pycharm


    【解决方案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())
              

              【讨论】:

                猜你喜欢
                • 2019-03-22
                • 1970-01-01
                • 2019-08-30
                • 2013-02-16
                • 2018-08-18
                • 2017-09-03
                • 1970-01-01
                • 1970-01-01
                • 2017-07-19
                相关资源
                最近更新 更多