Python 3下MongoDB的存儲操作。
在開始之前,請確保已經安裝好了MongoDB並啓動了其服務,並且安裝好了Python的PyMongo庫。
2. 連接MongoDB
連接MongoDB時,我們需要使用PyMongo庫裏面MongoClient
。一般來說,傳入MongoDB的IP
及端口即可,其中第一個參數爲地址host,第二個參數爲端口port(如果不給它傳遞參數,默認是27017):
import pymongo
client = pymongo.MongoClient(host='localhost', port=27017)
這樣就可以創建MongoDB的連接對象了。
3. 指定數據庫
MongoDB中可以建立多個數據庫,接下來我們需要指定操作哪個數據庫。這裏我們以test數據庫爲例來說明,下一步需要在程序中指定要使用的數據庫:
db = client.test
這裏調用client的test屬性即可返回test數據庫。當然,我們也可以這樣指定:
db = client['test']
4. 指定集合
MongoDB的每個數據庫又包含許多集合(collection),它們類似於關係型數據庫中的表。
下一步需要指定要操作的集合,這裏指定一個集合名稱爲students。與指定數據庫類似,指定集合也有兩種方式:
collection = db.students
collection = db['students']
5. 插入數據
接下來,便可以插入數據了。對於students這個集合,新建一條學生數據,這條數據以字典形式表示:
student = {
'id': '20170101',
'name': 'Jordan',
'age': 20,
'gender': 'male'
}
這裏指定了學生的學號、姓名、年齡和性別。接下來,直接調用collection的insert()
方法即可插入數據,代碼如下:
result = collection.insert(student)
print(result)
在MongoDB中,每條數據其實都有一個_id
屬性來唯一標識。如果沒有顯式指明該屬性,MongoDB會自動產生一個ObjectId
類型的_id
屬性。insert()
方法會在執行後返回_id
值。
也可以同時插入多條數據,只需要以列表形式傳遞即可,示例如下:
student1 = {
'id': '20170101',
'name': 'Jordan',
'age': 20,
'gender': 'male'
}
student2 = {
'id': '20170202',
'name': 'Mike',
'age': 21,
'gender': 'male'
}
result = collection.insert([student1, student2])
print(result)
返回結果是對應的_id
的集合:
在PyMongo 3.x版本中,官方已經不推薦使用insert()
方法了。當然,繼續使用也沒有什麼問題。官方推薦使用insert_one()
和insert_many()
方法來分別插入單條記錄和多條記錄,示例如下:
student = {
'id': '20170101',
'name': 'Jordan',
'age': 20,
'gender': 'male'
}
result = collection.insert_one(student)
print(result)
print(result.inserted_id)
調用其inserted_id
屬性獲取_id
。
對於insert_many()
方法,我們可以將數據以列表形式傳遞,示例如下:
student1 = {
'id': '20170101',
'name': 'Jordan',
'age': 20,
'gender': 'male'
}
student2 = {
'id': '20170202',
'name': 'Mike',
'age': 21,
'gender': 'male'
}
result = collection.insert_many([student1, student2])
print(result)
print(result.inserted_ids)
調用inserted_ids
屬性可以獲取插入數據的_id
列表。
python使用pymongo訪問MongoDB的基本操作,以及CSV文件導出
# coding:utf-8
import pymongo
class MongoDB:
def __init__(self,db,collections):
"""
初始化數據庫
:param db:數據庫名稱
:param collections: 數據庫的集合的名稱
"""
self.client = pymongo.MongoClient('localhost', 27017) #獲取的連接
self.db = self.client[db] #創建數據庫db
self.post = self.db[collections] #創建或者選擇要操作的集合
def update(self, data,upsert):
"""
更新數據庫中的數據,如果upsert爲Ture,那麼當沒有找到指定的數據時就直接插入,反之不執行插入
:param data: 要插入的數據
:param upsert: 判斷是插入還是不插入
:return:
"""
self.post.update({"ip": data}, {'$set': {'ip': data}} , upsert)
def find(self,select):
"""
根據傳入的參數查找指定的值,注意這裏的select是字典
:param select: 指定的查找條件,這裏的是字典類型的,比如{"name":"chenjiabing","age":22}
:return: 返回的是查詢的結果,同樣是字典類型的
"""
return self.post.find(select)
def insert(self,data):
"""
向數據庫中插入指定的數據
:param data: 要插入的數據,這裏的是字典的類型比如:{"name":"chenjiabing","age":22}
:return: 插入成功返回True,反之返回false
"""
try:
self.post.insert(data)
return True
except:
return False
def remove(self,select):
"""
刪除指定條件的記錄
:param select: 指定的條件,這裏是字典類型的,比如{"age":22} 表示刪除age=22的所有數據
:return: 如果刪除成功返回True,else返回False
"""
try:
self.post.remove(select)
return True
except:
return False
# coding:utf-8
import requests
from bs4 import BeautifulSoup
import time
from Queue import Queue
import threading
from Mongo import MongoDB #導入文件
class XICI:
def __init__(self, page):
"""
self.header:請求頭
self.q:存儲ip的隊列
slef.urls:頁面的url
:param page:傳入的參數,表示獲取多少頁的ip
"""
self.header = {"User-Agent": 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0'}
self.q = Queue()
self.urls = []
for i in range(1, page + 1):
self.urls.append("http://www.xicidaili.com/nn/" + str(i))
self.mongo = MongoDB('python','ip') # 創建MogoDB對象
def get_ips(self, url):
"""
根據一頁的請求爬取一個頁面的ip
:param url:傳入的參數,表示每一頁的鏈接
:return: None
"""
try:
res = requests.get(url, headers=self.header)
if res.status_code == 200:
soup = BeautifulSoup(res.text, 'lxml')
ips = soup.find_all('tr')
for i in range(1, len(ips)):
ip = ips[i]
tds = ip.find_all("td")
ip_temp = "http://" + tds[1].contents[0] + ":" + tds[2].contents[0]
print ip_temp
self.q.put(ip_temp) # ip進入隊列
except:
print "-------------------------------------------請求出現異常------------------------------------------------"
def insert(self, url):
"""
驗證出過來的ip,如果成功就直接存入數據庫
:param url: 驗證ip地址的url
:return: 無返回值
"""
while not self.q.empty():
ip = self.q.get()
proxy = {"http": ip}
print proxy
try:
res = requests.get(url, headers=self.header, proxies=proxy, timeout=5)
if res.status_code == 200:
self.mongo.update(ip,True) # 如果成功驗證直接進入數據庫
print "**************************成功存入數據庫********************************************"
else:
print "這個ip地址不能用"
except:
print "--------------------------請求失敗---------------------------------------------"
def main(self):
for url in self.urls:
self.get_ips(url)
threads = []
for i in range(5):
t=threading.Thread(target=self.insert,args=["http://blog.csdn.net/qq_34162294/article/details/72353389"])
threads.append(t)
for t in threads:
t.start()
if __name__ == '__main__':
p = XICI(3)
p.main()