Python爬取豆瓣Top250電影中2000年後上映的影片信息

Python爬取豆瓣Top250電影中2000年後上映的影片信息

前言

雙十一前加在京東購物車的一個東西,價格330,Plus會員用券後差不多310。雙十一當天打開看了下399,還得去搶滿300減100的券。不得不說,套路真的深,京東是越來越沒底線,吐槽一下。

考慮寫個爬蟲把部分商品信息價格優惠記錄一下,近期忙到吐血,也沒開始嘗試。看大家第一條爬蟲教學都是爬豆瓣電影信息(不過大多都已經不能運行,豆瓣的格式改過了),果真是娛樂至上的年代啊。。

我也遵從前輩們走過的路,來一遍爬取豆瓣Top250電影


準備

環境:Python2.7.15 64-bit
依賴庫:urllib2

urllib2安裝

pip install urllib2

urllib2簡介

這段轉自:https://blog.csdn.net/qq_41185868/article/details/80488303

urllib和urllib2之間PK
1、在python中,urllib和urllib2不可相互替代的。 整體來說,urllib2是urllib的增強,但是urllib中有urllib2中所沒有的函數。
      urllib2可以用urllib2.openurl中設置Request參數,來修改Header頭。如果你訪問一個網站,想更改User Agent(可以僞裝你的瀏覽器),你就要用urllib2.
      urllib支持設置編碼的函數,urllib.urlencode,在模擬登陸的時候,經常要post編碼之後的參數,所以要想不使用第三方庫完成模擬登錄,你就需要使用urllib。
     urllib一般和urllib2一起搭配使用
2、urllib 和urllib2都是接受URL請求的相關模塊,但是提供了不同的功能。兩個最顯著的不同如下:
      urllib提供urlencode方法用來GET查詢字符串的產生,而urllib2沒有。這是爲何urllib常和urllib2一起使用的原因。
      urllib2可以接受一個Request類的實例來設置URL請求的headers,urllib僅可以接受URL。這意味着,你不可以僞裝你的User Agent字符串等(僞裝瀏覽器)。
      urllib2模塊比較優勢的地方是urlliburllib2.urlopen可以接受Request對象作爲參數,從而可以控制HTTP Request的header部分。
      urllib2模塊沒有加入urllib.urlretrieve函數以及urllib.quote等一系列quote和unquote功能,因此有時也需要urllib的輔助
      urllib2在python3中被修改爲urllib.request。

相關文章
urllib 
urllib2
urllib3
python的httplib、urllib和urllib2的區別及其應用
深入理解urllib、urllib2及requests


分析網頁信息

<col class="grid_view">
    <li>
        <div class="item">
            <div class="pic">
                <em class="">1</em>
                <a href="http://movie.douban.com/subject/1292052/">
                    <img alt="肖申克的救贖" src="http://img3.douban.com/view/movie_poster_cover/ipst/public/p480747492.jpg" class="">
                </a>
            </div>
            <div class="info">
                <div class="hd">
                    <a href="http://movie.douban.com/subject/1292052/" class="">
                        <span class="title">肖申克的救贖</span>
                                <span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>
                            <span class="other">&nbsp;/&nbsp;月黑高飛(港)  /  刺激1995(臺)</span>
                    </a>


                        <span class="playable">[可播放]</span>
                </div>
                <div class="bd">
                    <p class="">
                        導演: 弗蘭克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·羅賓斯 Tim Robbins /...<br>
                        1994&nbsp;/&nbsp;美國&nbsp;/&nbsp;犯罪 劇情
                    </p>

                    
                    <div class="star">
                            <span class="rating5-t"><em>9.6</em></span>
                            &nbsp;<span>646374人評價</span>
                    </div>

                        <p class="quote">
                            <span class="inq">希望讓人自由。</span>
                        </p>
                </div>
            </div>
        </div>
    </li>

正則表達式

pattern = re.compile(u'<li>.*?<div.*?class="item">.*?<div.*?class="pic">.*?'
            + u'<em.*?class="">(.*?)</em>.*?'           # 排名
            + u'<div.*?class="info">.*?<span.*?class="title">(.*?)</span>.*?'        # 電影名
            + u'<span.*?class="other">&nbsp;/&nbsp;(.*?)</span>.*?</a>.*?' # 電影別名
            # + u'<div.*?class="bd">.*?<p.*?class="">.*?'
            + u'導演: (.*?)&nbsp;&nbsp;&nbsp;'        # 導演
            + u'主演: (.*?)<br>'                      # 主演
            + u'(.*?)&nbsp;/&nbsp;'      # 年份
            + u'(.*?)&nbsp;/&nbsp;'      # 原產國
            + u'(.*?)</p>'               # 類型
            + u'.*?<div.*?class="star">.*?property="v:average">(.*?)</span>'   # 平均評分
            + u'.*?<span>(.*?)人評價</span>.*?<p.*?class="quote">.*?'          # 評論數
            + u'<span.*?class="inq">(.*?)</span>.*?</li>', re.S)      

