scrapy爬取数据保存csv、mysql、mongodb、json
目录
前言
Items
Pipelines
前言
用Scrapy进行数据的保存进行一个常用的方法进行解析
Items
item 是我们保存数据的容器,其类似于 python 中的字典。使用 item 的好处在于: Item 提供了额外保护机制来避免拼写错误导致的未定义字段错误。且看栗子:
import scrapy
class Doubantop250Item(scrapy.Item):
title = scrapy.Field() # 电影名字
star = scrapy.Field() # 电影评分
quote = scrapy.Field() # 脍炙人口的一句话
movieInfo = scrapy.Field() # 电影的描述信息,包括导演、主演、电影类型
Pipelines
pipelines.py 一般我们用于保存数据,其方法的一些介绍如下图。下面,我会分多种方式来保存我们的数据,避免你耍流氓。
保存到 Json
import json
class JsonPipeline(object):
file_name = base_dir + '/doubanTop250/data.json' # json 文件路径
def process_item(self, item, spider):
file = open(self.file_name, 'r', encoding='utf-8')
load_data = json.load(file)
load_data.append({"title": item["title"].strip()}) # 追加数据
file = open(self.file_name, 'w', encoding='utf-8')
json.dump(load_data, file, ensure_ascii=False) # 保存数据
file.close()
return item
保存到 CSV
def appendDta2Csv(self, file_name, new_headers, new_data):
with open(file_name,'r') as f:
f_csv = csv.reader(f)
try:# 如何有源文件没有 headers ,将调用传进来的 headers
headers = next(f_csv)
except:
headers = new_headers
old_data = list(f_csv)
old_data.append(new_data) # 追加新的数据
with open(file_name, 'w') as f2:# 保存数据
f_csv = csv.writer(f2)
f_csv.writerow(headers)
f_csv.writerows(old_data)
f2.close()
f.close() def process_item(self, item, spider):
self.appendDta2Csv(self.file_name, ["title"], [item["title"].strip()])
return item
保存到 MongoDB
from pymongo import MongoClient
import os
base_dir = os.getcwd()
class MongoPipeline(object):
# 实现保存到mongo数据库的类,
collection = 'douban' # mongo 数据库的 collection 名字 def __init__(self, mongo_uri, db_name, db_user, db_pass):
self.mongo_uri = mongo_uri
self.db_name = db_name
self.db_user = db_user
self.db_pass = db_pass @classmethod
def from_crawler(cls, crawler):
# scrapy 为我们访问settings提供了这样的一个方法,这里,
# 我们需要从 settings.py 文件中,取得数据库的URI和数据库名称
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
db_name=crawler.settings.get('DB_NAME'),
db_user=crawler.settings.get('DB_USER'),
db_pass=crawler.settings.get('DB_PASS')) def open_spider(self, spider): # 爬虫启动时调用,连接到数据库
self.client = MongoClient(self.mongo_uri)
self.zfdb = self.client[self.db_name]
self.zfdb.authenticate(self.db_user, self.db_pass) def close_spider(self, spider): # 爬虫关闭时调用,关闭数据库连接
self.client.close() def process_item(self, item, spider):
self.zfdb[self.collection].insert({"title": item["title"].strip()})
return item
保存到 MySQL
from sqlalchemy import create_engine, Column, Integer, String, BIGINT, ForeignKey, UniqueConstraint, Index, and_, \
or_, inspect
from sqlalchemy.orm import sessionmaker, relationship, contains_eager
class MysqlPipeline(object):
MYSQL_URI = 'mysql+pymysql://username:password@localhost:3306/db_name'
# echo 为 True 将会输出 SQL 原生语句
engine = create_engine(MYSQL_URI, echo=True)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base() # 创建单表
class Movie(Base):
__tablename__ = 'movies'
id = Column(BIGINT, primary_key=True, autoincrement=True)
title = Column(String(200))
# 初始化数据库
def init_db(self):
self.Base.metadata.create_all(self.engine)
# 删除数据库
def drop_db(self):
self.Base.metadata.drop_all(self.engine)
def open_spider(self, spider): # 爬虫启动时调用,连接到数据库
self.init_db()
Session = sessionmaker(bind=self.engine)
self.session = Session()
def process_item(self, item, spider):
new_movie = self.Movie(title=item["title"].strip())
self.session.add(new_movie)
self.session.commit()
return item
在写好相关的 pipeline 之后,需要在 settings.py 中启用相关的 pipeline,后面的数字为调用的优先级,数字是0-1000,你可以自定义。你可以所有格式都保存,也可以注释掉其他,值保留一个。
ITEM_PIPELINES = {
'doubanTop250.pipelines.MongoPipeline': 300,
'doubanTop250.pipelines.MysqlPipeline': 301,
'doubanTop250.pipelines.CsvPipeline': 302,
'doubanTop250.pipelines.JsonPipeline': 303,
}
scrapy爬取数据保存csv、mysql、mongodb、json的更多相关文章
- python之scrapy爬取数据保存到mysql数据库
1.创建工程 scrapy startproject tencent 2.创建项目 scrapy genspider mahuateng 3.既然保存到数据库,自然要安装pymsql pip inst ...
- Python使用Scrapy框架爬取数据存入CSV文件(Python爬虫实战4)
1. Scrapy框架 Scrapy是python下实现爬虫功能的框架,能够将数据解析.数据处理.数据存储合为一体功能的爬虫框架. 2. Scrapy安装 1. 安装依赖包 yum install g ...
- 如何提升scrapy爬取数据的效率
在配置文件中修改相关参数: 增加并发 默认的scrapy开启的并发线程为32个,可以适当的进行增加,再配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100. ...
- scrapy爬取海量数据并保存在MongoDB和MySQL数据库中
前言 一般我们都会将数据爬取下来保存在临时文件或者控制台直接输出,但对于超大规模数据的快速读写,高并发场景的访问,用数据库管理无疑是不二之选.首先简单描述一下MySQL和MongoDB的区别:MySQ ...
- scrapy爬取数据的基本流程及url地址拼接
说明:初学者,整理后方便能及时完善,冗余之处请多提建议,感谢! 了解内容: Scrapy :抓取数据的爬虫框架 异步与非阻塞的区别 异步:指的是整个过程,中间如果是非阻塞的,那就是异步 ...
- 42.scrapy爬取数据入库mongodb
scrapy爬虫采集数据存入mongodb采集效果如图: 1.首先开启服务切换到mongodb的bin目录下 命令:mongod --dbpath e:\data\db 另开黑窗口 命令:mongo. ...
- 实现多线程爬取数据并保存到mongodb
多线程爬取二手房网页并将数据保存到mongodb的代码: import pymongo import threading import time from lxml import etree impo ...
- 将scrapy爬取数据通过django入到SQLite数据库
1. 在django项目根目录位置创建scrapy项目,django_12是django项目,ABCkg是scrapy爬虫项目,app1是django的子应用 2.在Scrapy的settings.p ...
- Python+Scrapy+Crawlspider 爬取数据且存入MySQL数据库
1.Scrapy使用流程 1-1.使用Terminal终端创建工程,输入指令:scrapy startproject ProName 1-2.进入工程目录:cd ProName 1-3.创建爬虫文件( ...
随机推荐
- 洛谷P2617 Dynamic Rankings
带修主席树模板题 主席树的单点修改就是把前缀和(大概)的形式改成用树状数组维护,每个树状数组的元素都套了一个主席树(相当于每个数组的元素root[i]都是主席树,且这个主席树维护了(i - lowbi ...
- 【BZOJ4007】[JLOI2015]战争调度(动态规划)
[BZOJ4007][JLOI2015]战争调度(动态规划) 题面 BZOJ 洛谷 题解 神仙题,我是做不来. 一个想法是设\(f[i][j]\)表示当前考虑到\(i\)节点,其子树内有\(j\)个人 ...
- 深入理解JVM(6)——Java内存模型和线程
Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果(“即Ja ...
- LOJ#2087 国王饮水记
解:这个题一脸不可做... 比1小的怎么办啊,好像没用,扔了吧. 先看部分分,n = 2简单,我会分类讨论!n = 4简单,我会搜索!n = 10,我会剪枝! k = 1怎么办,好像选的那些越大越好啊 ...
- Atcoder刷题小记
1. 2019.4.27 agc016d 一道很坑的题. 首先判无解,求出异或值后排个序就可以. 然后直接让\(a_i\rightarrow b_i\)并查集维护,注意离散化和判重,答案加上联通块个数 ...
- python类的两种创建方式
参考: https://blog.csdn.net/likunkun__/article/details/81949479
- (十一) UVC调节亮度
目录 UVC调节亮度 引入 硬件协议速览 代码框架 属性初始化 属性支持查询 具体属性值获取 具体属性值设置 代码实现 title: UVC调节亮度 date: 2019/4/23 20:30:00 ...
- Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)
Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...
- beego学习2 控制器与路由
beego控制器 controller目录新建test.go文件 结构体集成beego.Controller 控制名需大写,否则为私有方法 package controllers import ( & ...
- LinkedHashMap源码分析及实现LRU
概述 从名字上看LinkedHashMap相比于HashMap,显然多了链表的实现.从功能上看,LinkedHashMap有序,HashMap无序.这里的顺序指的是添加顺序或者访问顺序. 基本使用 @ ...