LogoLogo
  • README
  • 前端编程
    • 01 Node JS
    • 02-ES6详解
    • 03-NPM详解
    • 04-Babel详解
    • 05-前端模块化开发
    • 06-WebPack详解
    • 07-Vue详解
    • 08-Git详解
    • 09-微信小程序
  • 人工智能
    • 机器学习
      • 二次分配问题
      • 非负矩阵
      • 概率潜在语义分析
      • 概率图模型
      • 集成学习
      • 降维
      • 距离度量
      • 决策树
      • 逻辑回归
      • 马尔可夫决策过程
      • 马尔可夫链蒙特卡洛法
      • 朴素贝叶斯法
      • 谱聚类
      • 奇异值分解
      • 潜在狄利克雷分配
      • 潜在语义分析
      • 强化学习
      • 社区算法
      • 时间序列模型
      • 特征工程
      • 条件随机场
      • 图论基础
      • 线性分类
      • 线性回归
      • 信息论中的熵
      • 隐马尔科夫模型
      • 支持向量机
      • 主成分分析
      • EM算法
      • Hermite 矩阵的特征值不等式
      • k-means聚类
      • k近邻法
      • PageRank算法
    • 深度学习
      • Pytorch篇
        • 01-线性模型
        • 02-梯度下降法
        • 03-反向传播
        • 04-pytorch入门
        • 05-用pytorch实现线性回归
        • 06-logistic回归
        • 07-处理多维特征的输入
        • 08-加载数据集
        • 09-多分类问题
        • 10-卷积神经网络
        • 11-循环神经网络
    • 图神经网络
      • 图神经网络笔记01
        • 01-图(Graphs)的结构
        • 02-网络的性质和随机图模型
        • 03-网络工具
        • 04-网络中的主题和结构角色
        • 05-网络中的社区结构
      • 图神经网络笔记02
        • 01-深度学习引言
        • 02-神经网络基础
        • 03-卷积神经网络
        • 04-图信号处理与图卷积神经网络
        • 05-GNN的变体与框架-
        • [06-Google PPRGo 两分钟分类千万节点的最快GNN](人工智能/图神经网络/图神经网络笔记02/06-Google%20PPRGo 两分钟分类千万节点的最快GNN.md)
        • 07-序列模型
        • 08-变分自编码器
        • 09-对抗生成网络
  • 日常记录
    • 健身日记
    • 面经记录
    • 自动生成Summary文件
  • 实战项目
    • 谷粒商城
      • 00-项目概述
      • 01-分布式基础-全栈开发篇
      • 02-分布式高级-微服务架构篇
      • 03-高可用集群-架构师提升篇
  • 数据库
    • MySQL笔记
      • 01-MySQL基础篇
      • 02-MySQL架构篇
      • 03-MySQL索引及调优篇
      • 04-MySQL事务篇
      • 05-MySQL日志与备份篇
    • Redis笔记
      • 01-Redis基础篇
      • 02-Redis高级篇
    • 02-Redis篇
  • 算法笔记
    • 01-算法基础篇
    • 02-算法刷题篇
  • 职能扩展
    • 产品运营篇
  • Go编程
    • 01-Go基础
      • 01-Go基础篇
  • Java编程
    • 01-Java基础
      • 01-Java基础篇
      • 02-多线程篇
      • 03-注射与反解篇
      • 04-JUC并发编程篇
      • 05-JUC并发编程与源码分析
      • 06-JVM原理篇
      • 07-Netty原理篇
      • 08-设计模式篇
    • 02 Java Web
      • 01-Mybatis篇
      • 01-Mybatis篇(新版)
      • 02-Spring篇
      • 02-Spring篇(新版)
      • 03-SpringMVC篇
      • 04-MybatisPlus篇
    • 03-Java微服务
      • 01-SpringBoot篇
      • 01-SpringBoot篇(新版)
      • 02-SpringSecurity篇
      • 03-Shiro篇
      • 04-Swagger篇
      • 05-Zookeeper篇
      • 06-Dubbo篇
      • 07-SpringCloud篇
      • 08-SpringAlibaba篇
      • 09-SpringCloud篇(新版)
    • 04-Java中间件
      • 数据库篇
        • 01-分库分表概述
        • 02-MyCat篇
        • 03-MyCat2篇
        • 04-Sharding-jdbc篇
        • 05-ElasticSearch篇
      • 消息中间件篇
        • 01-MQ概述
        • 02-RabbitMQ篇
        • 03-Kafka篇
        • 04-RocketMQ篇
        • 05-Pulsar篇
    • 05-扩展篇
      • Dubbo篇
      • SpringBoot篇
      • SpringCloud篇
    • 06-第三方技术
      • 01-CDN技术篇
      • 02-POI技术篇
      • 03-第三方支付技术篇
      • 04-第三方登录技术篇
      • 05-第三方短信接入篇
      • 06-视频点播技术篇
      • 07-视频直播技术篇
    • 07-云原生
      • 01-Docker篇
      • 02-Kubernetes篇
      • 03-Kubesphere篇
  • Linux运维
    • 01-Linux篇
    • 02-Nginx篇
  • Python编程
    • 01-Python基础
      • 01.配置环境
      • 02.流程控制
      • 03.数值
      • 04.操作符
      • 05.列表
      • 06.元祖
      • 07.集合
      • 08.字典
      • 09.复制
      • 10.字符串
      • 11.函数
      • 12.常见内置函数
      • 13.变量
      • 14.异常和语法错误
      • 15.时间和日期
      • 16.正则表达式
    • 02 Python Web
      • flask篇
        • 01.前言
        • 02.路由
        • 03.模板
        • 04.视图进阶
        • 05.flask-sqlalchemy
        • 06.表单WTForms
        • 07.session与cookie
        • 08.上下文
        • 09.钩子函数
        • 10.flask 信号
        • 11.RESTFUL
        • 13.flask-mail
        • 14.flask+celery
        • 15.部署
        • 16.flask-login
        • 17.flask-cache
        • 18.flask-babel
        • 19.flask-dashed
        • 20.flask-pjax
        • 21.flask上传文件到第三方
        • 22.flask-restless
        • 23.flask-redis
        • 24.flask-flash
        • 25.消息通知
        • 26.分页
    • 03-Python数据分析
      • Matplotlib
      • Numpy
      • Pandas
      • Seaborn
    • 04-Python爬虫
      • 1.准备工作
      • 2.请求模块的使用
      • 3.解析模块的使用
      • 4.数据存储
      • 5.识别验证码
      • 6.爬取APP
      • 7.爬虫框架
      • 8.分布式爬虫