完整代碼

# -*- coding:utf-8 -*-
import urllib2
import re
import sys

class MovieTop250:
    def __init__(self):
        #設置默認編碼格式爲utf-8
        reload(sys)
        sys.setdefaultencoding('utf-8')
        self.start = 0
        self.param = '&filter=&type='
        self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)'}
        self.movieList = []
        self.filePath = './DoubanTop250.txt'
    
    def getPage(self):
        try:
            URL = 'http://movie.douban.com/top250?start=' + str(self.start)
            request = urllib2.Request(url = URL, headers = self.headers)
            response = urllib2.urlopen(request)
            page = response.read().decode('utf-8')
            pageNum = (self.start + 25)/25
            print('正在抓取第' + str(pageNum) + '頁數據...' )
            self.start += 25
            return page
        except e:
            if hasattr(e, 'reason'):
                print('抓取失敗,具體原因:', e.reason)
    
    def getMovie(self):
        pattern = re.compile(u'<li>.*?<div.*?class="item">.*?<div.*?class="pic">.*?'
                    + u'<em.*?class="">(.*?)</em>.*?'           # 排名
                    + u'<div.*?class="info">.*?<span.*?class="title">(.*?)</span>.*?'        # 電影名
                    + u'<span.*?class="other">&nbsp;/&nbsp;(.*?)</span>.*?</a>.*?' # 電影別名
                    # + u'<div.*?class="bd">.*?<p.*?class="">.*?'
                    + u'導演: (.*?)&nbsp;&nbsp;&nbsp;'        # 導演
                    + u'主演: (.*?)<br>'                      # 主演
                    + u'(.*?)&nbsp;/&nbsp;'      # 年份
                    + u'(.*?)&nbsp;/&nbsp;'      # 原產國
                    + u'(.*?)</p>'               # 類型
                    + u'.*?<div.*?class="star">.*?property="v:average">(.*?)</span>'   # 平均評分
                    + u'.*?<span>(.*?)人評價</span>.*?<p.*?class="quote">.*?'          # 評論數
                    + u'<span.*?class="inq">(.*?)</span>.*?</li>', re.S)      
        while self.start <= 225:
            page = self.getPage()
            movies = re.findall(pattern, page)
            for movie in movies:
                self.movieList.append([movie[0], movie[1], movie[2].lstrip('&nbsp;/&nbsp;'), 
                      movie[3].lstrip('&nbsp;/&nbsp;'), movie[4], 
                      movie[5], movie[6].lstrip(), movie[7], movie[8].rstrip(),
                      movie[9], movie[10]])
    
    def writeTxt(self):
        fileTop250 = open(self.filePath, 'w')
        try:
            for movie in self.movieList:
                playDateY = str(movie[5]).replace("\n", "").lstrip()
                if len(playDateY) == 4:
                    yNum = int(playDateY)
                    if(yNum < check_year):
                        continue

                fileTop250.write('電影排名:' + movie[0] + '\r\n')
                fileTop250.write('電影名稱:' + movie[1] + '\r\n')
                fileTop250.write('外文名稱:' + movie[2] + '\r\n')
                fileTop250.write('導演姓名:' + movie[3] + '\r\n')
                fileTop250.write('參與主演:' + movie[4] + '\r\n')
                fileTop250.write('上映年份:' + str(movie[5]).replace("\n", "").lstrip() + '\r\n')
                fileTop250.write('製作國家/地區:' + movie[6] + '\r\n')
                fileTop250.write('電影類別:' + str(movie[7]).replace("\n", "") + '\r\n')
                fileTop250.write('電影評分:' + movie[8] + '\r\n')
                fileTop250.write('參評人數:' + movie[9] + '\r\n')
                fileTop250.write('簡短影評:' + movie[10] + '\r\n\r\n')
            print('文件寫入成功...')
        finally:
            fileTop250.close()
    
    def main(self):
        print('正在從豆瓣電影Top250抓取數據...')
        self.getMovie()
        self.writeTxt()
        print('抓取完畢...')

