1. 程式人生 > >python爬蟲#資料儲存#JSON/CSV/MYSQL/MongoDB/

python爬蟲#資料儲存#JSON/CSV/MYSQL/MongoDB/

Json資料處理

JSON支援資料格式:

物件(字典)。使用花括號。
陣列(列表)。使用方括號。
整形、浮點型、布林型別還有null型別。
字串型別(字串必須要用雙引號,不能用單引號)。
多個數據之間使用逗號分開。
注意:json本質上就是一個字串。

字典和列表轉JSON:
import json

books = [
{
'title': '鋼鐵是怎樣練成的',
'price': 9.8
},
{
'title': '紅樓夢',
'price': 9.9
}
]

json_str = json.dumps(books,ensure_ascii=False)
print(json_str)

因為json在dump的時候,只能存放ascii的字元,因此會將中文進行轉義,這時候我們可以使用ensure_ascii=False

關閉這個特性。

在Python中。只有基本資料型別才能轉換成JSON格式的字串。也即:int、float、str、list、dict、tuple。

將json資料直接dump到檔案中:

json模組中除了dumps函式,還有一個dump函式,這個函式可以傳入一個檔案指標,直接將字串dump到檔案中。

books = [
{
'title': '鋼鐵是怎樣練成的',
'price': 9.8
},
{
'title': '紅樓夢',
'price': 9.9
}
]
with open('a.json','w') as fp:
json.dump(books,fp)
將一個json字串load成Python物件:
json_str = '[{"title": "鋼鐵是怎樣練成的", "price": 9.8}, {"title": "紅樓夢", "price": 9.9}]'
books = json.loads(json_str,encoding='utf-8')
print(type(books))
print(books)
直接從檔案中讀取json:
import json
with open('a.json','r',encoding='utf-8') as fp:
json_str = json.load(fp)
print(json_str)

csv檔案處理

讀取csv檔案:
import csv

with open('stock.csv','r') as fp:
reader = csv.reader(fp)
titles = next(reader)
for x in reader:
print(x)

這樣操作,以後獲取資料的時候,就要通過下表來獲取資料。如果想要在獲取資料的時候通過標題來獲取。那麼可以使用DictReader

import csv

with open('stock.csv','r') as fp:
reader = csv.DictReader(fp)
for x in reader:
print(x['turnoverVol'])
寫入資料到csv檔案:

寫入資料到csv檔案,需要建立一個writer物件,主要用到兩個方法。一個是writerow,這個是寫入一行。一個是writerows,這個是寫入多行

import csv

headers = ['name','age','classroom']
values = [
('zhiliao',18,'111'),
('wena',20,'222'),
('bbc',21,'111')
]
with open('test.csv','w',newline='') as fp:
writer = csv.writer(fp)
writer.writerow(headers)
writer.writerows(values)

也可以使用字典的方式把資料寫入進去。這時候就需要使用DictWriter

import csv

headers = ['name','age','classroom']
values = [
{"name":'wenn',"age":20,"classroom":'222'},
{"name":'abc',"age":30,"classroom":'333'}
]
with open('test.csv','w',newline='') as fp:
writer = csv.DictWriter(fp,headers)
writer = csv.writeheader()
writer.writerow({'name':'zhiliao',"age":18,"classroom":'111'})
writer.writerows(values)

MySQL處理資料

安裝驅動程式:

Python要想操作MySQL。必須要有一箇中間件,或者叫做驅動程式。驅動程式有很多。比如有mysqldb、mysqlclient、pymysql等。在這裡,我們選擇用pymysql。安裝方式也是非常簡單,通過命令pip install pymysql即可安裝。

資料庫連線:

資料庫連線之前。首先先確認以下工作完成,這裡我們以一個pymysql_test資料庫.以下將介紹連線mysql的示例程式碼:

import pymysql

db = pymysql.connect(
host="127.0.0.1",
user='root',
password='root',
database='pymysql_test',
port=3306
)
cursor = db.cursor()
cursor.execute("select 1")
data = cursor.fetchone()
print(data)
db.close()
插入資料:
import pymysql

db = pymysql.connect(
host="127.0.0.1",
user='root',
password='root',
database='pymysql_test',
port=3306
)
cursor = db.cursor()
sql = """
insert into user(
id,username,gender,age,password
)
values(null,'abc',1,18,'111111');
"""
cursor.execute(sql)
db.commit()
db.close()

如果在資料還不能保證的情況下,可以使用以下方式來插入資料:

sql = """
insert into user(
id,username,gender,age,password
)
values(null,%s,%s,%s,%s);
"""

cursor.execute(sql,('spider',1,20,'222222'))
查詢資料:

使用pymysql查詢資料。可以使用fetch*方法。

fetchone():這個方法每次之獲取一條資料。
fetchall():這個方法接收全部的返回結果。
fetchmany(size):可以獲取指定條數的資料。

cursor = db.cursor()

sql = """
select * from user
"""

cursor.execute(sql)
while True:
result = cursor.fetchone()
if not result:
break
print(result)
db.close()

或者是直接使用fetchall,一次性可以把所有滿足條件的資料都取出來:

