如何從項目管道訪問settings.py中的scrapy設置。文檔中提到可以通過擴展中的爬網程序訪問它,但我不知道如何在管道中訪問爬網程序。如何從項目管道訪問scrapy設置
回答
好了,所以在http://doc.scrapy.org/en/latest/topics/extensions.html的文件說,
The main entry point for a Scrapy extension (this also includes middlewares and pipelines) is the from_crawler class method which receives a Crawler instance which is the main object controlling the Scrapy crawler. Through that object you can access settings, signals, stats, and also control the crawler behaviour, if your extension needs to such thing.
,那麼你可以有一個函數來獲取設置。
@classmethod
def from_crawler(cls, crawler):
settings = crawler.settings
my_setting = settings.get("MY_SETTING")
return cls(my_setting)
履帶式引擎,然後用my_setting
調用管道的初始化函數,就像這樣:
def __init__(self, my_setting):
self.my_setting = my_setting
等功能都與self.my_setting
訪問它,符合市場預期。
或者,在from_crawler()
功能,您可以在crawler.settings
對象從管道需要的,而不是拉他們全部在構造函數中傳遞給__init__()
,然後訪問設置。
從your_spider.py
中訪問Scrapy設置(在settings.py
中定義)的方法很簡單。所有其他答案太複雜了。造成這種情況的原因是Scrapy文檔的維護非常差,加上近期更新&更改。在「設置」文檔「How to access settings」和"Settings API"中都沒有提供任何可行的例子。以下是一個示例,說明如何獲取當前的字符串。
以下行只需添加到your_spider.py
:
# To get your settings from (settings.py):
from scrapy.utils.project import get_project_settings
...
class YourSpider(BaseSpider):
...
def parse(self, response):
...
settings = get_project_settings()
print "Your USER_AGENT is:\n%s" % (settings.get('USER_AGENT'))
...
正如你所看到的,就沒有必要使用@classmethod
或重新定義from_crawler()
或__init__()
功能。希望這可以幫助。
PS。我仍然不確定爲什麼使用from scrapy.settings import Settings
不能以相同的方式工作,因爲它會是更明顯的導入選擇?
儘管文檔建議使用@avaleske的方法,但我仍然更喜歡這種方式,因爲它的工作原理和理解速度更快。 –
此方法**未識別[從命令行覆蓋的設置](http://doc.scrapy.org/zh-CN/0.24/topics/settings.html#command-line-options)。如果您需要此功能,請使用@ avaleske的答案。 –
正確的答案是:它取決於您想要訪問設置的管道中的哪個位置。
avaleske已經回答了,就好像您想要訪問管道process_item
方法之外的設置,但很可能這是您要設置的位置,因此在Spider實例本身傳入時有更簡單的方法作爲論據。
class PipelineX(object):
def process_item(self, item, spider):
wanted_setting = spider.settings.get('WANTED_SETTING')
很棒的回答。對於我的項目,將邏輯放入'open_spider'方法更有意義,因爲我只在第一次加載蜘蛛時使用該值。 –
項目結構是非常平坦的,爲什麼不:
# pipeline.py
from myproject import settings
- 1. 如何從管道訪問scrapy統計
- 2. scrapy管道類的訪問實例
- 3. 我們如何在scrapy中使用管道項目
- 4. 如何調試scrapy管道?
- 5. 如何訪問JUnit測試計數詹金斯管道項目
- 6. scrapy如何從scrapy項目中獲得項目名稱
- 7. 如何管理項目上的Sitecore安全訪問權限設置(配置)?
- 8. 從Jenkinsfile管道訪問JIRA
- 9. 如何設置GstPlayer管道?
- 10. Scrapy:如何從設置文件設置scrapy start_urls?
- 11. 不能設置一個Scrapy項目
- 12. Scrapy:設置管道 - 如果URL不包含
- 13. 如何設置scrapy
- 14. 項目設置代碼訪問全部
- 15. Scrapy CrawlSpider:如何訪問不同級別的解析項目
- 16. Scrapy管道解析
- 17. Scrapy:通過管道
- 18. 如何在Scrapy項目中設置自定義標誌?
- 19. 如何設置Scrapy項目的RotatingFileHandler(或最大尺寸)
- 20. scrapy:訪問管道中的spider類變量__init__
- 21. SCRAPY - 如何創建一個帶有Scarpy項目時設置項目創建
- 22. 如何使用scrapy-redis管道?
- 23. Scrapy,Python:一個管道中的多個項目類?
- 24. Scrapy管道錯誤 - 列出項目的使用情況
- 25. scrapy單蜘蛛通過多個項目類到管道
- 26. scrapy爬蟲將多個項目類傳遞給管道
- 27. 禁止Scrapy項目在管道後打印在日誌中
- 28. 如何從escript訪問項目的Mixfile?
- 29. 如何從Android的Recyclerview訪問項目?
- 30. 如何訪問Scrapy物品管道中的所有刮取物品?
的聲音非常複雜。沒有更簡單的方法來做到這一點,或者更好的解釋?你不能使用'scrapy.settings import Settings'嗎? – not2qubit
@ user1147688我會使用這種方法,因爲它符合scrapy的基於依賴注入的內部API。你的建議可能會奏效,但它看起來並沒有任何保證,它將來會繼續,因爲內部的API可能會被移動。 – deceze
@avaleske,這個作品很棒,但是你知道我們如何使用它來設置一個設置嗎?例如,在其他一些功能中,假設我想更改其中一個設置值,例如'download_delay'。我們能做到嗎? – thefoxrocks