Wxpython GUI - 爬取貓眼電影并寫入Mysql,并進行查詢

本次實戰(zhàn)目的是為了更好地學習MySQL和mongoBD 操作耻陕,需要從貓眼電影上爬取電影信息拙徽,加上簡單的python GUI界面操作,效果圖如下:


picture.png

廢話不多說诗宣,首先導入本次項目需要導入的模塊,以及主程序入口代碼如下:

import requests
from bs4 import BeautifulSoup
import re
import pymysql
from pymongo import MongoClient
import time
import wx

#每次爬取之前都將新建表膘怕,將以前的表刪除
def create_table_mysql():
    # 打開數(shù)據(jù)庫連接
    db = pymysql.connect(host="localhost", user='root', password='Lizzie94', port=3306, db='Movies_mao')
    cursor = db.cursor()
    cursor.execute("drop table if EXISTS movie ")
    sql = """create table movie(
              id int UNSIGNED not null auto_increment,
              name char(50) not null,
              actor varchar(400) not null,
              time  DATE  not null,
              score  FLOAT,
              PRIMARY  KEY (id))ENGINE = InnoDB Default charset=UTF8MB4;
      """
    cursor.execute(sql)
    db.close()


"""下載網(wǎng)頁"""
def crawurl(url):
    try:
        r = requests.get(url)
        if r.status_code == 200:
            return r.text
        else:
            print('request failed, status is {}'.format(r.status_code))
            return None
    except Exception as e:
        print(e)
        return None


"""解析網(wǎng)頁"""
def parse(html):
    soup = BeautifulSoup(html, 'html.parser')
    detail = soup.find_all('div', "board-item-content")
    for item in detail:
        movie_name = item.find("p", class_="name").a.text
        movie_star = re.sub(r'\s+', '', item.find("p", class_="star").text).replace("主演:", "")
        movie_release_time = re.sub(r'\((.*)\)', '', item.find("p", class_="releasetime").text.replace("上映時間:", ""))
        movie_score = ''.join([item.find('i', class_="integer").text, item.find('i', class_="fraction").text])
        yield {'name': movie_name,
               'actor': movie_star,
               'time': movie_release_time,
               'score': movie_score
                }


"""寫入Mysql數(shù)據(jù)庫"""
def load_to_mysql(data):
    values = ",".join(["%s"] * len(data))
    keys = ",".join(data.keys())
    movie_item = tuple(data.values())
    # 打開數(shù)據(jù)庫連接
    db = pymysql.connect(host="localhost", user='root', password='Lizzie94',port=3306,db= 'Movies_mao')
    cursor = db.cursor()
    # 插入數(shù)據(jù)
    sql_insert = "insert into movie({keys}) values ({values})".format(keys=keys,values=values)
    try:
        if cursor.execute(sql_insert, movie_item):
            print('insert successfully')
            db.commit()
    except Exception as e:
        print("failed", e.args)
        db.rollback()
    db.close()


"""寫入MangoDB"""
def load_to_mangoDB(data):
    client = MongoClient('localhost')   # 連接客戶端
    db = client.Mao_Movie               # 創(chuàng)建數(shù)據(jù)庫“Mao_Movie" 若數(shù)據(jù)庫不存在,存在則連接數(shù)據(jù)庫
    post = db.Movie                     # 創(chuàng)建集合Movie召庞,若集合不存在岛心,存在則連接集合
    # post.remove(None)
    try:
        if post.insert(data):
            print('insert MongoDB successfully')
    except Exception as e:
        print('insert MongoDB failed', e.args)

"""點擊 crawl_button 按鈕觸發(fā)主調用函數(shù)開始爬取電影"""
def main(event):
    base_url = 'https://maoyan.com/board/4?offset='
    page = 11
    # 爬數(shù)據(jù)之前先建表
    create_table_mysql()
    for i in range(1, page):
        url = base_url + str((i-1) * 10)
        html = crawurl(url)
        for item in parse(html):
            print(item)
            load_to_mysql(item)
            load_to_mangoDB(item)
    wx.MessageBox("crawl movies successfully", "Message", wx.OK | wx.ICON_INFORMATION)

