2024年4月11日 星期四

Python 學習筆記 : 網頁爬蟲實戰 (二) BBC 金融財經新聞

今天要練習的爬蟲對象是 BBC 金融財經新聞, 網址如下 :


本系列之前的筆記參考 :



1. 分析網頁原始碼定位目標 :  

在 Chrome 瀏覽 BBC 金融財經新聞網頁, 可知它是一個分頁型的網站, 我們的目標只是要擷取其第一頁新聞的標題與網址, 按滑鼠右鍵點選 "檢視原始碼" : 




但是發現其原始碼似乎經過壓縮變成一長串難以閱讀 :




這可以透過 "DirtyMarkup" 這個線上服務讓 HTML 原始碼格式整齊化 :


將網頁原始碼複製貼上到該網站右邊的輸入框, 按左方的 "Clean" 鈕即可 : 




參考 :


我們要找的新聞標題與超連結則是具有 class='focusIndicatorDisplayBlock' 樣式類別的 a 元素裡 :

<h2 class="bbc-10m3zrw e47bds20">
  <a class="focusIndicatorDisplayBlock bbc-uk8dsi e1d658bg0" href="https://www.bbc.com/zhongwen/trad/world-68786731">
    越南有史以來最大金融詐騙案開庭:女富豪張美蘭是誰
  </a>
</h2>
<time class="promo-timestamp bbc-1qkagz5 e1mklfmt0" datetime="2024-04-11">
  6 小时前
</time>

當然也可以在建立 BeautifulSoup 物件後呼叫 prettify() 方法來得到格式整齊的原始碼. 上面黃底色部分是用來定位資料的線索 (樣式類別), 藍底色部分是目標資料. 


2. 資料擷取測試 :    

首先匯入 requests 與 bs4 套件中的 BeautifulSoup 類別 :

>>> import requests   
>>> from bs4 import BeautifulSoup  

用 requests.get() 方法對網站提出 GET 請求 : 

>>> url='https://www.bbc.com/zhongwen/trad/business'   
>>> response=requests.get(url)                         # 提出 GET 請求
>>> soup=BeautifulSoup(response.text)    # 建立 BeautifulSoup 物件

我們可以呼叫 soup.prettify() 方法並使用 print() 來輸出格式整齊的網頁原始碼, 目標是放在有 class="focusIndicatorDisplayBlock" 樣式屬性的 a 元素裡的超連結與文字內容 : 

<h2 class="bbc-10m3zrw e47bds20">
  <a class="focusIndicatorDisplayBlock bbc-uk8dsi e1d658bg0" href="https://www.bbc.com/zhongwen/trad/world-68786731">
    越南有史以來最大金融詐騙案開庭:女富豪張美蘭是誰
  </a>
</h2>
<time class="promo-timestamp bbc-1qkagz5 e1mklfmt0" datetime="2024-04-11">
  6 小时前
</time>

這樣就可以用 find_all() 搜尋帶有 focusIndicatorDisplayBlock 樣式類別的全部 a 元素 :

>>> links=soup.find_all('a', {'class': 'focusIndicatorDisplayBlock'})   

然後用迴圈走訪傳回的 a 元素 Tag 物件串列, 並呼叫 get() 方法取得 href 屬性取得超連結, 用 text 屬性取得其文字內容即可 :

>>> for link in links:      
    the_time=link.parent.next_sibling.text       # 取得新聞發布時間
    print(f'{link.text.strip()} ({the_time})')      # strip() 去除左右之空格等控制字元
    print(link.get('href', None))   # 取得超連結
    
