爬蟲資料使用MongDB儲存時自動過濾重複資料

2022-06-11 22:06:14 字數 3270 閱讀 1646

本文**自以下**: 爬蟲斷了?一招搞定 mongodb 重複資料

需要學習的地方:

mongdb資料庫的初步使用

import pymongo

client = pymongo.mongoclient('localhost', 27017) # 鏈結

db = client.douban # 資料庫

mongo_collection = db.douban # 資料庫中的資料表

def write_to_mongodb(self, data):

for item in data:

if mongo_collection.update_one(item, , upsert=true):

# if mongo_collection.insert_one(item):

print('儲存成功')

else:

print('儲存失敗')

mongodb 避免插入重複資料。

摘要:盡量使用 update_one() 方法而不是 insert_one() 插入資料。

相信你一定有過這樣的經歷:大晚上好不容易寫好乙個爬蟲,新增了種種可能出現的異常處理,測試了很多遍都沒有問題,點選了 run 開始正式執行 ,然後美滋滋地準備鑽被窩睡覺,睡前還特意檢查了下確認沒有問題,合上眼後期待著第二天起來,資料都乖乖地躺在 mongodb 中。第二天早上一睜眼就滿心歡喜地衝到電腦前,結果發現爬蟲半夜斷了,你氣得想要砸電腦,然後你看了一下 mongodb 中爬了一半的資料,在想是刪掉重新爬,還是保留下來接著爬。

到這兒問題就來了,刪掉太可惜,接著爬很可能會爬到重複資料,雖然後期可以去重,但你有強迫症,就是不想爬到重複資料,怎麼辦呢?

這就遇到了「爬蟲斷點續傳」問題,關於這個問題的解決方法有很多種,不過本文主要介紹資料儲存到 mongodb 時如何做到只插入新資料,而重複資料自動過濾不插入。

先來個簡單例子,比如現在有兩個 list ,data2 中的第一條資料和 data 列表中的第一條資料是重複的,我們想將這兩個 list 依次插入 mnogodb 中去, 通常我們會使用 insert_one() 或者 insert_many() 方法插入,這裡我們使用 insert_one() 插入,看一下效果。

data = [,,

,]data2 = [,,

]import pymongo

client = pymongo.mongoclient('localhost',27017)

db = client.douban

mongo_collection = db.douban

for i in data:

mongo_collection.insert_one(i)

插入第乙個 list :

插入第二個 list :

你會發現,重複的資料 a 被插入進去了,那麼怎麼只插入 d,而不插入 a 呢,這裡就要用到 update_one() 方法了,改寫一下插入方法:

for i in data2:

mongo_collection.update_one(i,,upsert=true)

這裡用到了$set運算子,該運算子作用是將字段的值替換為指定的值,upsert 為 true 表示插入。這裡也可以用 update() 方法,但是這個方法比較老了,不建議使用。另外嘗試使用 update_many() 方法發現不能更新多個相同的值。

for i in data2:

mongo_collection.update(i, i, upsert=true)

下面舉乙個豆瓣電影 top250 的例項,假設我們先獲取 10 個電影的資訊,然後再獲取前 20 個電影,分別用 insert_one() 和 update_one() 方法對比一下結果。

insert_one() 方法會重複爬取 前 10 個電影的資料:

update_one() 方法則只會插入新的 10 個電影的資料:

這就很好了對吧,所以當我們去爬那些需要分頁的**,最好在爬取之前使用 update_one() 方法,這樣就算爬蟲中斷了,也不用擔心會爬取重複資料。

**實現如下:

import requests

import json

import csv

import pandas as pd

from urllib.parse import urlencode

import pymongo

client = pymongo.mongoclient('localhost', 27017)

db = client.douban

mongo_collection = db.douban

class douban(object):

def __init__(self):

self.url = ''

def get_content(self, start_page):

params =

response = requests.get(self.url, params=params).json()

movies = response['subjects']

data = [ for item in movies]

self.write_to_mongodb(data)

def get_actor(self, actors):

actor = [i['name'] for i in actors]

return actor

def write_to_mongodb(self, data):

for item in data:

if mongo_collection.update_one(item, , upsert=true):

# if mongo_collection.insert_one(item):

print('儲存成功')

else:

print('儲存失敗')

def get_douban(self, total_movie):

# 每頁10條,start_page迴圈1次

for start_page in range(0, total_movie, 10):

self.get_content(start_page)

if __name__ == '__main__':

douban = douban()

douban.get_douban(10)

爬蟲資料儲存csv

一,csv檔案的簡單讀寫import csv csv也叫逗號分分隔,一般以逗號分隔,也可以使用空格或者tab分隔 csv file open file test.csv w 寫入 try csv write csv.writer csv file csv write.writerow col1 co...

scrapy 爬蟲儲存資料

scrapy儲存資訊的最簡單的方法主要有四種,o 輸出指定格式的檔案,命令如下 json格式,預設為unicode編碼 scrapy crawl itcast o teachers.json json lines格式,預設為unicode編碼 scrapy crawl itcast o teache...

python爬蟲資料儲存JSON儲存

encoding utf 8 import re import requests import json from requests.exceptions import requestexception def get open page url try 請求頭 headers 使用localhos...