以下代碼是整個項目的主入口程序,需要用到wx建立一個GUI界面篮灼,按鈕crawl_button 綁定main()事件忘古,點擊并開始觸發(fā)開始爬取電影事件。

if __name__ == '__main__':
    t1 = time.time()
    #  界面代碼
    app = wx.App()
    frame = wx.Frame(None, title="Spide movie", pos=(1000, 200), size=(500, 400))
    panel = wx.Panel(frame)

    lb_box = wx.BoxSizer(wx.HORIZONTAL)
    # 靜態(tài)文本诅诱,放入水平容器中髓堪, 1:1 比例
    lb_srch_cont = wx.StaticText(panel, -1, '搜索內容:')
    lb_srch_type = wx.StaticText(panel, -1, '搜索類別:')
    lb_box.Add(lb_srch_cont, proportion=1, flag=wx.EXPAND | wx.ALL, border=3)
    lb_box.Add(lb_srch_type, proportion=1, flag=wx.EXPAND | wx.ALL, border=3)

    text_box = wx.BoxSizer(wx.HORIZONTAL)
    # 輸入搜索內容框
    content_text = wx.TextCtrl(panel, -1)
    list_type = ['演員名字', '電影名字']
   # 下拉列表框
    type_combox = wx.ComboBox(panel, -1, choices=list_type)
    # 搜素按鈕button
    srch_button = wx.Button(panel, label="搜索")
    # 綁定搜索事件
    srch_button.Bind(wx.EVT_BUTTON, hit_me)

    text_box.Add(content_text, proportion=3, flag=wx.EXPAND | wx.ALL, border=3)
    text_box.Add(type_combox, proportion=2, flag=wx.EXPAND | wx.ALL, border=3)
    text_box.Add(srch_button, proportion=1, flag=wx.EXPAND | wx.ALL, border=3)
    # 搜索之后的顯示文本框
    srch_content = wx.TextCtrl(panel, style=wx.TE_MULTILINE|wx.HSCROLL)
    # 點擊開始爬取按鈕
    crawl_button = wx.Button(panel, label="開始爬取貓眼電影TOP100")
    # 綁定爬取事件,事件函數(shù)有且只有一個參數(shù),叫event
    crawl_button.Bind(wx.EVT_BUTTON, main)
    v_box = wx.BoxSizer(wx.VERTICAL)
    v_box.Add(lb_box, proportion=1, flag=wx.EXPAND | wx.ALL, border=3)
    v_box.Add(text_box, proportion=1, flag=wx.EXPAND | wx.ALL, border=3)
    v_box.Add(srch_content, proportion=10, flag=wx.EXPAND | wx.ALL, border=3)
    v_box.Add(crawl_button, proportion=1, flag=wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, border=3)

    panel.SetSizer(v_box)
    frame.Show()
    app.MainLoop()
    print('Total time:', t1-time.time())

點擊搜索button, 獲取輸入文本框和下拉菜單值,進行數(shù)據(jù)庫查詢操作

# 點擊搜索button事件
def hit_me(event):
    content = content_text.GetValue()
    type = type_combox.GetValue()
    if not (content and type):  # 若輸入框或下拉框為空則顯示錯誤信息
        wx.MessageBox("please input some values", "Message", wx.OK | wx.ICON_INFORMATION)
        return
    if type == "演員名字":
        field = 'actor'
    else:
        field = 'name'
    value = '%'+ content + '%'
    # Mysql 數(shù)據(jù)庫查詢操作
    # 打開數(shù)據(jù)庫連接
    db = pymysql.connect(host="localhost", user='root', password='Lizzie94', port=3306, db='Movies_mao')
    cursor = db.cursor()
    try:
        cursor.execute("Select * from movie where {field} like '{value}' ".format(field=field, value=value))
        results = cursor.fetchall()
        all_row = ''
        for each in results:
            row = ' '.join(str(i) for i in each)
            all_row += row + '\n'
        srch_content.SetValue(all_row)
    except Exception as e:
        wx.MessageBox("selection from database error" , "Message", wx.OK | wx.ICON_INFORMATION)
        print(e)
    db.close()

