![](/img/trans.png)
[英]How to debug scrapy in pycharm, when scrapy is in a conda virtual environment
[英]How to use PyCharm to debug Scrapy projects
我正在使用 Python 2.7 開發 Scrapy 0.20。 我發現 PyCharm 有一個很好的 Python 調試器。 我想用它來測試我的 Scrapy 蜘蛛。 請問有人知道該怎么做嗎?
File->Setting->Project structure->Add content root.
但我不知道我還需要做什么
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
。
像這樣:
將斷點放在爬行代碼中的任何位置,它應該可以工作™。
你只需要這樣做。
在項目的 crawler 文件夾中創建一個 Python 文件。 我使用了 main.py。
在您的 main.py 中,將此代碼放在下面。
from scrapy import cmdline
cmdline.execute("scrapy crawl spider".split())
你需要創建一個“運行配置”來運行你的 main.py。
這樣做,如果你在你的代碼上放置一個斷點,它就會停在那里。
我正在使用 Python 3.5.0 在 virtualenv 中運行 scrapy 並將“script”參數設置為/path_to_project_env/env/bin/scrapy
為我解決了這個問題。
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====================================================')
顯示如下:
我也在使用 PyCharm,但我沒有使用它的內置調試功能。
為了調試,我使用ipdb
。 我設置了一個鍵盤快捷鍵來插入import ipdb; ipdb.set_trace()
import ipdb; ipdb.set_trace()
在我希望斷點發生的任何行上。
然后我可以輸入n
執行下一條語句, s
進入一個函數,輸入任何對象名稱以查看其值,更改執行環境,輸入c
繼續執行...
這非常靈活,適用於 PyCharm 以外的環境,您無法控制執行環境。
只需在您的虛擬環境中輸入pip install ipdb
並放置import ipdb; ipdb.set_trace()
import ipdb; ipdb.set_trace()
在您希望暫停執行的行上。
更新
您也可以pip install pdbpp
並使用標准import pdb; pdb.set_trace
import pdb; pdb.set_trace
而不是ipdb
。 PDB++ 在我看來更好。
為了給接受的答案添加一點,將近一個小時后,我發現我必須從下拉列表(靠近圖標工具欄的中心)中選擇正確的運行配置,然后單擊調試按鈕以使其工作。 希望這可以幫助!
根據文檔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
我使用這個簡單的腳本:
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()
擴展@Rodrigo 版本的答案,我添加了這個腳本,現在我可以從配置中設置蜘蛛名稱,而不是在字符串中進行更改。
import sys
from scrapy import cmdline
cmdline.execute(f"scrapy crawl {sys.argv[1]}".split())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.