【问题标题】:Debugging Scrapy Project in Visual Studio Code在 Visual Studio Code 中调试 Scrapy 项目
【发布时间】:2018-08-18 12:09:34
【问题描述】:

我在 Windows 机器上安装了 Visual Studio Code,我正在其上制作新的 Scrapy Crawler。爬虫工作正常,但我想调试代码,为此我将其添加到我的 launch.json 文件中:

{
    "name": "Scrapy with Integrated Terminal/Console",
    "type": "python",
    "request": "launch",
    "stopOnEntry": true,
    "pythonPath": "${config:python.pythonPath}",
    "program": "C:/Users/neo/.virtualenvs/Gers-Crawler-77pVkqzP/Scripts/scrapy.exe",
    "cwd": "${workspaceRoot}",
    "args": [
        "crawl",
        "amazon",
        "-o",
        "amazon.json"
    ],
    "console": "integratedTerminal",
    "env": {},
    "envFile": "${workspaceRoot}/.env",
    "debugOptions": [
        "RedirectOutput"
    ]
}

但我无法达到任何断点。 PS:我从这里获取了 JSON 脚本:http://www.stevetrefethen.com/blog/debugging-a-python-scrapy-project-in-vscode

【问题讨论】:

标签: python python-3.x visual-studio scrapy visual-studio-code


【解决方案1】:

为了执行典型的scrapy runspider <PYTHON_FILE> 命令,您必须在launch.json 中设置以下配置:

{
    "version": "0.1.0",
    "configurations": [
        {
            "name": "Python: Launch Scrapy Spider",
            "type": "python",
            "request": "launch",
            "module": "scrapy",
            "args": [
                "runspider",
                "${file}"
            ],
            "console": "integratedTerminal"
        }
    ]
}

在任意位置设置断点,然后进行调试。

【讨论】:

  • 这应该是公认的答案。在工作项目的launch.json 中添加特定于scrapy 的配置是一种很好的做法,易于实现并且不需要创建额外的脚本。
【解决方案2】:
  1. 在您的 scrapy 项目文件夹中创建一个 runner.py 模块,其中包含以下内容:

    import os
    from scrapy.cmdline import execute
    
    os.chdir(os.path.dirname(os.path.realpath(__file__)))
    
    try:
        execute(
            [
                'scrapy',
                'crawl',
                'SPIDER NAME',
                '-o',
                'out.json',
            ]
        )
    except SystemExit:
        pass
    
  2. 在要调试的行中放置断点

  3. 使用 vscode 调试器运行runner.py

【讨论】:

    【解决方案3】:

    像这样配置您的json 文件:

    "version": "0.2.0",
    "configurations": [
        {
            "name": "Crawl with scrapy",
            "type": "python",
            "request": "launch",
            "module": "scrapy",
            "cwd": "${fileDirname}",
            "args": [
                "crawl",
                "<SPIDER NAME>"
            ],
            "console": "internalConsole"
        }
    ]
    

    单击 VSCode 中与您的蜘蛛相对应的选项卡,然后启动与 json 文件相对应的调试会话。

    【讨论】:

    • 这是最新的答案,因为它使用了最新的 scrapy crawl 命令。
    【解决方案4】:

    我做到了。最简单的方法是制作一个运行脚本runner.py

    import scrapy
    from scrapy.crawler import CrawlerProcess
    
    from g4gscraper.spiders.g4gcrawler import G4GSpider
    
    process = CrawlerProcess({
        'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
        'FEED_FORMAT': 'json',
        'FEED_URI': 'data.json'
    })
    
    process.crawl(G4GSpider)
    process.start() # the script will block here until the crawling is finished
    

    然后我在蜘蛛中添加断点,同时我在这个文件上启动调试器。 参考:https://doc.scrapy.org/en/latest/topics/practices.html

    【讨论】:

      【解决方案5】:

      不需要修改launch.json,默认的“Python: Current File (Integrated Terminal)”就可以完美运行。对于 Python3 项目,请记住将 runner.py 文件与 scrapy.cfg 文件(即项目根目录)放在同一级别。

      上面的@naqushab 的runner.py 代码。注意 processs.crawl(className),其中 className 是您要设置的蜘蛛类断点在。

      【讨论】:

        【解决方案6】:

        你也可以试试

        {
          "configurations": [
            {
                "name": "Python: Scrapy",
                "type": "python",
                "request": "launch",
                "module": "scrapy",
                "cwd": "${fileDirname}",
                "args": [
                    "crawl",
                    "${fileBasenameNoExtension}",
                    "--loglevel=ERROR"
                ],
                "console": "integratedTerminal",
                "justMyCode": false
            }
          ]
        }
        

        但该字段的名称应与蜘蛛名称相同。

        --loglevel=ERROR 是为了让输出不那么冗长;)

        【讨论】:

          【解决方案7】:

          我应用了@fmango 的代码并对其进行了改进。

          1. 不要编写单独的运行器文件,只需将这些代码行粘贴到蜘蛛的末尾即可。

          2. 运行 python 调试器。就是这样

          if __name__ == '__main__':
              import os
              from scrapy.cmdline import execute
          
              os.chdir(os.path.dirname(os.path.realpath(__file__)))
          
              SPIDER_NAME = MySpider.name
              try:
                  execute(
                      [
                          'scrapy',
                          'crawl',
                          SPIDER_NAME,
                          '-s',
                          'FEED_EXPORT_ENCODING=utf-8',
                      ]
                  )
              except SystemExit:
                  pass
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-24
            • 2022-12-17
            • 1970-01-01
            相关资源
            最近更新 更多