最后的效果圖如下:


picture2.png

picture3.png

picture4.png

未完待續(xù)干旁,下次需要用異步方法來爬蟲驶沼,本人基礎不是很扎實,只能用同步方法來爬取數(shù)據(jù)争群。
最后附上 wxpyhon的中文學習資料: https://www.ctolib.com/docs/sfile/wxpy-in-action/12.html
英文學習地址:http://zetcode.com/wxpython/
https://www.wxpython.org/

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末商乎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子祭阀,更是在濱河造成了極大的恐慌,老刑警劉巖鲜戒,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件专控,死亡現(xiàn)場離奇詭異,居然都是意外死亡遏餐,警方通過查閱死者的電腦和手機伦腐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來失都,“玉大人柏蘑,你說我怎么就攤上這事〈馀樱” “怎么了咳焚?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長庞溜。 經(jīng)常有香客問我革半,道長,這世上最難降的妖魔是什么流码? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任又官,我火速辦了婚禮,結果婚禮上漫试,老公的妹妹穿的比我還像新娘六敬。我一直安慰自己,他們只是感情好驾荣,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布外构。 她就那樣靜靜地躺著,像睡著了一般秘车。 火紅的嫁衣襯著肌膚如雪典勇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天叮趴,我揣著相機與錄音割笙,去河邊找鬼。 笑死,一個胖子當著我的面吹牛伤溉,可吹牛的內容都是我干的般码。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乱顾,長吁一口氣:“原來是場噩夢啊……” “哼板祝!你這毒婦竟也來了?” 一聲冷哼從身側響起走净,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤券时,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后伏伯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橘洞,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年说搅,在試婚紗的時候發(fā)現(xiàn)自己被綠了炸枣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡弄唧,死狀恐怖适肠,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情候引,我是刑警寧澤侯养,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站澄干,受9級特大地震影響沸毁,放射性物質發(fā)生泄漏。R本人自食惡果不足惜傻寂,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一息尺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疾掰,春花似錦搂誉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拂檩,卻和暖如春侮腹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稻励。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工父阻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留愈涩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓加矛,卻偏偏與公主長得像履婉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子斟览,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容

  • 首先附上一張成品圖 可以看到毁腿,當我們輸入了一個ip地址以后,界面中可以馬上將該ip地址的地理位置苛茂、運營商已烤、時區(qū)、經(jīng)...
    山間不知秋閱讀 1,159評論 0 3
  • 在本次推送中妓羊,以貓眼電影 APP 中的電影評論作為爬取目標草戈,完成對網(wǎng)頁數(shù)據(jù)的采集姨丈。在采集完成后枯怖,我們將每個評論數(shù)據(jù)...
    d9ce68731cdb閱讀 1,623評論 2 1
  • 閑話 前幾天有位人吐槽我的公眾號內容除了爬蟲還是爬蟲扰肌,看的想吐。其實我寫爬蟲寫的也快吐了涨颜,但是限于自己水平,我現(xiàn)在...
    大鄧和他的python閱讀 4,648評論 10 16
  • 感覺上了大學很多東西真的不像自己想象的那樣 沒有過得很精致也沒有做自己喜歡做的事活成自己喜歡的樣子 每天渾渾噩噩應...
    不敢說的北閱讀 187評論 0 0
  • 持續(xù)記錄197天(2018.6.19) 今早醒來才發(fā)現(xiàn)昨天的記錄變成了前天的顯示茧球,難道是因為我前天的腹稿不小心發(fā)表...
    和佛陀去賞花閱讀 245評論 0 1