您的位置:首页 > 数据库 > Mongodb

基于python的scrapy框架中使用MongoDB遇到的问题

2016-12-13 15:22 676 查看

使用MongoDB保存抓取结果,应如何设置settings.py与pipelines.py

1. settings.py

# settings.py

MONGODB_SERVER = 'localhost'
MONGODB_PORT = 27017
MONGODB_DB = 'freebuf_db'
MONGODB_COLLECTION = 'wenzhang'

在settings.py文件的设置中,MONGODB_PORT变量起初的定义是在27017上加了单引号,运行后系统报错,称“MONGODB_PORT must be int”, 所以这里要注意该变量的值为整形,非字符串型。

2. pipelines.py

# pipelines.py

import pymongo

from scrapy.conf import settings
#from scrapy.exceptions import DropItem
#from scrapy import log

class MongoPipeline(object):
def __init__(self):
self.server = settings['MONGODB_SERVER']
self.port = settings['MONGODB_PORT']
self.db = settings['MONGODB_DB']
self.col = settings['MONGODB_COLLECTION']
connection = pymongo.MongoClient(self.server, self.port)
db = connection[self.db]
self.collection = db[self.col]

def process_item(self, item, spider):
self.collection.insert(item)
return item


   在pipelines.py的设置中,原本使用了命令:

connection = pymongo.Connection(self.server, self.port)

系统在该处报错“找不到这个方法”,查询资料过后发现,在新版本中pymongo,已经取消了Connection函数,而使用函数MongoClient(),这里需注意。

3. item报错“缺少_id”定义

以上两个文件设置好,并排除错误后,运行整个爬虫,报错“item中没有定义_id”。这个错误的出现让我有点不知所措,在我的知识储备中,_id是将数据存入mongodb时,mongodb会给每条数据自定义一个唯一的"_id"。所以,我原本认为,“_id”这个属性是不需要自己声明的。但是系统在此处报错,所以我尝试性的在items.py文件中,加入了对“_id”的声明:

_id = scrapy.Field()


再次运行后,抓取成功。至今不明白为什么需要自己对该变量进行声明,如果哪位网友有思路,希望能够对改篇博客进行回复,十分感谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python mongodb