由 GitBook 提供支持
在本页
  • 文本存储
  • TXT 文件存储
  • JSON文件存储
  • CSV文件存储
  • 数据库
  • 关系数据库
  • 非关系数据库
  • ORM模型

这有帮助吗?

在GitHub上编辑
  1. Python编程
  2. 04-Python爬虫

4.数据存储

利用爬虫爬取数据之后,进行存储。可用以下几种方式进行存储。

文本存储

TXT 文件存储

实例

利用open()方法打开一个文本文件,并获取一个文件操作的对象

import requests
from pyquery import PyQuery as pq

url = "https://www.zhihu.com/explore"
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
response = requests.get(url,headers=headers)
content = response.text
# pq解析
doc = pq(content)
items = doc('.explore-tab .feed-item').items()
for item in items:
    question = item('.question_link').text()
    author = item('.avatar-link').text()
    answer = pq(item.find('.content').html()).text()
    with open('explore.txt','a',encoding='utf-8') as f:
        f.write('\n'.join([question,author,answer]))
        f.write('\n'+'='*50+'\n')

打开方式

r:以只读方式打开文件
rb:以二进制格式打开文件用于只读
r+:以读写方式打开
rb+:以二进制方式打开并读写文件
w:以只写方式打开文件,如果文件已存在则会被覆盖,不存在则会新建一个文件
w+:以读写方式打开文件,如果文件已存在则会被覆盖,不存在则会新建一个文件
wb+:以二进制方式打开并读写文件,如果文件已存在则会被覆盖,不存在则会新建一个文件
a:打开文件向文本追加新内容,如果文件已存在则会被覆盖,不存在则会新建一个文件
a+:以二进制方式打开文件向文本追加新内容,如果文件已存在则会被覆盖,不存在则会新建一个文件

写法

有两种打开文件的方法

    with open('explore.txt','a',encoding='utf-8') as f:
        f.write('\n'.join([question,author,answer]))
        f.write('\n'+'='*50+'\n')

文件会自动关闭,不需要再去调用close()方法

另一种需要调用close()方法,关闭打开的文件

    f = open('explore.txt','a',encoding='utf-8')
    f.write('\n'.join([question,author,answer]))
    f.write('\n'+'='*50+'\n')
    f.close()

JSON文件存储

说明

Json,全称为JavaScript Object Notation,即JavaScript对象标记。

json格式:

[{
    "name": "Bob",
    "gender": "male",
    "birthday": "1992-10-18"
}, {
     "name": "Selina",
    "gender": "female",
    "birthday": "1995-10-18"
}]

取Json

通过json库实现对json文件的读写操作,调用json库的loads()方法将Json文本字符串转为Json对象,可以通过dumps()方法将Json对象转为文本字符串

import json

