Python抓取豆瓣Top250電影信息

買了本書,《Python 3.5從零開始學》,根據書中例程改寫了一個抓取豆瓣Top250電影信息的小爬蟲練練手,完成了爬取信息寫入文件,Linux下編譯通過。

 

#!/usr/bin/python3
# *_* coding:utf8 *_*

from urllib import request
from http import cookiejar
import re
import pymysql


class MovieTop(object):

    def __init__(self):
        self.start=0
        self.param='&filter='
        self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1;WOW64)'}
        self.movie_list=[]     #用於保存電影信息
        self.page_content=[]   #用於保存網頁內容

    def get_page(self):
        try:
            while self.start<255: #255
                #豆辨top250網址
                url='https://movie.douban.com/top250?start='+str(self.start)
                req=request.Request(url,headers=self.headers)
                response=request.urlopen(req)
                page=response.read().decode('utf-8')
                page_num=(self.start+25)/25
                print('正在抓取,第'+str(page_num)+'頁數據...')
                self.start+=25
                self.page_content.append(page)
        except request.URLError as e:
            if hasattr(e,'reason'):
                print('抓取失敗,失敗原因:',e.reason)

    def get_movies(self):

        #獲取網頁內容
        self.get_page()
        #解析網頁內容
        reObj = re.compile(u'<div.*?class="item">.*?'
                           + u'<div.*?class="pic">.*?'
                           + u'<em.*?class="">(.*?)</em>.*?'
                           + u'<div.*?class="info">.*?'
                           + u'<span.*?class="title">(.*?)'
                           + u'</span>.*?<span.*?class="title">&nbsp;/&nbsp;(.*?)</span>.*?'
                           + u'<span.*?class="other">&nbsp;/&nbsp;(.*?)</span>.*?</a>.*?'
                           + u'<div.*?class="bd">.*?<p.*?class="">.*?'
                           + u'導演: (.*?)&nbsp;&nbsp;&nbsp;.*?<br>'
                           + u'\n\D*(.*?)&nbsp;/&nbsp;(.*?)&nbsp;/&nbsp;'
                           + u'(.*?)\n\D*</p>.*?<div.*?class="star">.*?'
                           + u'<span.*?'
                           + u'class="rating_num".*?property="v:average">'
                           + u'(.*?)</span>.*?'
                           + u'.*?<span>(.*?)人評價</span>.*?'
                           + u'<p.*?class="quote">.*?'
                           + u'<span.*?class="inq">(.*?)'
                           + u'</span>.*?</p>', re.S)

        movies = reObj.findall(' '.join(self.page_content))

        #保存到movie_list
        for movie in movies:
            self.movie_list.append([movie[0],
                                    movie[1],
                                    movie[2],
                                    movie[3],
                                    movie[4],
                                    movie[5],
                                    movie[6],
                                    movie[7],
                                    movie[8],
                                    movie[9],
                                    movie[10]])

    #TODO:保存到失據庫
    def  save_to_db(self,movies):
        # 建立連接
        db = pymysql.connect('localhost', 'root', 'xxxx', 'test')
        # 第一,遊標
        cursor = db.cursor()
        # 執行語句
        cursor.execute('select * from movies')
        # 取一行
        data = cursor.fetchone()

        print(data)

        # 關閉連接
        db.close()

    #保存到文件
    def write_to_file(self):
        f_name = 'douban_movies'
        fp = open(f_name, 'w')

        for movie in self.movie_list:
            fp.write('電影排名:' + movie[0] + '\r\n')
            fp.write('電影名稱:' + movie[1] + '\r\n')
            fp.write('外文名稱:' + movie[2] + '\r\n')
            fp.write('電影別名:' + movie[3] + '\r\n')
            fp.write('導演姓名:' + movie[4] + '\r\n')
            fp.write('上映年份:' + movie[5] + '\r\n')
            fp.write('製作國家/地區:' + movie[6] + '\r\n')
            fp.write('電影類別:' + movie[7] + '\r\n')
            fp.write('電影評分:' + movie[8] + '\r\n')
            fp.write('參評人數:' + movie[9] + '\r\n')
            fp.write('簡短影評:' + movie[10] + '\r\n\r\n')

        fp.close()
        print("電影數據寫入文件完畢!")

if __name__ == "__main__":
    #創建對象
    mt=MovieTop()
    print("開始數據抓取...")
    mt.get_movies()
    mt.write_to_file()
    print("數據抓取完成!")

 

結果示例:

 

電影排名:1
電影名稱:肖申克的救贖
外文名稱:The Shawshank Redemption
電影別名:月黑高飛(港)  /  刺激1995(臺)
導演姓名:弗蘭克·德拉邦特 Frank Darabont
上映年份:1994
製作國家/地區:美國
電影類別:犯罪 劇情
電影評分:9.7
參評人數:1917025
簡短影評:希望讓人自由。

電影排名:2
電影名稱:霸王別姬
外文名稱:Forrest Gump
電影別名:福雷斯特·岡普
導演姓名:羅伯特·澤米吉斯 Robert Zemeckis
上映年份:1994
製作國家/地區:美國
電影類別:劇情 愛情
電影評分:9.5
參評人數:1457430
簡短影評:一部美國近現代史。

電影排名:4
電影名稱:這個殺手不太冷
外文名稱:Léon
電影別名:殺手萊昂  /  終極追殺令(臺)
導演姓名:呂克·貝鬆 Luc Besson
上映年份:1994
製作國家/地區:法國
電影類別:劇情 動作 犯罪
電影評分:9.4
參評人數:1652942
簡短影評:怪蜀黍和小蘿莉不得不說的故事。

電影排名:5
電影名稱:美麗人生
外文名稱:La vita è bella
電影別名:一個快樂的傳說(港)  /  Life Is Beautiful
導演姓名:羅伯託·貝尼尼 Roberto Benigni
上映年份:1997
製作國家/地區:意大利
電影類別:劇情 喜劇 愛情 戰爭
電影評分:9.5
參評人數:923870
簡短影評:最美的謊言。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章