2020年11月8日 星期日

[python抓爬仔]~~python BS4初體驗(抓取udn熱門新聞)

 python的確是個相當好玩、實用的工具!快又有效的特質讓他在程式語言的喜好度迅速攀升。

不管是小酌或大宴兩相宜啊!網路資料的擷取或是所謂的爬蟲也是個有趣且實用的議題,值得開個「抓爬仔」專區(呵~~ ^^|||)來記錄一下學習歷程。

這次呢~~就簡單先以安裝這支著名的Beautiful Soup 4(bs4)模組,並簡單看看如何應用在網路新聞的擷取應用上。

認識更多關於Beautiful Soup 4(bs4)的知識

本次學習目標~~:

一、如何將目標網站(以聯合新聞網(UDN)為例)內容擷取下來。

二、分析擷取的網站內容,分析並條列出我們所需的內容(本次以條析熱門新聞標題及網址為例)。

首先~~由於bs4並非python安裝的標準程式庫,所以必須要先安裝bs4,而後再進行目標網站的擷取、分析與整理、輸出工作,大致上可分成以下步驟進行:

step1.安裝Beautiful Soup 4(bs4)pip install beautifulsoup4

step2.在程式中引入bs4模組 from bs4 import BeautifulSoup

step3.應用requests模組引入並擷取目標網站內容: requests.get('目標網站網址')

step4.整理、解析目標網站擷取之網頁內容

BeautifulSoup(擷取的網頁內容, 'html.parser')

soup.find_all('查找的html Tag(標籤)')

step5.整理並輸出解析結果

大致上就是這樣啦~~~(但非絕對喔~程式存乎一心啊!)

===========================================================

好~~基本的心得介紹完,直接上這次的練習程式碼:

收先當然你得先知道及預設好你要擷取的網站網址囉~~~以本次練習而言就是

聯合新聞網-熱門新聞:https://udn.com/rank/pv/2


然後就是完整程式碼如下:

import requests
from bs4 import BeautifulSoup

# 下載 udn新聞網「熱門」新聞內容
r = requests.get('https://udn.com/rank/pv/2')

# 確認是否下載成功
if r.status_code == requests.codes.ok:
    print('ok')  # 後續可刪除或標註為註解
    # 以BeautifulSoup解析HTML程式碼
    soup = BeautifulSoup(r.text, 'html.parser')
    print(soup)   # 可先在此列出網站擷取內容進行分析(後續可刪除或標註為註解)

    # 以相對應之 HTML Tag 查找相關新聞
    stories = soup.find_all('a', class_='story-list__image--holder')

    for s in stories:   # 以for迴圈進行結果的條列與輸出
        if type(s.get('aria-label')) is str:   # 若新聞連結標題有文字內容
            print("標題:" + s['aria-label'])   # ←↓二種擷取資料內容的語法(將'aria-label標籤內容輸出)
            print("網址:" + s.get('href'))   # 將 href標籤內容輸出

就這樣~~~大概十來行的程式就可以完成了!

程式裡面的幾個關鍵點,可以對應到上述的步驟解析,大家可以自行對應理解,在這裡特別將幾個值得提醒的注意事項列出如下:

1.上列程式碼中的第9.12二行的print(...),主要是作為程式練習及撰寫過程中「檢核」之用,分別是確認目標網站連結、擷取是否正確(第9行)及查看目標網站擷取的HTML內容的解析結果(第12行),以便後續從擷取解析後的網站內容中查找相關內容。

(第9.12這二行~在程式正常運作後,可以刪除或標記為註解(#)以免影響程式最後顯示的成果)


接著是最重要的第15行,利用網頁中特定的HTML Tag(標籤)查找所要的網頁內容
這部分當然就要靠你解讀擷取下來的網頁內容功力囉~~~(當然還是有一些應用工具的小技巧~就後續再聊囉)
以本次範例而言,解析擷取我們所要的新聞標籤的方法之一,就如程式碼中的第15行所示。大家可以對應到網頁擷取解析後的語法中,進行思考及理解!
(當然前提是:你得對網頁的HTML CSS等有一些基礎的認識。能深入認識當然更好囉!)

基本上,透過第15行查找的結果,會以類似字典檔的方式進行存取,在本次範例中,我們將結果存成stories變數,以進行後續的輸出處理作業。


最後,就是使用for迴圈將解析查找到的新聞,一條一條的整理成新聞「標題」及「網址」的方式條列式輸出。

裡面涉及的一些python語法,若是未曾接觸過的可以順便認識、了解一下!(像是for迴圈、字典檔的操作等等),後續有機會也會再整理一些資料供大家參考!

了解基本的使用方法後,最能有成就感的練習方式自然是趕緊再找些你感興趣的網站,練習擷取、解析等工作,實際享受程式運作並呈現成果的樂趣!

後面會同樣再以相同網站練習另外一種解析網頁內容語法的方式,屆時大家再自行比較看看!

沒有留言:

張貼留言