content = """
            [{
                "name": "Bob",
                "gender": "male",
                "birthday": "1992-10-18"
            }, {
                "name": "Selina",
                "gender": "female",
                "birthday": "1995-10-18"
            }]
        """
print(type(content))
content = json.loads(content)
print(type(content))
print(content)

运行结果:

<class 'str'>
<class 'dict'>
[{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': '1995-10-18'}]

注意: Json 的数据需要用双引号来包围,不能使用单引号,不然会抛出如下错误

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 3 column 5 (char 8)

从json文本中读取内容

import json

with open('test.json','r') as f:
    content = f.read()
    content = json.loads(content)
    print(content)

运行结果:

[{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': '1995-10-18'}]

输出json

利用dumps()方法将json对象转化为字符串,然后使用write()方法写入文本中

import json

content = [{
        'name': 'Bob',
        'gender': 'male',
        'birthday': '1992-10-18'
}]
with open('test2.json','w') as f:
    f.write(json.dumps(content))

如果json中包含中文字符,为了保证输出正文,需要指定一个参数ensure_ascii=False,另外还需要指定文件输出的编码

import json

content = [{
        'name': '天使',
        'gender': '女',
        'birthday': '1992-10-18'
}]
with open('test2.json','w',encoding='utf-8') as f:
    f.write(json.dumps(content,ensure_ascii=False,indent=2))

CSV文件存储

说明

CSV,全称叫做Comma-Separated Values,即逗号分隔符或字符分隔符

写入

通过open()方法写入并创建一个csv文件,调用csv库的writer()方法初始化一个写入对象,传入该语柄,然后调用writerow()方法传入每行的数据即可完成写入

import csv

with open('data.csv', 'w',newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['id', 'name'])
    writer.writerow(['10001', '米库'])

注意:如果不带newline=‘’,会发现也能写入结果,但是每行内容之间总是会多出一个空行

如果想修改列与列之间的分隔符可以传入delimiter参数

import csv

with open('data.csv', 'w',newline='') as csvfile:
    writer = csv.writer(csvfile,delimiter='0')
    writer.writerow(['id', 'name'])
    writer.writerow(['10001', '米库'])

默认的分隔符逗号(,)会被换成delimeter参数设置的分隔符

可以同时传入多行,需要使用witerrows()方法

注意:是writerrows而不是writerow

import csv

with open('data.csv', 'w',newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['id', 'name'])
    writer.writerows([['10001', '米库'],['10001', '米库'],['10001', '米库']])

以字典的形式写入csv文件

import csv

with open('data.csv', 'w',newline='') as csvfile:
    # 预先定义字段
    fieldnames = ['id','name']
    # 初始化一个字典写入对象
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    # 调用writeheader()方法先写入头信息
    writer.writeheader()
    # 调用writerow传入相应字典
    writer.writerow({'id':1,"name":"angle"})

追加csv文本内容

注意这里就不同调用writeheader()方法,不然会将头部信息一并写入

import csv

with open('data.csv', 'a',newline='') as csvfile:
    # 预先定义字段
    fieldnames = ['id','name']
    # 初始化一个字典写入对象
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    # 调用writerow传入相应字典
    writer.writerow({'id':1,"name":"angle"})

若将中文写入csv文件中,需要指定编码格式

import csv

with open('data.csv', 'a',newline='',encoding='utf-8') as csvfile:
    # 预先定义字段
    fieldnames = ['id','name']
    # 初始化一个字典写入对象
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    # 调用writerow传入相应字典
    writer.writerow({'id':1,"name":"angle"})

利用pandas库写入csv文件

注意,字典的键值对中值的类型是列表形式

import pandas as pd

data = {
    'name':["angle"],
    "age":[18],
}
print(data)
df = pd.DataFrame(data)
# print(df)
df.to_csv('csv1.csv')

读取

import csv

with open('data.csv','r',encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    for content in reader:
        print(content)

运行结果:

['id', 'name']
['1', 'angle']
['id', 'name']
['1', 'angle']
['id', 'name']

利用pandas中read_csv()方法将数据从csv中读取出来

import csv
with open('data.csv', 'w',newline='',encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['id', 'name'])
    writer.writerows([['10001', '米库'],['10001', '米库'],['10001', '米库']])


# 用pandas读取csv文本内容,需要写入csv文本后时指定编码格式utf-8

import pandas as pd

print(pd.read_csv('data.csv'))

运行结果:

      id name
0  10001   米库
1  10001   米库
2  10001   米库

数据库

关系数据库

非关系数据库

ORM模型

上一页3.解析模块的使用下一页5.识别验证码

最后更新于3年前

这有帮助吗?

Mysql
MongoDB
Redis
SQLAlchemy