【Python】从0开始写爬虫——把扒到的豆瓣数据存储到数据库
1. 我们扒到了什么?
id, 名称, 上映年份,上映日期,所属类目, 导演,主演,片长,评分,星评,评价人数
2. 把这些数据做一个分类。
a..基本信息 :名称, 导演,上映年份, 所属类目, 片长
b.评价信息:评分,星评,评价人数
c.主演表: 主演(我在纠结要不要单独列一张表)
3 .表设计。现在有点蛋疼的是主键。用自增主键还是电影id做主键。经过我的多方面考虑,我慎重(草率)地决定,用电影id(反正都要建唯一索引,为什么不拿来当主键呢。。), 所以我刚才又在id那转了一下数据
m_id = re.search("[0-9]+", movie_url).group() movie["id"] = int(m_id)
写着玩嘛,就是那么随意,有什么想法就改!!!
4. 建表。。也是蛋疼,我居然纠结过是用mysql还是mongodb, 马上就删自己一个耳光,你会mongodb嘛?感觉要是继续又开一个mongodb的坑,我就再也回不来这个爬虫了。
我也不傻不拉几地自己写建表sql了.直接用的SQLyog。稍微纠结了一下InnoDB和MyISAM。 我开始是想每次把一个电影的信息分别插入三个表,要不要用事务, 又想垃圾数据也不会扣我钱,所以用了MyISAM。毕竟就是大量的Insert和select
建表语句
CREATE DATABASE `douban`; USE `douban`; -- 基本信息表 CREATE TABLE `t_movie_info` ( `id` bigint(20) unsigned NOT NULL COMMENT '主键,豆瓣电影id', `type` tinyint(4) DEFAULT NULL COMMENT '类型 0:电视剧,1:电影', `name` varchar(30) DEFAULT NULL COMMENT '电影名字', `director` varchar(50) DEFAULT NULL COMMENT '导演', `year` int(4) DEFAULT NULL COMMENT '上映年份', `month` int(2) DEFAULT NULL COMMENT '上映月份', `day` int(2) DEFAULT NULL COMMENT '上映日期', `categories1` varchar(20) DEFAULT NULL COMMENT '所属类目1', `categories2` varchar(20) DEFAULT NULL COMMENT '所属类目2', `time` int(3) DEFAULT NULL COMMENT '时长', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 -- 主演表 CREATE TABLE `t_movie_actors` ( `id` bigint(20) unsigned NOT NULL COMMENT '主键,豆瓣电影id', `actor1` varchar(50) DEFAULT NULL, `actor2` varchar(50) DEFAULT NULL, `actor3` varchar(50) DEFAULT NULL, `actor4` varchar(50) DEFAULT NULL, `actor5` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 -- 评价数据表 CREATE TABLE `t_movie_scores` ( `id` bigint(20) unsigned NOT NULL COMMENT '主键,电影id', `score` double unsigned DEFAULT '0' COMMENT '评分', `votes` int(10) unsigned DEFAULT '0' COMMENT '评价人数', `star1` double unsigned DEFAULT '0' COMMENT '1星比例', `star2` double unsigned DEFAULT '0' COMMENT '2星比例', `star3` double unsigned DEFAULT '0' COMMENT '3星比例', `star4` double unsigned DEFAULT '0' COMMENT '4星比例', `star5` double unsigned DEFAULT '0' COMMENT '5星比例', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8
5. 写一个方法把数据插入到数据库里。 也是第一次用python写数据到数据库,折腾了一晚上。 也不知道哪个小菜比写的 %s 不用加引号,搞得我第一次就看到这个,然后出了错一直认为这个是对的,在找别的原因
def inset_data(movie): # 获取一个数据库连接 conn = pymysql.Connect(host="localhost", port=3306, user="root", password="root", db="douban") # conn.autocommit(True) # 设置自动提交 cursor = conn.cursor() # 获取游标 sql_insert_info = ("insert into `t_movie_info`(`id`, `type`, `name`, `director`, `year`, `month`, `day`, " "`categories1`, `categories2`, `time`) values (%d, %d, '%s', '%s', %d, %d, %d, '%s', '%s', %d)") categories = movie["categories"] ca_len = len(categories) categories1 = categories[0] if ca_len > 0 else None categories2 = categories[1] if ca_len > 1 else None cursor.execute(sql_insert_info % (movie["id"], movie["type"], movie["name"], movie["directer"], movie["date"].year, movie["date"].month, movie["date"].day, categories1, categories2, movie["time"])) # 写sql 千万记住 %s 要加双引号,不然会报错 Unknown column 'a' in 'field list' sql_insert_actors = ("insert into `t_movie_actors`(id, actor1, actor2, actor3, actor4, actor5)" "values(%d, '%s', '%s', '%s', '%s', '%s')") actors = movie["actors"] actors_len = len(actors) actor1 = actors[0] if actors_len > 0 else None actor2 = actors[1] if actors_len > 1 else None actor3 = actors[2] if actors_len > 2 else None actor4 = actors[3] if actors_len > 3 else None actor5 = actors[4] if actors_len > 4 else None cursor.execute(sql_insert_actors % (movie["id"], actor1, actor2, actor3, actor4, actor5)) sql_insert_scores = ("insert into `t_movie_scores`(id, score, votes, star1, star2, star3, star4, star5)" "values(%d, %f, %d, %f, %f, %f, %f, %f)") stars = movie["stars"] stars_len = len(stars) star1 = stars[0] if stars_len > 0 else 0.0 star2 = stars[1] if stars_len > 1 else 0.0 star3 = stars[2] if stars_len > 2 else 0.0 star4 = stars[3] if stars_len > 3 else 0.0 star5 = stars[4] if stars_len > 4 else 0.0 cursor.execute(sql_insert_scores % (movie["id"], movie["score"], movie["vote"], star1, star2, star3, star4, star5)) conn.commit() data1 = douban_movie("https://movie.douban.com/subject/30236775/?from=showing") inset_data(data1) data2 = douban_movie("https://movie.douban.com/subject/26842702/?tag=%E7%83%AD%E9%97%A8&from=gaia") inset_data(data2) data3 = douban_movie("https://movie.douban.com/subject/26973784/?tag=%E6%9C%80%E6%96%B0&from=gaia") inset_data(data3) data4 = douban_movie("https://movie.douban.com/subject/30249296/?tag=%E7%83%AD%E9%97%A8&from=gaia") inset_data(data4)
执行完后数据库:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
用Python读写Excel文件的方式比较
虽然天天跟数据打交道,也频繁地使用Excel进行一些简单的数据处理和展示,但长期以来总是小心地避免用Python直接读写Excel文件。通常我都是把数据保存为以TAB分割的文本文件(TSV),再在Excel中进行导入或者直接复制粘贴。 前段时间做一个项目,却不得不使用Python直接生成Excel文件,后来随着需求的变化,还要对已有的Excel文件进行读取。在这个过程中,研究并尝试了一些工具,也走了一些弯路。记录下来,下次再有类似需求的时候就不用漫天遍野地搜索了。 超级无敌大PK 我主要尝试了四种工具,在此并不会给出他们的排名,因为在不同的应用场景下,做出的选择会不同。 XlsxWriter XlsxWriter是我最终选择的用于写操作的工具。顾名思义,它只能用来写文件。 这应该是个比较新的项目,在GitHub上看它最早的提交是在2013年1月份。其官方文档中宣称它支持: 优点 一、功能比较强 相对而言,这是除Excel自身之外功能最强的工具了。比如我就用到了它提供的:字体设置、前景色背景色、border设置、视图缩放(zoom)、单元格合并、autofilter、freeze...
- 下一篇
Python全栈 正则表达式(概念、、语法、元字符、re模块)
前言: 普通人有三件东西看不懂:医生的处方,道士的鬼符,程序员得正则表达式 什么是正则表达式? 正则表达式,又称规则表达式,英文名为RegularExpression,在代码中常简写为regex、regexp或RE, 是计算机科学的一个概念。 许多程序设计语言都支持利用正则表达式进行字符串操作。 例如,在Python中就内建了一个功能强大的正则表达式接口擎。 正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。 正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。 正则就是用有限的符号,处理表达无限的序列 有什么作用? 正则表通常被用来检索、替换那些符合某个模式(规则)的文本。 正则表达式是对字符串(包括普通字符(例如,a 到
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS6,CentOS7官方镜像安装Oracle11G