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

来源:互联网 发布:一直 正在准备 windows 编辑:程序博客网 时间:2024/06/02 07:20

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

1. settings.py

# settings.pyMONGODB_SERVER = 'localhost'MONGODB_PORT = 27017MONGODB_DB = 'freebuf_db'MONGODB_COLLECTION = 'wenzhang'

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

2. pipelines.py

# pipelines.pyimport pymongofrom scrapy.conf import settings#from scrapy.exceptions import DropItem#from scrapy import logclass 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()

再次运行后,抓取成功。至今不明白为什么需要自己对该变量进行声明,如果哪位网友有思路,希望能够对改篇博客进行回复,十分感谢。

0 0
原创粉丝点击