scrapy提供了多种将数据保存的方式,例如json,csv
#scrapy.exporters.py
__all__ = ['BaseItemExporter', 'PprintItemExporter', 'PickleItemExporter',
'CsvItemExporter', 'XmlItemExporter', 'JsonLinesItemExporter',
'JsonItemExporter', 'MarshalItemExporter']
......
JSON
以下是使用json保存数据的代码
# pipelines.py
from scrapy.exporters import JsonItemExporter
class JsonExporterPipeline(object):
#调用scrapy提供的json export到处json文件
def __init__(self):
self.file = open('article.json','wb')
self.exporter = JsonItemExporter(self.file,encoding="utf-8",ensure_ascii=False)
self.exporter.start_exporting()
def process_item(self,item,spider):
self.exporter.export_item(item=item)
return item
def close_spider(self,spider):
self.exporter.finish_exporting()
self.file.close()
补充:关于json的知识点
首先明确一点:json本质上就是字符串
- python对象->json使用
json.dumps(python对象)
- json->python对象使用
json.loads(json字符串)
- json字符串中的值必须用双引号,见下例
在python中。只有基本的数据类型才能转换成json格式的字符串,也即:int
,float
,str
,list
,tuple
,dict
将python对象dumps成json字符串
import json
pesron = [{'user':'zs','age':10},
{'user': 'ls', 'age':20}]
json_str = json.dumps(pesron)
print(type(json_str))
print(json_str)
输出
<class 'str'>
[{"user": "zs", "age": 10}, {"user": "ls", "age": 20}]
使用json.dump
的时候,只能存放ascii的字符,因此会将中文进行转义,这时候我们可以做使用ensure_ascii=False
关闭这个特性。
将json字符串loads成python对象
import json
#json_str = "[{'user':'zs','age':10},{'user': 'ls', 'age':20}]" 错误,必须用双引号
json_str = """[{"user":"zs","age":10},{"user": "ls", "age":20}]"""
person = json.loads(json_str)
print(type(person))
print(person)
输出
<class 'list'>
[{'user': 'zs', 'age': 10}, {'user': 'ls', 'age': 20}]
MySQL
python要操作MySQL,必须要有一个中间件,或者叫做驱动程序。常用的是mysqlclient和pymysql。在这里我们选择pymysql,安装非常简单,通过命令
pip install pymysql
数据库的连接
数据库连接之前,首先要创建库以及表,同时不要忘记打开MySQL服务,确保3306端口在监听
import pymysql
conn = pymysql.connect(
host='127.0.0.1',
user='root',
password='123456',
database='test',
port=3306
)
cursor = conn .cursor()
cursor.execute('select * from dept_emp')
result = cursor.fetchall()
conn.close()
print(result )
插入数据
import pymysql
conn = pymysql.connect(
host='127.0.0.1',
user='root',
password='123456',
database='test',
port=3306
)
cursor = conn.cursor()
sql = """
insert into user(id,username,age) values(null,%s,%s)
"""
cursor.execute(sql,('zs',20))
conn.commit()
conn.close()
查找数据
使用pymysql查询数据,可以使用fetch*
方法
-
fetchone()
:每次只获取一条数据 -
fetchall()
:获取全部的返回结果 -
etchsize(size)
:可以获取指定的数据
import pymysql
conn = pymysql.connect(
host='127.0.0.1',
user='root',
password='123456',
database='test',
port=3306
)
cursor = conn.cursor()
cursor.execute('select * from dept_emp')
results = cursor.fetchall()
for result in results:
print(result)
conn.close()
删除/更新数据
.......
cursor = conn.cursor()
sql = """
delete from user where id=1
"""
cursor.execute(sql)
conn.commit()
conn.close()
MomgoDB数据库
MongoDB是一个基于分布式文件存储的NoSQL数据库。在处理海量数据的时候比MySQL更有优势。爬虫如果上了一个量级,可能就会比较推荐使用MongoDB,当然没有上量的数据完全可以使用MongoDB来存储数据。
MongoDB的安装
下载:https://www.mongodb.com/download-center?jmp=nav#community
具体安装过程略
MongoDB概念介绍
SQL术语 | MongoDB术语 | 解释 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库/集合 |
row | document | 数据记录行/文档 |
column | field | 字段 |
index | index | 索引 |
primary key | primary key | 主键,MongoDB自动将_id设置为主键 |
MongoDB三元素:
三元素:数据库,集合,文档
1.集合(collection):就是关系型数据库中的表。可以存储多个文档,结构可以不固定。如存储下面文档在一个集合中
{'name':'abc','gender':'1'}
{'name':'xxx','age':18}
{'title':'yyy','price':20.9}
2.文档(document):就是关系型数据库中的一行。文档是一个对象,有键值构成,是json的扩展形式
{'name':'abc','gender':'1'}
MongoDB基本操作命令:
1.db
:查看当前的数据库
2.show dbs
:查看所有的数据库
3.use 数据库名
:切换数据库。如果数据库不存在,则创建一个
4.db.dropDatabase()
:删除当前指向的数据库
5.db.集合名.insert(value)
:添加数据到指定的集合中
6.db.集合名.find()
:从指定的集合中查找数据
Python操作MongoDB
安装pymongo
pip install pymongo
数据类型:
类型 | 说明 |
---|---|
ObjectID | 文档ID |
String | 字符串,最常用,必须是有效的UTF-8 |
Boolean | true或false |
Integer | 整数 |
Double | 浮点数 |
Arrays | 数组 |
Object | 用于嵌入式文档,即一个值为一个对象 |
Null | Null值 |
Timestamp | 时间戳 |
Data | 日期 |
1.连接数据库
import pymongo
client = pymongo.MongoClient('127.0.0.1',port=27017)
# 获取数据库(如果没有这个数据库也没关系)
db = client.liang
# 获取数据库中的集合,也就是mysql中的表
collection = db.qa
# 写入数据
collection.insert({'username':"aaa"})
2.find_one:查找一条文档
result = collection.find_one()
print(result)
# 或者指定条件
result = collection.find_one({'username':"aaa"})
print(result)
# 查找所有
result = collection.find()
for i in result:
print(i)
输出
{'_id': ObjectId('5b21ea9fb70e101a881f4840'), 'username': 'aaa'
3.update:更新文档
collection.update({"username":"abc"},{"username":"xxx"})
4.delete_one:删除文档
collection.delete({"username":"abc"}) #删除abc的第一条文档
collection.delete({"username":"abc"}) # 删除abc的所有文档
网友评论