【Python】從0開始寫爬蟲——把扒到的豆瓣資料存放區到資料庫

來源:互聯網
上載者:User

標籤:toc   表設計   unknown   個數   cto   stars   pytho   exec   int   

 
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)

執行完後資料庫:

 

【Python】從0開始寫爬蟲——把扒到的豆瓣資料存放區到資料庫

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.