denise-jans-1126562-unsplash
 程式與統計資料處理

網路爬蟲 web crawler | 奇摩電影 yahoo movies | using Python

本篇學習筆記將要示範如何使用 Python 來執行 網路爬蟲 web crawler,並以爬取雅虎奇摩電影的「每週新片」頁面資訊為例。筆記包含以下部分:(1)解讀網頁資訊 (2) 萃取資訊 (3) 將資訊整理成data frame (4) 將電影爬蟲寫成函式 (5) 自動化判斷所有分頁url並套用電影爬蟲函數。

(1) 解讀網頁資訊

載入所需套件

指定URL資訊

解讀(parse)網頁HTML

(2) 將「每週新片」的中英文片名、電影介紹、預告片連結爬下來

2-1. 中英文片名

先找到中英文片名在html架構中的規則(可右鍵點擊感興趣物件,並選擇「檢查」)(如下圖)。

網路爬蟲-web-crawler

並使用.find_all()找出soup中物件為’div’且class_類別為”release_movie_name”的所有元素,集結成一個list (named newMovie2),每個元素彼此使用逗號間隔。

但每個class = ”release_movie_name”的元素中,並不是每個標籤都是我們感興趣的,為了萃取感興趣資訊,我們再從newMovies2 list中,一個一個元素去找出class = ‘gabtn’ 的標籤中的文字(如下段落所示),並將換行與空白字符取消,存取成一個新的list (named NameCHs)

gabtn” data-ga=”[‘本週新片’,’本週新片_本週新片第1頁’,’密弑遊戲’]”
href=”https://movies.yahoo.com.tw/movieinfo_main/
%E5%AF%86%E5%BC%91%E9%81%8A%E6%88%B2-escape-room-9572″>密弑遊戲

同理,找出英文片名的文字。

2-2. 預告片連結

一樣,檢視感興趣目標在HTML中的結構規則。

網路爬蟲-web-crawler

找出所有class_為release_btn color_btnbox的div。

並從newMovie3 list中,進一步取出元素中class_為btn_s_vedio gabtn連結標籤中的連結href。

2-3. 電影介紹文

檢查介紹文的HTML規則,發現介紹文會夾帶在class = ‘release_text’的div中。

網路爬蟲-web-crawler

取出介紹文,並清理換行等符號。

檢查NameCHs, NameENs, Intros, links陣列的長度是否相同(結果皆為10)。

(3) 將以上欄位合併成data frame

網路爬蟲-web-crawler

由於以上只是「本週新片」中的其中一個分頁的電影爬蟲結果,如果想要快速爬取其他分頁的資訊,可將電影爬蟲寫成一個function。

(4) 將電影爬網規則寫成function

define 一個名為「yahooMovieParser」的函數,並以url為投入參數。

執行單一URL: 手動指定url並投入函式。

網路爬蟲-web-crawler

執行多個URLs

將多個 url包成一個陣列 list 使用迴圈執行並回傳一個data frame

螢幕快照 2019-03-03 上午10.32.13

但由於分頁的URLs都還是人工判斷,如果可以用程式規則判斷並蒐集所有分頁,將省去更多工。

(5) 自動判斷分頁資訊,蒐集urlList

首先,一樣先找到分頁資訊的區塊,並檢視其HTML結構。發現分頁資訊會被包含在class = ‘page_numbox’的div物件中。

網路爬蟲-web-crawler

撰寫一個萃取分頁URL資訊的函式。

  • 將分頁資訊的每個
  • 元素中的連結取出,假設沒有連結資訊,則回傳None。

測試函式getNext()執行一次的結果。

使用while迴圈反覆執行,直到getNext()回傳None。

檢視所有的分頁連結 (當分頁數很多時特別有效)

綜合(1) ~ (5)電影爬蟲程式碼,自動化執行url List蒐集並爬取每個分頁下的最新電影資訊的程式碼如下:

螢幕快照 2019-03-03 上午10.32.13


更多Python網路爬蟲學習筆記:

網路爬蟲 Web Crawler | 資料不求人 基礎篇 | using Python BeautifulSoup

網路爬蟲 web crawler | 奇摩電影 yahoo movies | using Python

Text Mining & 網路爬蟲 web crawler | Google新聞與文章文字雲 | Python

在《網路爬蟲 web crawler | 奇摩電影 yahoo movies | using Python》中有 2 則留言

  1. 版主您好:
    謝謝您的分享,讓剛開始自學與接觸Python的我,有很多學習上的幫助,謝謝您了!
    不好意思,不知道能否請教您?謝謝囉~
    在使用版主您的程式碼來學習中,一直在第四步驟的地方發生了錯誤訊息(如下),想了好久也沒辦法解決….
    所以就來向板主您求救了,謝謝您了~
    (1)(2)(3)執行上都很順利
    (4)-1 :將電影爬網規則寫成function,並執行單一URL: 手動指定url並投入函式,也很順利的產生dataframe
    以下為版主您的原始程式碼————————————————————————-
    url = “https://movies.yahoo.com.tw/movie_thisweek.html”
    df1 = yahooMovieParser(url)
    df1

    但一直在(4)-2:將多個 url包成一個陣列 list 使用迴圈執行並回傳一個data frame,確一直出現錯誤訊息如下:
    以下為版主您的原始程式碼—————————————————————
    urlList = [‘https://movies.yahoo.com.tw/movie_thisweek.html’,’https://movies.yahoo.com.tw/movie_thisweek.html?page=2′]
    MovieInfo = None

    for u in urlList:
    d1 = yahooMovieParser(u)
    if MovieInfo is None:
    MovieInfo = d1
    else:
    MovieInfo = MovieInfo.append(d1,ignore_index=True)

    MovieInfo

    以下為錯誤訊息———————————————————————-
    TypeError Traceback (most recent call last)
    in
    3
    4 for u in urlList:
    —-> 5 d1 = yahooMovieParser(u)
    6 if MovieInfo is None:
    7 MovieInfo = d1

    in yahooMovieParser(url)
    16 # 預告片
    17 newMovie3 = soup.find_all(‘div’,class_=”release_btn color_btnbox”)
    —> 18 links = [t.find(‘a’,class_=”btn_s_vedio gabtn”)[‘href’] for t in newMovie3]
    19 # 電影介紹
    20 newMovie4 = soup.find_all(‘div’,class_=”release_text”)

    in (.0)
    16 # 預告片
    17 newMovie3 = soup.find_all(‘div’,class_=”release_btn color_btnbox”)
    —> 18 links = [t.find(‘a’,class_=”btn_s_vedio gabtn”)[‘href’] for t in newMovie3]
    19 # 電影介紹
    20 newMovie4 = soup.find_all(‘div’,class_=”release_text”)

    TypeError: ‘NoneType’ object is not subscriptable

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *