主要解决问题和实现目的:
- 断点续爬,用Redis去重,Hash方式,不会有误判同时内存占用一般.
- 分段爬取,每个爬取文件不会搞的太大.(也会合并一些文件)
- 修改CSV文件中可能导致MySQL LOAD INTO语句失效的部分.
- 可以粗略估算数据量
- 解决一些采集中的BUG
- 解决上传超时问题
- 实时数据量参照顶部状态条.(每次采集完成会更新)
遇到一些问题:
- 有些书每个章节连接都是死链.
- 有些内容里面包含双引号和逗号,不影响标准CSV解释器,但是MySQL LOAD INTO会失效.
- 有些章节标题竟然是空白的.
- 如果一次性采集很久,可能文件很大,不利于导入各类数据库或者硬盘保存.
性能评估(ScrapingHub于增量爬取状态下):
- 采集耗时:< 300分钟
- 上传耗时:< 1分钟
- 压缩耗时:< 3 分钟
- 节点需求:< 1 Free Forever Scrapy Cloud Unit
- Redis服务器内存需求:< 2GB
- 流量消耗:< 1GB
数据打包:
- 本地打包为xz文件,每个文件都在2G以下.(增量会更小)
- 远程数据为csv文件,每个文件都是原始数据.(偶尔会执行combine.py来合并)
部分数据:
- CSV文件适用于MySQL导入,无标题,不需要IGNORE.
- CSV文件不定时增量更新.
- 储存格式:
id_primary
id_subset
title
chapter_name
chapter_content
- 下载地址:OneDrive网盘
MySQL导入参考:
CREATE TABLE `scrapy` (
`id` INT NOT NULL AUTO_INCREMENT,
`id_primary` INT NOT NULL,
`id_subset` INT NOT NULL,
`title` VARCHAR(200) NOT NULL DEFAULT '',
`chapter_name` VARCHAR(200),
`chapter_content` MEDIUMTEXT,
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(),
PRIMARY KEY (`id`),
INDEX `id_subset` (`id_subset`),
INDEX `id_primary` (`id_primary`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
LOAD DATA LOCAL INFILE './yyyy-mm-dd-hh-mm-ss.csv'
REPLACE INTO TABLE scrapy
CHARACTER SET utf8mb4 FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 0 LINES
(`id_primary`,`id_subset`,`title`,`chapter_name`,`chapter_content`)
SET chapter_name = nullif(chapter_name,'无标题');