繁体   English   中英

在 Visual Studio Code 中调试 Scrapy 项目

[英]Debugging Scrapy Project in Visual Studio Code

我在 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

为了执行典型的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"
        }
    ]
}

在任何地方设置断点,然后调试。

  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

像这样配置你的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文件对应的调试会话。

我做到了。 最简单的方法是制作一个运行脚本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

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

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

你也可以试试

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

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

--loglevel=ERROR 是为了获得更简洁的输出;)

我应用了@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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM