我在使用的項目管道爬取和刮取Scrapy網站並將項目保存到MongoDB。這樣做如何將不同類型的項目保存到不同的集合?像例如PersonItem
類型的項目收集persons
和BookItem
類型的項目收集books
?如果這不可能使用物品管道,你能想到另一個解決方案嗎?根據項目類型在mongodb中使用不同的集合
0
A
回答
0
確定它可能在(子類)MongoDBPipeline
管道中。
以下是未經測試,但一個選項是將self.collection
更改爲集合字典,將項目類型映射到Mongo集合。
class CustomMongoDBPipeleine(MongoDBPipeline):
def __init__(self, settings):
...
mapping = {
PersonItem: 'persons',
BookItem: 'books',
}
self.collection = {}
for itype, collection_name in mapping.items():
self.collection[itype] = database[collection_name]
映射可能來自配置,並且使用項類型類名直接替代項類。
而且使用這樣的:
insert_item(self, item, spider):
...
self.collection.get(type(item)).insert(item, continue_on_error=True)
...
0
您還可以創建兩個不同的管道對每一種類型:在settings.py
class PersonPipeline(object):
def __init__(self):
connection = pymongo.Connection(settings['MONGODB_SERVER'], settings['MONGODB_PORT'])
db = connection[settings['MONGODB_DB']]
self.collection = db[settings['MONGODB_PERSON_COLLECTION']] # use the person collection
def process_item(self, item, spider):
if not isinstance(item,PersonItem):
return item # return the item to let other pipeline to handle it
self.collection.insert(dict(item))
class BookPipeline(object):
def __init__(self):
connection = pymongo.Connection(settings['MONGODB_SERVER'], settings['MONGODB_PORT'])
db = connection[settings['MONGODB_DB']]
self.collection = db[settings['MONGODB_BOOK_COLLECTION']] # use the book collection
def process_item(self, item, spider):
if not isinstance(item,PersonItem):
return item # return the item to let other pipeline to handle it
self.collection.insert(dict(item))
:在pipelines.py
ITEM_PIPELINES = { # declare the handle sequence
'myproject.pipelines.PersonPipeline':100,
'myproject.pipelines.BookPipeline':200,
}
MONGODB_SERVER = "localhost"
MONGODB_PORT = 27017
MONGODB_DB = "MyDB" # db name
MONGODB_PLACE_COLLECTION = "persons" # collection name
MONGODB_LIST_COLLECTION = "books"
當一件物品返回時,PersonPipeline
無線我會先處理它。如果該項目不是PersonItem
類型,則它將返回到下一個管道,在此情況下爲BookPipeline
。
相關問題
- 1. 根據集合中的子類類型從集合中選擇項目
- 2. 比較集合不同項目類型
- 3. 在複合集合中插入不同的項目類型
- 4. LINQ來選擇不同類型的集合中的項目
- 5. MongoDb在集合中選擇不同的對象類型
- 6. $ project MongoDB聚合中的不同項目
- 7. MongoDB - 重複項目集合
- 8. 在mongodb中使用相同的集合擴展回送模型?
- 9. Mongodb不將項目插入集合
- 10. 序列化集合項時使用類型的根名稱
- 11. 在mongodb數據庫中更改集合中字段的類型
- 12. Java:根據子類型訂購集合
- 13. 在VB.Net項目中使用強類型數據集
- 14. MongoDB:從子集合中刪除項目
- 15. Scrapy:如何將不同蜘蛛的項目寫入不同的MongoDB集合?
- 16. 哪個列表/集合類型最適合在WCF數據合同中使用?
- 17. 將新集合項目推送到不同類別的GridView中
- 18. 覆蓋使用不同的返回類型(泛型集合)
- 19. 根據數據類型獲取不同的結果集
- 20. 從mongodb中讀取不同於集合實際類的類
- 21. yii mongodb集合中的不同值
- 22. 在不同項目中使用共享數據集
- 23. 在MongoDB中找不到數據集合
- 24. NodeJS/MongoDB中用於集合的不同數據庫
- 25. 如何根據日期使用不同的日期值集合
- 26. AutoMapper可以根據類型將集合項目複製到特定的集合嗎?
- 27. set_intersection兩種不同類型的集合
- 28. MongoDB中字段的數據類型集合
- 29. PostgreSQL的:計數根據不同的項目在不同的列
- 30. 使用兩個集合類型參數查找項目索引