自己写了一个爬虫,编写mongo类insert功能时想要加一个判断语句避免爬取数据重复载入数据的情况,但是从实际运行情况来看,并不可行,先请各位看下代码:
class MongoPipeLine():
def __init__(self):
self.client = pymongo.MongoClient(SETTINGS.MONGO_URI,connect=False)
self.db = self.client[SETTINGS.MONGO_DB]
self.collection = SETTINGS.COLLECTION
def insert(self,data):
if self.db[self.collection].find(data) == 1:
print('Data has been existed')
else:
self.db[self.collection].insert(data)
def close(self):
self.client.close()
调度函数:
spider = Spider()
mongo = MongoPipeLine()
image = ImagePipeLine()
def run(i):
for page in range(i,i+20):
response = spider.get_page(page)
data_list = spider.parse(response)
for data in data_list:
mongo.insert(data)
image.download(data)
if __name__ == '__main__':
pool = Pool(20)
pool.map(run,[i*20 for i in range(10)])
pool.close()
pool.join()
mongo.close()
运行结果部分截图):
Isaiah Rustad Already download
Annie Spratt Already download
Alex Kalinin Already download
Jakob Owens Already download
Emily Henry Already download
- 从结果可以看到,尽管有些图片已经下载,对应的词条也保存在MongoDB,但是命令端的输出并没有'Data has been existed'的结果出现,显然判断语句后的操作并没有执行。
- 奇怪的是,我修改判断语句为'if self.db[self.collection].find(data) == 0:'后,输出结果与原来的输出无异,仍然没有'Data has been existed'
- 请教一下各位是否有什么低级错误是我没有考虑到的?
先谢谢大家,祝各位国庆节快乐!
很奇怪,为什么find会范围0或者1呢。不是应该用countDocuments获取数量吗?你把查询到的结果输出看看。
然后你是以什么为查询条件去判断重复的呢?检查一下你的查询条件是不是有问题。
你这个是不是并发的,考虑并发带来的数据不一致了吗?比如某个线程插入A数据,另外一个线程又查询是否有A数据,但实际上第一个线程还没把数据插入成功。