# 2000年以前的電影不關心
check_year = 2000
DouBanSpider = MovieTop250()
DouBanSpider.main()

## 運行

/Users/l2xin/Documents/Gitee/PythonUitls/WebCrowler/MovieTop250.py
正在從豆瓣電影Top250抓取數據...
正在抓取第1頁數據...
正在抓取第2頁數據...
正在抓取第3頁數據...
正在抓取第4頁數據...
正在抓取第5頁數據...
正在抓取第6頁數據...
正在抓取第7頁數據...
正在抓取第8頁數據...
正在抓取第9頁數據...
正在抓取第10頁數據...
文件寫入成功...
抓取完畢...

DoubanTop250.txt

電影排名:7
電影名稱:千與千尋
外文名稱:神隱少女(臺)  /  Spirited Away
導演姓名:宮崎駿 Hayao Miyazaki
參與主演:柊瑠美 Rumi Hîragi / 入野自由 Miy...
上映年份:2001
製作國家/地區:日本
電影類別:劇情 動畫 奇幻                        
電影評分:9.3
參評人數:872152
簡短影評:最好的宮崎駿,最好的久石讓。 

電影排名:9
電影名稱:盜夢空間
外文名稱:潛行兇間(港)  /  全面啓動(臺)
導演姓名:克里斯托弗·諾蘭 Christopher Nolan
參與主演:萊昂納多·迪卡普里奧 Le...
上映年份:2010
製作國家/地區:美國 英國
電影類別:劇情 科幻 懸疑 冒險                        
電影評分:9.3
參評人數:961314
簡短影評:諾蘭給了我們一場無法盜取的夢。

電影排名:10
電影名稱:機器人總動員
外文名稱:瓦力(臺)  /  太空奇兵·威E(港)
導演姓名:安德魯·斯坦頓 Andrew Stanton
參與主演:本·貝爾特 Ben Burtt / 艾麗...
上映年份:2008
製作國家/地區:美國
電影類別:愛情 科幻 動畫 冒險                        
電影評分:9.3
參評人數:636867
簡短影評:小瓦力,大人生。

電影排名:11
電影名稱:忠犬八公的故事
外文名稱:忠犬小八(臺)  /  秋田犬八千(港)
導演姓名:萊塞·霍爾斯道姆 Lasse Hallström
參與主演:理查·基爾 Richard Ger...
上映年份:2009
製作國家/地區:美國 英國
電影類別:劇情                        
電影評分:9.3
參評人數:621135
簡短影評:永遠都不能忘記你所愛的人。

···

其他

某些地方正則匹配還有問題,正則實在是不熟,以後再慢慢玩。

電影排名:23
電影名稱:觸不可及
外文名稱:閃亮人生(港)  /  逆轉人生(臺)
導演姓名:奧利維·那卡什 Olivier Nakache / 艾力克·託蘭達 Eric Toledano&nbsp;&nbsp;&nbsp;主...<br>
                            2011&nbsp;/&nbsp;法國&nbsp;/&nbsp;劇情 喜劇
                        </p>

                        
                        <div class="star">
                                <span class="rating45-t"></span>
                                <span class="rating_num" property="v:average">9.2</span>
                                <span property="v:best" content="10.0"></span>
                                <span>463398人評價</span>
                        </div>

                            <p class="quote">
                                <span class="inq">滿滿溫情的高雅喜劇。</span>
                            </p>
                    </div>
                </div>
            </div>
        </li>
        <li>
            <div class="item">
                <div class="pic">
                    <em class="">24</em>
                    <a href="https://movie.douban.com/subject/3319755/">
                        <img width="100" alt="怦然心動" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p663036666.jpg" class="">
                    </a>
                </div>
                <div class="info">
                    <div class="hd">
                        <a href="https://movie.douban.com/subject/3319755/" class="">
                            <span class="title">怦然心動</span>
                                    <span class="title">&nbsp;/&nbsp;Flipped</span>
                                <span class="other">&nbsp;/&nbsp;萌動青春  /  青春萌動</span>
                        </a>


                            <span class="playable">[可播放]</span>
                    </div>
                    <div class="bd">
                        <p class="">
                            導演: 羅伯·萊納 Rob Reiner
參與主演:瑪德琳·卡羅爾 Madeline Carroll / 卡...
上映年份:2010
製作國家/地區:美國
電影類別:劇情 喜劇 愛情                        
電影評分:9.0
參評人數:746761
簡短影評:真正的幸福是來自內心深處。

參考

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