图片来自于网络
Python与数据库-网络爬虫存储
@(数据科学)[小树枝来了, 帮助, Markdown, 网络爬虫, 数据存储]
关系数据库存储-MySQL为例
爬虫配合MySQL存储
瑞士军刀-SQLite
分布式数据存储-NoSQL数据库
爬虫配合mongoDB存储
tips:
使用虚拟环境时,conda安装的组件在jupyter中无法import,需要在虚拟环境中重新conda install jupyter notebook;
存在基础环境和虚拟环境共用jupyter环境;
conda install beautifulsoup4
可以用jupyter notebook进行MATLAB开发,在matlab安装目录中查找python文件里面的setup,用console运行生成python-MATLAB适配器built文件即可;注意:MATLAB只支持python3.5和python2.7;
假设你已经(或者有能力)获取大量数据(通过爬取),那么选择何种方式去存储数据非常重要
一般而言就爬虫问题,我们可以选择:
文本文件的形式保存(比如csv)
数据库
文件系统
第一种
优势:方便,随时使用,不需要第三方的支持
劣势:健壮性差,扩展性差
第二种
优势:良好的扩展性,使用广泛
劣势:(硬要说的话)需要第三方支持,需要进行选择,对技术有一定要求
第三种
更自由,但技术要求会更高
当你选择使用数据库作为你的爬虫的后端存储方案时,核心的问题是:
哪种数据库或者组合能够最好解决你的问题?
数据库类型
关系型,键值型,文档型等等
驱动力
实际解决的问题场景
关系型:数据库查询的灵活性 > 灵活的模式
面向列的数据库:适合存储多机的海量数据
数据库的特性
除了CRUD
数据库是否有模式
数据库是否支持快速索引查找
数据库是否支持自由定义的查询
数据库是否在查询前必须先进行规划
数据库的性能
是否方便进行优化
是否容易对读写进行优化
支不支持分片,复制
数据库的伸缩性
横向扩展(MongoDB)
纵向扩展(PostgreSQL)
说说爬虫:
一般的数据,基本上都没有问题
数据变大,数据量和并发都很大的时候
关系型数据库容量和读写能力可能会有问题
爬虫的信息(一般来说比如文本),一般不需要建立关系
爬虫字段经常变化,相对严格模式的关系数据库,NoSQL会更有优势
文档型(MongoDB)更加自由
容易横向扩展、分片、复制
爬虫数据比较脏乱
有时无法预期数据的字段(先爬下来再说)
NoSQL可以做Map Reduce优化
关系数据库:
以集合理论为基础的系统,实现为具有行和列的二维表
利用SQL(结构化查询语言)编写查询,与数据库管理系统交互
SQLite, MySQL, PostgreSQL
创建database:
INSERT INTO countries (country_code, country_name)
VALUES ('us', 'United States'), ('mx','Mexico'),
('au','Australia'), ('gb','United Kingdom'),
('de','Germany'), ('ll','Loompaland');
select * from countries;
select * from cities;
show tables;
INSERT INTO countries (country_code, country_name)
VALUES ('us', 'United States');
DELETE FROM countries WHERE country_code = 'll';
CREATE TABLE cities(
name varchar(128) NOT NULL,
postal_code VARCHAR(9) CHECK (postal_code <> ''),
country_code CHAR(2) REFERENCES countries,
PRIMARY KEY (country_code, postal_code)
);
INSERT INTO cities
VALUES ('Portland', '87200', 'us');
UPDATE cities
SET postal_code = '97205'
WHERE name = 'Portland';
SELECT cities.*, country