这是全部的调试过程,我已经整理成为笔记,这里分享给大家:
python爬取豆瓣两千万图书简介信息:(一)目标API分析
python爬取豆瓣两千万图书简介信息:(二)简单python请求urllib2
python爬取豆瓣两千万图书简介信息:(三)异常处理
python爬取豆瓣两千万图书简介信息:(四)多进程并发
python爬取豆瓣两千万图书简介信息:(五)数据库设计
python爬取豆瓣两千万图书简介信息:(六)数据库操作类
python爬取豆瓣两千万图书简介信息:(七)代理IP
python爬取豆瓣两千万图书简介信息:(八)总结
数据库设计
爬取数据是为了存储,以供之后的分析使用。于是就要有相应的数据设计。
因为每次请求的数据结构大概都是固定的,而且,我也不想做太复杂太高端的数据设计,这样就尽量按照简单的来,所以,最终的数据库设计就是一本书的数据一条,而且较长的字段就抛弃掉。
一次请求获取数据示例:
https://api.douban.com/v2/book/10554308
请求结果如下:
{"rating":{"max":10,"numRaters":99295,"average":"9.2","min":0},"subtitle":"","author":["东野圭吾"],"pubdate":"2013-1-1","tags":[{"count":28691,"name":"东野圭吾","title":"东野圭吾"},{"count":13320,"name":"悬疑推理","title":"悬疑推理"},{"count":10713,"name":"日系推理","title":"日系推理"},{"count":9958,"name":"推理","title":"推理"},{"count":9058,"name":"日本文学","title":"日本文学"},{"count":8985,"name":"日本","title":"日本"},{"count":8460,"name":"小说","title":"小说"},{"count":7434,"name":"模糊式爱情","title":"模糊式爱情"}],"origin_title":"","image":"https://img1.doubanio.com\/mpic\/s29384019.jpg","binding":"精装","translator":["刘姿君"],"catalog":"","ebook_url":"https:\/\/read.douban.com\/ebook\/680843\/","pages":"538","images":{"small":"https://img1.doubanio.com\/spic\/s29384019.jpg","large":"https://img1.doubanio.com\/lpic\/s29384019.jpg","medium":"https://img1.doubanio.com\/mpic\/s29384019.jpg"},"alt":"https:\/\/book.douban.com\/subject\/10554308\/","id":"10554308","publisher":"南海出版公司","isbn10":"7544258602","isbn13":"9787544258609","title":"白夜行","url":"https:\/\/api.douban.com\/v2\/book\/10554308","alt_title":"","author_intro":"东野圭吾\n日本著名作家。\n1985年,凭《放学后》获第31届江户川乱步奖,开始专职写作;\n1999年,《秘密》获第52届日本推理作家协会奖;此后《白夜行》、《单恋》、《信》、《幻夜》先后入围直木奖。\n2005年出版的《嫌疑人X的献身》史无前例地将第134届直木奖、第6届本格推理小说大奖,以及年度三大推理小说排行榜第1名一并斩获;\n2008年,《流星之绊》获第43届新风奖。\n2009年出版的《新参者》获两大推理小说排行榜年度第1名;\n2012年,《浪矢杂货店的奇迹》获第7届中央公论文艺奖。","summary":"东野圭吾万千书迷心中的无冕之王\n周刊文春推理小说年度BEST10第1名\n本格推理小说年度BEST10第2名\n《白夜行》是东野圭吾迄今口碑最好的长篇杰作,具备经典名著的一切要素:\n一宗离奇命案牵出跨度近20年步步惊心的故事:悲凉的爱情、吊诡的命运、令人发指的犯罪、复杂人性的对决与救赎……\n-------------------------------------------------------------------\n1973年,大阪的一栋废弃建筑中发现一名遭利器刺死的男子。案件扑朔迷离,悬而未决。\n此后20年间,案件滋生出的恶逐渐萌芽生长,绽放出恶之花。案件相关者的人生逐渐被越来越重的阴影笼罩……\n“我的天空里没有太阳,总是黑夜,但并不暗,因为有东西代替了太阳。虽然没有太阳那么明亮,但对我来说已经足够。\n凭借着这份光,我便能把黑夜当成白天。\n我从来就没有太阳,所以不怕失去。”\n“只希望能手牵手在太阳下散步”,这句象征本书故事内核的绝望念想,有如一个美丽的幌子,随着无数凌乱、压抑、悲凉的事件片段如纪录片一样一一还原,最后一丝温情也被完全抛弃,万千读者在一曲救赎罪恶的爱情之中悲切动容。","ebook_price":"15.00","series":{"id":"868","title":"新经典文库·东野圭吾作品"},"price":"CNY 39.50"}
忍痛抛弃掉最长的作品简介,将tag先还原成一维数据aaaa&bbbb&cccc 。
最后的数据设计如下:
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for `books`
-- ----------------------------
DROP TABLE IF EXISTS `books`;
CREATE TABLE `books` (
`id` int(10) NOT NULL,
`isbn13` varchar(250) DEFAULT NULL,
`publisher` varchar(30) DEFAULT NULL,
`pages` varchar(20) DEFAULT NULL,
`title` varchar(250) DEFAULT NULL,
`image` varchar(250) DEFAULT NULL,
`alt` varchar(250) DEFAULT NULL,
`isbn10` varchar(250) DEFAULT NULL,
`large_image` varchar(250) DEFAULT NULL,
`subtitle` varchar(250) DEFAULT NULL,
`price` varchar(250) DEFAULT NULL,
`rating` varchar(250) DEFAULT NULL,
`numRaters` varchar(230) DEFAULT NULL,
`binding` varchar(250) DEFAULT NULL,
`author` varchar(250) DEFAULT NULL,
`tags` varchar(250) DEFAULT NULL,
`pubdate` varchar(250) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS = 1;
仅有这些字段,也够我以后分析了。
以下是常用的SQL语句:
sql使用记录
ps:命令行比界面好用多了.主要是速度快
mac:~ caobo56$ mysql -u root -p
//进入数据库
mysql> show databases
//显示数据库
mysql> USE doubanbook
//进入指定库
mysql> show tables;
//显示库中的所有表
mysql> show create table books;
//显示建表语句,可用于检查表字段,编码,长度等
mysql> alter table books change title title varchar(20) CHARSET utf8;
//更改某一列的编码格式
mysql> alter table books default character set utf8;
//更改某表的编码格式
mysql> truncate table books;
//清空某表
mysql> select * from books;
//查找表中所有数据
mysql> select max(id) from books;
//查找表中最大的id
mysql> update books set summary=replace(summary,' ','');
//将book表中 summary 字段中的空格清除掉
mysql> alter table books drop summary;
//将book表中 summary 字段删除
mysql> select max(id) from books;
//查询id最大的值
mysql> select title from books where rating>9;
//查询rating大于9的title
mysql> select title,rating from books where rating>9;
//查询rating大于9的title和rating
mysql> select id,title,rating,numRaters from books where rating>9;
//查询rating大于9的title和rating
mysql> insert into books select * from book group by id;
//将book中的数据以id分组插入到books表里。
mysql> update thread_index set bookid = 1030897 where id = 3;
//查某一区间的id最大值
mysql>
select id+1 from books a
where not exists(select * from books b where b.id = a.id + 1)
and id < (select MAX(id) from books) ;
//查询id不连续的位置,并不是查询出所有不连续的id
mysql> SELECT title FROM books WHERE title Like '%健康%';
模糊查询同”健康”相关的title
mysql> SELECT sum(DATA_LENGTH)/1024/1024+sum(INDEX_LENGTH)/1024/1024 FROM information_schema.TABLES where TABLE_SCHEMA='doubanbook';
//计算数据库的大小
mysql> INSERT INTO books (id, isbn13, publisher, pages, title, image, alt, isbn10, subtitle, price, binding,pubdate, large_image, rating, numRaters,tags, author) VALUES (1715056,"9787533913311","浙江文艺出版社","255","\"一九九七\"之夜","https://img3.doubanio.com\/mpic\/s6250116.jpg","https:\/\/book.douban.com\/subject\/1715056\/","7533913310","","12.40元","平装","2000-2","https://img3.doubanio.com\/lpic\/s6250116.jpg","0.0","0","","陶然");
//插入语句,带双引号的需要加\转译符
连表查询
SELECT works.id,works.title,works.author_id,works.author,works.dynasty,works.kind,works.kind_cn,works.foreword,works.content,works.intro,works.layout,dynasties.name,dynasties.start_year AS worksDy
FROM works INNER JOIN dynasties
ON works.dynasty = dynasties.name
ORDER BY dynasties.start_year;