博客 / 詳情

返回

在 Pycharm 中 debug Scrapy 項目

緣起

為什麼寫這篇文章呢?因為自己想在 Scrapy 項目裏 debug, 看看 Response 有哪些屬性。但是 Scrapy 的官方文檔的 debug 説明只有 VSCode 的,沒有 Pycharm 的(詳見:https://docs.scrapy.org/en/latest/topics/debug.html):

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

當然,如果熟悉 VSCode 的人看到這個配置就明白其實執行方式是:python -m scrapy runspider xxx_spider.py (注:這裏的 xxx_spider.py 指 spider 文件,如官方文檔裏面的 quotes_spider.py)。如果這個人同時還熟悉 Pycharm, 那麼他就知道在 Pycharm 裏面配置進行 debug:

很遺憾,我不是這樣的人,所以就有了這篇文章。

説明

時間:2025/12/06

Pycharm 版本:2025.2.4

Python 版本:3.12.0

Scrapy 版本:2.13.4

Windows 版本:Win 11

main.py

在與 scrapy.cfg 文件同層級的目錄中新建一個名為 main.py 的文件,用於 debug。示例:

# main.py
from scrapy.cmdline import execute


if __name__ == '__main__':
    print(1)
    print(2)
    execute(['scrapy', 'crawl', 'manning'])

項目結構:

TypeError: 'Task' object is not callable

當 Debug'main'時, 出現錯誤:

2025-12-06 10:51:15 [asyncio] ERROR: Exception in callback <Task pending name='Task-1' coro=<ExecutionEngine.open_spider() running at D:\Projects\PythonProjects\python-talk\backend\venv\Lib\site-packages\scrapy\core\engine.py:430> cb=[Deferred.fromFuture.<locals>.adapt() at D:\Projects\PythonProjects\python-talk\backend\venv\Lib\site-packages\twisted\internet\defer.py:1255]>()
handle: <Handle <Task pending name='Task-1' coro=<ExecutionEngine.open_spider() running at D:\Projects\PythonProjects\python-talk\backend\venv\Lib\site-packages\scrapy\core\engine.py:430> cb=[Deferred.fromFuture.<locals>.adapt() at D:\Projects\PythonProjects\python-talk\backend\venv\Lib\site-packages\twisted\internet\defer.py:1255]>()>
Traceback (most recent call last):
  File "D:\Apps\Python3.12\Lib\asyncio\events.py", line 84, in _run
    self._context.run(self._callback, *self._args)
TypeError: 'Task' object is not callable


之所以產生這個問題,不是代碼的問題,是 Pycharm debuger 的問題,我還沒梳理完,故暫不展開,只講怎麼解決。

Debug 方式

方法 1:TWISTED_REACTOR

  1. Settings > Python > Debugger,取消 Gevent compitable 的勾選。

2.在項目的 settings.py 文件裏設置 TWISTED_REACTOR = 'twisted.internet.selectreactor.SelectReactor'

方法 2:python.debug.asyncio.repl

1.Settings > Python > Debugger,取消 Gevent compitable 的勾選(這步和方法 1 是一樣的)。

2.雙擊 Shift 鍵打開搜索窗口。

雙擊 Shift 的意思是“search everywhere,詳見 https://www.jetbrains.com/help/pycharm/searching-everywhere.html”。


3.點擊 ALL 選項,輸入 registry,最後點擊 Regisry 選項。

4.找到 python.debug.asyncio.repl,取消勾選 Value 列的方框。

驗證

如上圖所示,設置後可以 debug。

參考資料

1.Scrapy 文檔, Debugging Spiders: https://docs.scrapy.org/en/latest/topics/debug.html

2.Pycharm 文檔,Search for a target by name:https://www.jetbrains.com/help/pycharm/searching-everywhere.html

歡迎搜索及關注:編程人(a_codists),如有問題請留言。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.