【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)

执行完后数据库:

原文地址:https://www.cnblogs.com/yeyeck/p/9527246.html

时间: 2024-10-07 20:31:44

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

【Python】从0开始写爬虫——转身扒豆瓣电影

豆瓣就比较符合这个“明人不说暗话”的原则.所以我们扒豆瓣,不多说,直接上代码 from scrapy import app import re header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36', 'Host': 'movie.douban.com', 'Accept-Lan

【Python】从0开始写爬虫——豆瓣电影

1. 最近略忙..java在搞soap,之前是用工具自动生成代码的.最近可能会写一个soap的java调用 2. 这个豆瓣电影的爬虫.扒信息的部分暂时先做到这了.扒到的信息如下 from scrapy import app import re header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safar

运维学python之爬虫中级篇(五)数据存储(无数据库版)

本篇主要介绍,爬取html数据后,将html的正文内容存储为json或csv格式. 1 json格式存储 选定要爬取的网站后,我们利用之前学过的内容,如:Beautiful Soup.xpath等方式解析,来获取我们希望得到的内容. 1.1 获取数据 首先使用urllib访问页面https://www.lagou.com/zhaopin/Python/?labelWords=label获取html内容,代码如下: from urllib import request try: url = 'ht

爬虫学习之第三章数据存储

第三章 数据存储 第一节 json文件处理: 什么是json: JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据.简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率.更多解释请见:https://baike.baidu.com/item/JS

【Python】从0开始写爬虫——开发环境

python小白,稍微看了点语法而已, 连字典的切片都永不顺的那种.本身是写java的,其实java也写得菜, 每天下了班不是太想写java.所以下班总是乱搞,什么都涉猎一点,也没什么太实际的收获.现在打算慢慢写个python爬虫玩 1. python环境搭建.我在windows上也是搭了python环境的,很久了.但是这个我在windows用pip安装的第三方库用起来总是报错.所以我一般都不用.我时用pycharm的python环境的. 在pycharm上安装需要的包,新建项目后,在左上角 F

【转载】不会编程也能写爬虫?可视化爬虫工具是什么东东

原文:不会编程也能写爬虫?可视化爬虫工具是什么东东 随着Scrapy等框架的流行,用Python等语言写爬虫已然成为一种时尚.但是今天,我们并不谈如何写爬虫,而是说说不要写代码就能写出来的爬虫. 爬虫新时代 在早期互联网世界,写爬虫是一项技术含量非常高的活,往大的方向说,爬虫技术是搜索引擎的重要组成部分. 随着互联网技术的发展,写爬虫不再是门槛非常高的技术了,一些编程语言甚至直接提供爬虫框架,例如python的Scrapy框架,它们让写爬虫走入“寻常百姓家”. 在知乎的热门话题“能利用爬虫技术做

[Python]新手写爬虫全过程

今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x.数据存放?这个是一个练手的玩具,就写在txt文本里吧.其实主要的不是学习爬虫,而是依照这个需求锻炼下自己的编程能力,最重要的是要有一个清晰的思路(我在以这个目标努力着).ok,主旨已经订好了,开始‘撸串’了. 目标网站:http://bohaishibei.com/post/category/main/(一个很有趣的网站,一段话配一个图,老

Python写爬虫-爬甘农大学校新闻

Python写网络爬虫(一) 关于Python: 学过C. 学过C++. 最后还是学Java来吃饭. 一直在Java的小世界里混迹. 有句话说: "Life is short, you need Python!"  翻译过来就是: 人生苦短, 我用Python 究竟它有多么强大,  多么简洁? 抱着这个好奇心, 趁不忙的几天. 还是忍不住的小学了一下.(- - 其实学了还不到两天) 随便用一个"HelloWorld"的例子 //Java class Main{ pu

python写爬虫使用urllib2方法

python写爬虫使用urllib2方法 整理了一部分urllib2的使用细节. 1.Proxy 的设置 urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy. 如果想在程序中明确控制 Proxy 而不受环境变量的影响,可以使用代理. 新建test14来实现一个简单的代理Demo: import urllib2 enable_proxy = True proxy_handler = urllib2.ProxyHandler({"http" : 'htt