python | 爬虫笔记(五)- 数据存储

5.1 文件存储

先用request把源码获取,再用解析库解析,保存到文本

1- txt

文本打开方式:
file = open('explore.txt', 'a', encoding='utf-8') #a表明以追加的方式写入文本
    file.write('\n'.join([question, author, answer]))
    file.write('\n' + '=' * 50 + '\n')
    file.close()
  r 只读
  rb 二进制只读
  r+ 读写
  rb+ 二进制读写
  w 只用于写入
  wb 二进制写入
  w+ 读写,存在覆盖,不存在新建
  a 追加
  a+ 追加读写

2- Json

JavaScript 对象标记,经过对象和数组的组合来表示数据,构造简洁可是结构化程度很是高,它是一种轻量级的数据交换格式。一切皆对象,经常使用的是对象和数组
 
对象 数据结构为 {key1:value1, key2:value2, ...} 的键值对结构
数组 数据结构为 ["java", "javascript", "vb", ...] 的索引结构

· 一个Json对象javascript

[{
    "name": "Bob",
    "gender": "male",
    "birthday": "1992-10-18"
}, {
     "name": "Selina",
    "gender": "female",
    "birthday": "1995-10-18"
}]
· 读取Json
loads() 方法将 Json 文本字符串转为 Json 对象,能够经过 dumps()方法将 Json 对象转为文本字符串。
data = json.loads(str)
print(data)

读取json文件
with open('data.json', 'r') as file:
str = file.read()
data = json.loads(str)
print(data)
· 输出Json

3- CSV

写入
import csv
with open('data.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
writer.writerow(['id', 'name', 'age'])
    writer.writerows([['10001', 'Mike', 20], ['10002', 'Bob', 22], ['10003', 'Jordan', 21]])

读取html

import pandas as pd df = pd.read_csv('data.csv') print(df)java

5.2 关系型数据库

rdb- 二维表存储;可经过主键外键关联

1- MySQL存储

pymysql
内容包括:链接数据库、建立表、插入数据、删除、查询
 
通常流程:
import pymysql
db = pymysql.connect(host='localhost',user='root', password='123456', port=3306)  #connect()方法声明一个链接对象
cursor = db.cursor() 
sql = ''
try:
    cursor.execute(sql, (id, user, age))
    db.commit()
except:
    db.rollback()  #事务回滚,保证数据一致性
db.close()

关系型数据库属性:python

5.3 非关系型数据库

NoSQL 是基于键值对的,并且不须要通过 SQL 层的解析,数据之间没有耦合性,性能很是高。
细分-
对于爬虫的数据存储来讲,一条数据可能存在某些字段提取失败而缺失的状况,并且数据可能随时调整,另外数据之间能还存在嵌套关系,所以多采用NoSQL。经常使用的是MongoDB和Redis

1- MongoDB 

在 MongoDB 中,每条数据其实都有一个 _id 属性来惟一标识,若是没有显式指明 _id,MongoDB 会自动产生一个 ObjectId 类型的 _id 属性。insert() 方法会在执行后返回的 _id 值。
 

##本系列内容为《python3爬虫开发实战》学习笔记。本系列博客列表以下:mysql

(零)学习路线sql

(一)开发环境配置数据库

(二)爬虫基础json

(三)基本库使用数组

(四)解析库使用数据结构

(五)数据存储

(六)Ajax数据爬取

(七)动态渲染页面爬取Selenium

持续更新...

对应代码请见:..