越南有史以來最大金融詐騙案開庭:女富豪張美蘭是誰 (7 小时前)
https://www.bbc.com/zhongwen/trad/world-68786731
習近平會見美工商界代表:穩住外資同時鋪墊「三中全會」經濟改革 (2024年3月29日)
https://www.bbc.com/zhongwen/trad/business-68687690
中國年輕女性尋找「存錢搭子」,應對經濟困境 (2024年3月21日)
https://www.bbc.com/zhongwen/trad/business-68565927
來自中國的電商平台Temu如何顛覆美國的網購世界 (2024年3月19日)
https://www.bbc.com/zhongwen/trad/business-68604017
美國稱與中國貿易的下降也許是個積極信號 (2024年3月4日)
https://www.bbc.com/zhongwen/trad/world-68465292
過半省份2024GDP目標低於去年 中國經濟是否會進一步減速 (2024年2月19日)
https://www.bbc.com/zhongwen/trad/chinese-news-68335079
視頻, 香港經濟:農曆新年將至,市民感受如何、對經濟前景有何展望?節目全長, 5,39 (2024年2月7日)
https://www.bbc.com/zhongwen/trad/business-68224953
中國股市暴跌後,美國駐華使館微博成網友「哭牆」 (2024年2月5日)
https://www.bbc.com/zhongwen/trad/business-68201487
中國河南等省爆出GDP增速「改降為升」 「數據注水」的背後原因 (2024年1月31日)
https://www.bbc.com/zhongwen/trad/business-68153559
北京施壓與台灣「斷交潮」持續:民眾有何看法?邦交國會否「清零」? (2024年1月25日)
https://www.bbc.com/zhongwen/trad/world-68090660
中國經濟「三駕馬車」速度不均 2024需消除「信心赤字」 (2024年1月22日)
https://www.bbc.com/zhongwen/trad/business-68046635
香港「搶人才」策略能否吸引拖家帶口的大陸中年人士 (2024年1月12日)
https://www.bbc.com/zhongwen/trad/chinese-news-67944245
波音737 Max再次發生事故 監管單位追查 (2024年1月8日)
https://www.bbc.com/zhongwen/trad/science-67910238
習近平抵達越南展開訪問 修補中越「愛恨交織」的關係 (2023年12月12日)
https://www.bbc.com/zhongwen/trad/world-67689132
穆迪看衰中國經濟 政治局會議稱要加碼財政政策 (2023年12月8日)
https://www.bbc.com/zhongwen/trad/chinese-news-67660504
美國《香港經貿辦認證法》能帶來的實際影響 (2023年12月2日)
https://www.bbc.com/zhongwen/trad/chinese-news-67598929
視頻, 中國電動汽車市場快速增長,清潔能源成關鍵競爭領域節目全長, 3,02 (2023年12月1日)
https://www.bbc.com/zhongwen/trad/science-67586692
OpenAI聯合創始人山姆·阿爾特曼遭罷免後復職:我們都知道些什麼 (2023年11月23日)
https://www.bbc.com/zhongwen/trad/business-67484587
台灣人餐桌上的美中台外交角力:從洪都拉斯的白蝦談起 (2023年11月21日)
https://www.bbc.com/zhongwen/trad/chinese-news-67482759
郭台銘宣佈參選台灣總統兩個月後,其創辦的富士康在中國遭稅務調查 (2023年10月23日)
https://www.bbc.com/zhongwen/trad/chinese-news-67193077
「一帶一路」論壇之際習近平會晤普京 「共同威脅只會加強中俄關係」 (2023年10月18日)
https://www.bbc.com/zhongwen/trad/chinese-news-67142359
視頻, 「一帶一路」論壇:多國領導人齊聚北京 習近平與普京舉行雙邊會談節目全長, 3,28 (2023年10月18日)
https://www.bbc.com/zhongwen/trad/chinese-news-67144911
晶片大戰:台灣廠商助攻華為突破美國封鎖? (2023年10月18日)
https://www.bbc.com/zhongwen/trad/chinese-news-67084358
中國時隔四年再開「一帶一路」峰會的三大看點 (2023年10月17日)
https://www.bbc.com/zhongwen/trad/chinese-news-67132988

注意, 這裡因為我們直接取得 a 元素的 Tag 物件, 因此使用走訪親代 (父節點 parent) 再走訪平輩 (兄弟節點 next_sibling) 的方法取得 time 元素. 


3. 財經新聞標題擷取函式 :    

最後將上面的測試寫成一個函式 get_bbc_business_news() :

import requests
from bs4 import BeautifulSoup

def get_bbc_business_news():
    url='https://www.bbc.com/zhongwen/trad/business'
    response=requests.get(url)
    soup=BeautifulSoup(response.text, 'lxml')
    links=soup.find_all('a', {'class': 'focusIndicatorDisplayBlock'})
    title=[]
    href=[]
    for link in links:
        the_time=link.parent.next_sibling.text
        title.append(f'{link.text.strip()} ({the_time})')          
        href.append(link.get('href', None))
    return title, href

if __name__ == '__main__':
    title, href=get_bbc_business_news()
    for k, v in zip(title, href):
        print(k)
        print(v)

此處 get_bbc_business_news() 會傳回一個由標題串列, 超連結串列組成的 tuple, 將傳回值 title, href 傳給 zip() 來產生一個類似字典的 zip 物件 (以 title 為鍵, 以 href 為值), 然後用 print() 印出 k, v 值, 結果與上面一樣. 

沒有留言 :