【轉】爬取豆瓣電影top250提取電影分類進行資料分析

來源:互聯網
上載者:User

標籤:

一、爬取網頁,擷取需要內容

我們今天要爬取的是豆瓣電影top250
頁面如下所示:

我們需要的是裡面的電影分類,通過查看原始碼觀察可以分析出我們需要的東西。直接進入主題吧!

知道我們需要的內容在哪裡了,接下來就使用我們python強大的request庫先擷取網頁內容下來吧!擷取內容後,再使用一個好用的lxml庫來分析網頁內容,然後擷取我們的內容就可以做下一步操作了。
先貼出使用request庫和lxml分析的代碼

 1 def get_page(i): 2             url = ‘https://movie.douban.com/top250?start={}&filter=‘.format(i) 3                  4             html = requests.get(url).content.decode(‘utf-8‘)    # 使用request庫擷取網頁內容 5          6             selector = etree.HTML(html)    # 使用lxml庫提取內容 7             ‘‘‘ 8                 通過觀察頁面就能發現內容在<div class="info">下的一部分 9             ‘‘‘10             content = selector.xpath(‘//div[@class="info"]/div[@class="bd"]/p/text()‘)11             print(content)12         13             for i in content[1::2]:14                 print(str(i).strip().replace(‘\n\r‘, ‘‘))15                 # print(str(i).split(‘/‘))16                 i = str(i).split(‘/‘)  17                 i = i[len(i) - 1]18                 key = i.strip().replace(‘\n‘, ‘‘).split(‘ ‘) # 這裡的strip和replace的使用目的是去除空格和空行之類19                 print(key)

 

通過擷取下來的內容我們發現一部電影的各項內容都是用‘/‘分隔著,我們只需要提取電影分類中的東西,所以我們需要使用

i = str(i).split(‘/‘)

 

來把內容分隔成幾項內容,因為電影分類排在最後,所以我們通過

i = i[len(i) - 1]

 

來擷取分隔後的最後一項也就是我們需要的電影分類,還有最後一步我們需要完成的,因為一部電影裡面一般都有多個電影分類的標籤,所以我們還要繼續分隔擷取到的電影分類,並且觀察可以知道電影分類之間只是用一個空格隔開,所以我們使用下面一行代碼就可以分離出各個分類:

key = i.strip().replace(‘\n‘, ‘‘).split(‘ ‘)

 

二、接下來就是儲存到mysql資料庫

把電影分類儲存在mysql資料庫以便下面進行資料分析,這裡我們使用到pymysql來串連mysql資料庫,首先我們需要在mysql資料庫建好表:

然後我們通過pymysql把資料儲存到資料庫中,代碼如下:
首先要串連資料庫:

# 串連mysql資料庫conn = pymysql.connect(host = ‘localhost‘, user = ‘root‘, passwd = ‘2014081029‘, db = ‘mysql‘, charset = ‘utf8‘)  # user為資料庫的名字,passwd為資料庫的密碼,一般把要把字元集定義為utf8,不然存入資料庫容易遇到編碼問題cur = conn.cursor()  # 擷取操作遊標cur.execute(‘use douban‘)  # 使用douban這個資料庫

在儲存到資料庫之前,我們還有一個需要做得,那就是把250部電影的分類匯總數量,所以我們定義了一個字典來統計電影分類的個數,這裡的代碼是get_page函數的一部分,代碼如下:

for i in content[1::2]:        print(str(i).strip().replace(‘\n\r‘, ‘‘))        # print(str(i).split(‘/‘))        i = str(i).split(‘/‘)        i = i[len(i) - 1]        key = i.strip().replace(‘\n‘, ‘‘).split(‘ ‘)        print(key)        for i in key:            if i not in douban.keys():                douban[i] = 1            else:                douban[i] += 1

 

然後定義一個儲存函數,執行插入操作,如果出現插入失敗,就執行復原操作,還有記得在操作完成之後,使用conn.close()和cur.close()來關閉資料庫連接,代碼如下:

    def save_mysql(douban):        print(douban)  # douban在主函數中定義的字典        for key in douban:            print(key)            print(douban[key])            if key != ‘‘:                try:                    sql = ‘insert douban(類別, 數量) value(‘ + "\‘" + key + "\‘," + "\‘" + str(douban[key]) + "\‘" + ‘);‘                    cur.execute(sql)                    conn.commit()                except:                    print(‘插入失敗‘)                    conn.rollback()

 

三、使用matplotlib進行資料視覺效果操作

首先,從資料庫中把電影分類和每個分類的數量分別存入一個列表中,然後使用matplotlib進行可視化操作,具體如下:

def pylot_show():        sql = ‘select * from douban;‘          cur.execute(sql)        rows = cur.fetchall()   # 把表中所有欄位讀取出來        count = []   # 每個分類的數量        category = []  # 分類            for row in rows:            count.append(int(row[2]))               category.append(row[1])            y_pos = np.arange(len(category))    # 定義y軸座標數        plt.barh(y_pos, count, align=‘center‘, alpha=0.4)  # alpha圖表的填充不透明度(0~1)之間        plt.yticks(y_pos, category)  # 在y軸上做分類名的標記            for count, y_pos in zip(count, y_pos):            # 分類個數在圖中顯示的位置,就是那些數字在柱狀圖尾部顯示的數字            plt.text(count, y_pos, count,  horizontalalignment=‘center‘, verticalalignment=‘center‘, weight=‘bold‘)          plt.ylim(+28.0, -1.0) # 可視化範圍,相當於規定y軸範圍        plt.title(u‘豆瓣電影250‘)   # 圖表的標題        plt.ylabel(u‘電影分類‘)     # 圖表y軸的標記        plt.subplots_adjust(bottom = 0.15)         plt.xlabel(u‘分類出現次數‘)  # 圖表x軸的標記        plt.savefig(‘douban.png‘)   # 儲存圖片

 

下面說明一下matplotlib的一些簡單使用,首先我們要匯入matplotlib和numpy的包

import numpy as npimport matplotlib.pyplot as plt

 

這次可視化是柱狀圖,這裡給出brah()函數的定義:

barh()
主要功能:做一個橫向橫條圖,橫向條的矩形大小為: left, left + width, bottom, bottom + height
參數:barh ( bottom , width , height =0.8, left =0, **kwargs )
傳回型別:一個 class 類別, matplotlib.patches.Rectangle**執行個體
參數說明:

  • bottom: Bars 的垂直位置的底部邊緣

  • width: Bars 的長度
    選擇性參數:

  • height: bars 的高度

  • left: bars 左邊緣 x 軸座標值

  • color: bars 顏色

  • edgecolor: bars 邊緣顏色

  • linewidth: bar 邊緣寬度;None 表示預設寬度;0 表示不 i 繪製邊緣

  • xerr: 若不為 None,將在 bar 圖上產生 errobars

  • yerr: 若不為 None,將在 bar 圖上產生 errobars

  • ecolor: 指定 errorbar 顏色

  • capsize: 指定 errorbar 的頂部(cap)長度

  • align: ‘edge’ (預設) | ‘center’:‘edge’以底部為準對齊;‘center’以 y 軸作為中心

  • log: [False|True] False (預設),若為 True,使用 log 座標

然後就可以顯示出圖片來了

 

 

原文地址:爬取豆瓣電影top250提取電影分類進行資料分析

【轉】爬取豆瓣電影top250提取電影分類進行資料分析

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.