cursor = db.cursor()

sql = """
select * from user
"""

cursor.execute(sql)
results = cursor.fetchall()
for result in results:
print(result)
db.close()

或者是使用fetchmany,指定獲取多少條資料:

cursor = db.cursor()

sql = """
select * from user
"""

cursor.execute(sql)
results = cursor.fetchmany(1)
for result in results:
print(result)
db.close()
刪除資料:
cursor = db.cursor()

sql = """
delete from user where id=1
"""

cursor.execute(sql)
db.commit()
db.close()
更新資料:
conn = pymysql.connect(host='localhost',user='root',password='root',database='pymysql_demo',port=3306)
cursor = conn.cursor()

sql = """
update user set username='aaa' where id=1
"""
cursor.execute(sql)
conn.commit()

conn.close()

MongoDB

將MongoDB製作成windows服務:

啟動mongodb後,如果想讓mongodb一直執行,那麼這個終端便不能關閉,而且每次執行的時候還需要指定data的路徑。因此我們可以將mongodb製作成一個服務,以後就通過一行命令就可以運行了。以下將講解如何製作服務:

建立配置檔案:在mongodb安裝的路徑下建立配置檔案mongod.cfg(路徑和名字不是必須和我這的一樣),然後在配置檔案中新增以下程式碼:

logpath=D:\ProgramApp\mongodb\data\log\mongod.log
dbpath=D:\ProgramApp\mongodb\data\db
logpath是日誌的路徑。dbpath是mongodb資料庫的儲存路徑。
安裝mongodb服務:

使用以下命令即可將mongodb安裝成一個服務:

mongod --config "cfg配置檔案所在路徑" --install

比如:
mongod --config "D:\ProgramApp\mongodb\mongod.cfg" --install
啟動mongodb:net start mongodb。

關閉mongodb: net stop mongodb。

移除mongodb:"D:\ProgramApp\mongodb\bin\mongod.exe" --remove。
MongoDB概念介紹:
SQL術語/概念    MongoDB術語/概念 解釋/說明
database    database    資料庫
table   collection  資料庫表/集合
row document    資料記錄行/文件
column field    資料欄位/域
index   index   索引
joins   joins   表連線,MongoDB不支援
primary key/primary key 主鍵,MongoDB自動將_id欄位設定為主鍵
MongoDB三元素:

三元素:資料庫、集合、文件。

文件(document):就是關係型資料庫中的一行。文件是一個物件,由鍵值對構成,是json的擴充套件形式:
{'name':'abc','gender':'1'}
集合(collection):就是關係型資料庫中的表。可以儲存多個文件,結構可以不固定。如可以儲存如下文件在一個集合中:
{"name":"abc","gender":"1"}
{"name":"xxx","age":18}
{"title":'yyy','price':20.9}

MongoDB基本操作命令:

db:檢視當前的資料庫。

show dbs:檢視所有的資料庫。

use 資料庫名:切換資料庫。如果資料庫不存在,則建立一個。(建立完成後需要插入資料庫才算建立成功)

db.dropDatabase():刪除當前指向的資料庫。

db.集合名.insert(value):新增資料到指定的集合中。

Python操作MongoDB:

安裝pymongo:

要用python操作mongodb,必須下載一個驅動程式,這個驅動程式就是pymongo:

pip install pymongo

連線MongoDB:
import pymongo
# 獲取連線的物件
client = pymongo.MongoClient('127.0.0.1',port=27017)
# 獲取資料庫
db = client.zhihu
# 獲取集合(表)
collection = db.qa
# 插入一條資料到集合中
collection.insert_one({
"username":"abc",
"password":'hello'
})
資料型別:
型別  說明
Object ID   文件ID
String  字串,最常用,必須是有效的UTF-8
Boolean 儲存一個布林值,true或false
Integer 整數可以是32位或64位,這取決於伺服器
Double  儲存浮點值
Arrays  陣列或列表,多個值儲存到一個鍵
Object  用於嵌入式的文件,即一個值為一個文件
Null    儲存Null值
Timestamp   時間戳,表示從1970-1-1到現在的總秒數
Date    儲存當前日期或時間的UNIX時間格式
操作MongoDB:

操作MongoDB的主要方法如下:

insert_one:加入一條文件資料到集合中。示例程式碼如下:
collection.insert_one({
"username":"abc",
"password":'hello'
})
insert_many:加入多條文件資料到集合中。
collection.insert_many([
{
"username":'abc',
'password':'111111'
},
{
"username":'bbb',
'password':'222222'
},
])

find_one:查詢一條文件物件。

result = collection.find_one()
print(result)
# 或者是指定條件
result = collection.find_one({"username":"abc"})
print(result)
update_one:更新一條文件物件。
collection.update_one({"username":"abc"},{"$set":{"username":"aaa"}})
update_many:更新多條文件物件。
collection.update_many({"username":"abc"},{"$set":{"username":"aaa"}})
delete_one:刪除一條文件物件。
collection.delete_one({"username":"abc"})
delete_many:刪除多條文件物件。
collection.delete_one({"username":"abc"})