【Python】从0开始写爬虫——把扒到的豆瓣数据存储到数据库

简介: 1. 我们扒到了什么?   id, 名称, 上映年份,上映日期,所属类目, 导演,主演,片长,评分,星评,评价人数 2. 把这些数据做一个分类。   a..基本信息 :名称, 导演,上映年份, 所属类目, 片长   b.评价信息:评分,星评,评价人数   c.主演表: 主演(我在纠结要不要单独列一张表) 3 .表设计。
 
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)

执行完后数据库:

 

相关文章
|
11天前
|
数据采集 存储 API
网络爬虫与数据采集:使用Python自动化获取网页数据
【4月更文挑战第12天】本文介绍了Python网络爬虫的基础知识,包括网络爬虫概念(请求网页、解析、存储数据和处理异常)和Python常用的爬虫库requests(发送HTTP请求)与BeautifulSoup(解析HTML)。通过基本流程示例展示了如何导入库、发送请求、解析网页、提取数据、存储数据及处理异常。还提到了Python爬虫的实际应用,如获取新闻数据和商品信息。
|
15天前
|
数据采集 Python
【python】爬虫-西安医学院-校长信箱
本文以西安医学院-校长信箱为基础来展示爬虫案例。来介绍python爬虫。
【python】爬虫-西安医学院-校长信箱
|
1天前
|
数据采集 存储 JSON
Python爬虫面试:requests、BeautifulSoup与Scrapy详解
【4月更文挑战第19天】本文聚焦于Python爬虫面试中的核心库——requests、BeautifulSoup和Scrapy。讲解了它们的常见问题、易错点及应对策略。对于requests,强调了异常处理、代理设置和请求重试;BeautifulSoup部分提到选择器使用、动态内容处理和解析效率优化;而Scrapy则关注项目架构、数据存储和分布式爬虫。通过实例代码,帮助读者深化理解并提升面试表现。
6 0
|
3天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
26 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
3天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
23 6
|
4天前
|
数据采集 JavaScript 前端开发
使用Python打造爬虫程序之破茧而出:Python爬虫遭遇反爬虫机制及应对策略
【4月更文挑战第19天】本文探讨了Python爬虫应对反爬虫机制的策略。常见的反爬虫机制包括User-Agent检测、IP限制、动态加载内容、验证码验证和Cookie跟踪。应对策略包括设置合理User-Agent、使用代理IP、处理动态加载内容、验证码识别及维护Cookie。此外,还提到高级策略如降低请求频率、模拟人类行为、分布式爬虫和学习网站规则。开发者需不断学习新策略,同时遵守规则和法律法规,确保爬虫的稳定性和合法性。
|
5天前
|
存储 关系型数据库 MySQL
如何处理爬取到的数据,例如存储到数据库或文件中?
处理爬取的数据,可存储为txt、csv(适合表格数据)或json(适合结构化数据)文件。若需存储大量数据并执行复杂查询,可选择关系型(如MySQL)或非关系型(如MongoDB)数据库。以MySQL为例,需安装数据库和Python的pymysql库,创建数据库和表,然后编写Python代码进行数据操作。选择存储方式应考虑数据类型、数量及后续处理需求。
12 1
|
6天前
|
SQL 关系型数据库 MySQL
关系型数据库插入数据的语句
使用SQL的`INSERT INTO`语句向关系型数据库的`students`表插入数据。例如,插入一个`id`为1,`name`为'张三',`age`为20的记录:`INSERT INTO students (id, name, age) VALUES (1, '张三', 20)。如果`id`自增,则可简化为`INSERT INTO students (name, age) VALUES ('张三', 20)`。
5 2
|
6天前
|
SQL 存储 Oracle
关系型数据库查询数据的语句
本文介绍了关系型数据库中的基本SQL查询语句,包括选择所有或特定列、带条件查询、排序、分组、过滤分组、表连接、限制记录数及子查询。SQL还支持窗口函数、存储过程等高级功能,是高效管理数据库的关键。建议深入学习SQL及相应数据库系统文档。
8 2
|
9天前
|
SQL 关系型数据库 数据库
Python中SQLite数据库操作详解:利用sqlite3模块
【4月更文挑战第13天】在Python编程中,SQLite数据库是一个轻量级的关系型数据库管理系统,它包含在一个单一的文件内,不需要一个单独的服务器进程或操作系统级别的配置。由于其简单易用和高效性,SQLite经常作为应用程序的本地数据库解决方案。Python的内置sqlite3模块提供了与SQLite数据库交互的接口,使得在Python中操作SQLite数据库变得非常容易。