iT邦幫忙

2022 iThome 鐵人賽

DAY 25
0

很可惜,昨天太忙忘記撰寫第26天的文章,但我還是會完成30天的文章。

今日大綱

  • 爬蟲介紹
  • 搜尋HTML特定的標籤與屬性
  • 搜尋CSS特定的屬性
  • CSS選擇器
  • 其他函數

爬蟲介紹

爬蟲技術可以應用於許多的程式開發,例如利用爬取下來的資料製作Ling bot提供使用者相關資訊,減少了上網找資料的時間。本篇我們先將介紹靜態爬蟲技術Beautiful Soup。

在進行講解前需要先安裝requests以及beautifulsoup4這兩個套件。

Pip install beautifulsoup4
Pip install requests

首先利用request將網頁的HTML抓取下來,接著利用beautifulsoup呈現內容。這個案例所使用的網址是ETtoday寵物雲的網站

import requests
from bs4 import BeautifulSoup

url = "https://pets.ettoday.net/"
response = requests.get(url)
bs = BeautifulSoup(response.text, "html.parser")
print(bs)

輸出結果

<!DOCTYPE html>

<html itemscope="" itemtype="http://schema.org/WebSite" lang="zh-Hant" prefix="og:http://ogp.me/ns#">
<head>
<meta charset="utf-8"/>
<title>ETtoday寵物雲 | ETtoday新聞雲</title>
<link href="https://pets.ettoday.net" rel="canonical"/>
<!-- 網頁社群分享meta 開始 -->
<meta content="https://pets.ettoday.net" itemprop="url" property="og:url">
<meta content="ETtoday寵物雲 | ETtoday新聞雲" itemprop="name" property="og:title"/>
<meta content="https://cdn2.ettoday.net/style/pets2017/images/push.jpg" itemprop="image" property="og:image"/>
<meta content="image/jpeg" property="og:image:type"/>
<meta content="1200" property="og:image:width"/>
<meta content="628" property="og:image:height"/>
<meta content="website" property="og:type"/>
<meta content="我們期待做一個真誠、專業、快樂的媒體平台!分享寵物大小新聞、寓教於樂的寵物知識、溫馨可愛幽默的小故事。期許每個人都能更重視生命,愛護身邊的寵物/動物伴侶,一起和諧愉快的生活" name="description"/>
<meta content="我們期待做一個真誠、專業、快樂的媒體平台!分享寵物大小新聞、寓教於樂的寵物知識、溫馨可愛幽默的小故事。期許每個人都能更重視生命,愛護身邊的寵物/動物伴侶,一起和諧愉快的生活" itemprop="description" property="og:description"/>
<!-- 網頁社群分享meta 結束 -->
<!-- 基本meta 開始 -->
<meta content="width=1200" name="viewport"/>
<meta content="index,follow,noarchive" name="robots"/>
<link href="//cdn2.ettoday.net/style/pets2017/images/touch-icon.png" rel="apple-touch-icon" sizes="180x180"/>
<link href="//cdn2.ettoday.net/style/pets2017/images/touch-icon.png" rel="shortcut icon" sizes="192x192"/>
<link href="https://feeds.feedburner.com/ettoday/pet" rel="alternate" title="ETtoday《寵物動物新聞》" type="application/rss+xml"/>
<!-- 基本meta 結束 -->
<!-- dns-prefetch 開始 -->
<link href="//ad.ettoday.net" rel="dns-prefetch"/>
<link href="//ad1.ettoday.net" rel="dns-prefetch"/>
<link href="//ad2.ettoday.net" rel="dns-prefetch"/>
<link href="//cache.ettoday.net" rel="dns-prefetch"/>
<link href="//static.ettoday.net" rel="dns-prefetch"/>
<link href="//cdn1.ettoday.net" rel="dns-prefetch"/>
<link href="//cdn2.ettoday.net" rel="dns-prefetch"/>
<!-- dns-prefetch 結束 -->
<!-- 社群專用 開始 -->
<meta content="zh_TW" property="og:locale"/>
<meta content="146858218737386" property="fb:app_id"/>
<meta content="ETtoday寵物雲" name="application-name" property="og:site_name"/>
<meta content="https://www.facebook.com/ETtodayPETS" property="article:publisher"/>
<!-- 社群專用 結束 -->
<!-- CSS、JS 開始 -->
<link href="//cdn2.ettoday.net/style/pets2017/css/style.css" rel="stylesheet"/>
<link href="//cdn2.ettoday.net/jquery/bxslider/jquery.bxslider.css" rel="stylesheet"/>
<script src="//cdn2.ettoday.net/jquery/jquery.js"></script>
<script src="//cdn2.ettoday.net/jquery/jquery.cookie.js"></script>
<script src="//cdn2.ettoday.net/jquery/jquery.lazyload.min.js"></script>
<script src="//cdn2.ettoday.net/jquery/bxslider/jquery.bxslider.js"></script>
<script src="//cdn2.ettoday.net/style/pets2017/js/common.js"></script>
<!-- CSS、JS 結束 -->
<!-- DFP 開始-->
<script src="//cdn2.ettoday.net/dfp/dfp-gpt.js" type="text/javascript"></script>
<!-- DFP 結束-->
<!-- Google Tag Manager 開始 -->
<!--GTM DataLayer 開始-->

...

<div class="piece">
<a class="pic" href="//pets.ettoday.net/news/2355085" target="_blank" title="凶狠「魚虎」現蹤!台東活水湖清除泰國鱧 專家潛水活捉10尾">
<img alt="凶狠「魚虎」現蹤!台東活水湖清除泰國鱧 專家潛水活捉10尾" src="//cdn2.ettoday.net/images/6617/c6617970.jpg"/>
</a>
<h3>
<a href="//pets.ettoday.net/news/2355085" target="_blank" title="凶狠「魚虎」現蹤!台東活水湖清除泰國鱧 專家潛水活捉10尾">
                            凶狠「魚虎」現蹤!台東活水湖清除泰國鱧 專家潛水活捉10尾                          </a>
</h3>
</div>
<!--組-->
<!--組-->
<div class="piece icon_type_video">
<a class="pic" href="//pets.ettoday.net/news/2354861" target="_blank" title="影/浮潛遇熱情海龜 妹子怕被咬狂慘叫還腳掛泳圈">
<img alt="影/浮潛遇熱情海龜 妹子怕被咬狂慘叫還腳掛泳圈" src="//cdn2.ettoday.net/images/6617/c6617327.jpg"/>
</a>
<h3>
<a href="//pets.ettoday.net/news/2354861" target="_blank" title="影/浮潛遇熱情海龜 妹子怕被咬狂慘叫還腳掛泳圈">
                            影/浮潛遇熱情海龜 妹子怕被咬狂慘叫還腳掛泳圈                          </a>
</h3>

...

<!--wrapper_box 結束-->
</body>
</html>

Beautifulsoup主要有兩個函數能夠抓取想要的資料

  1. find():回傳其中一個符合條件的標籤。
  2. find_all():回傳所有符合的標籤。
    這兩個的差別在於如果呼叫find但是有很多符合的標籤,那會優先回傳第一個符合的,而find_all則是回傳一個list。

搜尋HTML特定的標籤與屬性

利用find函數搜尋連結,標籤a在HTML為連結。

result = bs.find("a")
print(result)

輸出為

<a href="http://www.ettoday.net" target="_blank">ETtoday新聞雲</a>

結果為這個網頁HTML第一個出現的標籤a沒錯。

接著練習抓取寵物雲的新聞標題,從網站的HTML觀察發現標題都在h3標籤的a標籤(連結)裡。先呼叫find_all抓取所有的h3,並且從抓到的h3標籤裡搜尋a標籤,抓取tiitle屬性就能得到大部分的新聞標題。抓取HTML的屬性時,呼叫.get(),如果想抓取連結裡的href屬性,程式碼為.get(“href”)。

result = bs.find_all("h3")
all_title = []
for i in result:
    try:
        all_title.append(i.find("a").get("title"))
    except:
        continue
print(all_title)
['凶狠「魚虎」現蹤!台東活水湖清除泰國鱧\u3000專家潛水活捉10尾', '影/浮潛遇熱情海龜\u3000妹子怕被咬狂慘叫還腳掛泳圈', '高雄狠心男持BB槍射狗理由曝\u3000主人怒告毀損傷害討公道', '柴見肉乾眼神癡\u3000口水瀑布流三尺', '吉娃娃球場6步灌籃\u3000萌翻NBA粉絲', '帶闆闆參加金萌獎\u3000劉涵竹曝過往', '不驚喜包!黑眉米克斯原比例膨脹', '忘記自己長大\u30007KG貓肉壓扁小白', '浮潛遇熱情海龜\u3000妹子怕到狂慘叫', '男持BB槍射狗理由曝\u3000主人怒告毀損傷害討公道', '幼獅鑽牛肛門卡住\u3000母獅一旁看戲', '高雄男持BB彈射狗\u3000血跡染紅白毛', '尾寮山有黑熊出沒?屏東林管處回應了', '宋城希參加金萌獎\u30006貓1狗3兔寵毛孩無極限', '李蒨蓉帶愛犬參加金萌獎', '東森寵物台南關廟新店盛大開幕!', '艾力克斯伉儷帶愛犬參加金萌獎\u3000', '3萬大獎+封面明星等你拿\u3000金萌獎報名最後1天', '媽指揮拍照「親+抱狗」\u3000兒熱情伸舌狂舔:好吃', '開鐵捲門4m粗蛇「降肉」\u3000落地後秒害羞鑽進水溝', '鸚鵡強迫摸摸「一停就咬人」\u3000媽求放過:讓我專心追劇!', '毛保姆好難當!遇上家裡小孩子 狗狗貓貓超無奈:好想下班', '爸招手垂耳兔蹦跳入座\u3000天天坐隔壁一起吃飯', '僧侶遇狗狗頭卡塑膠管 20分暖心救援順利脫困', '起床狂發抖!2柴被包成「爆餡大春捲」放沙發\u3000網笑:以為下雪了', '吃貨柴柴嘴巴「閘門忘記關」\u3000口水瀑布從頭流到腳底:肚子好餓啊', '得分啦!「湖人24號吉娃娃」上球場6步灌籃\u3000超帥英姿萌翻NBA粉絲', '巴哥怕孤單...緊盯媽媽洗澡 門一關就狂哭!她嘆:好難搞', '劉涵竹帶短毛貓闆闆參加金萌獎\u3000曝「眼睛發炎腫脹」救援過往', '凶狠「魚虎」現蹤!台東活水湖清除泰國鱧\u3000專家潛水活捉10尾', '影/浮潛遇熱情海龜\u3000妹子怕被咬狂慘叫還腳掛泳圈', '高雄狠心男持BB槍射狗理由曝\u3000主人怒告毀損傷害討公道', '養到不驚喜包!米克斯留小黑眉「原比例膨脹」\u3000粉絲暈:被迷住了', '忘記自己長大!7KG貓肉壓扁小白「整坨黑掉」\u3000家人急勸:快下來', '遇到雷隊友!橘貓屋檐後腳打滑\u3000撞上乳牛貓不敵地心引力雙雙滾落', '就是不給摸!萌貓長大「變心不愛媽」\u3000等5個月伸手還是被咬一口', '幼獅鑽牛肛門「卡住+脖子一圈血痕」放棄掙扎\u3000母獅一旁吃肉看戲', '狼犬低吼亮尖牙超兇猛\u3000 下秒「反轉魅力」倒地當孫子玩伴臉任舔', '不怕看醫生?2隻阿金經過動物醫院「搶著衝進門」\u3000媽揭心機真相', '柴犬滿滿見肉乾製造超長「口水瀑布」\u3000網笑:要釣魚?', '長太大隻!183公分巨犬「人看到就怕」\u3000苦蹲收容所448天逼哭志工', '高雄男持BB彈射狗「血跡染紅白毛」\u3000飼主急喝止他狠踩油門撞傷人', '熱門登山景點尾寮山有黑熊出沒?\u3000屏東林管處回應了', '弟弟滑平板睡著「抱住大隻絨毛娃」\u3000甜蜜睡姿萌翻網:肚子都好圓', '宋城希參加金萌獎「為浪浪募糧食」\u30006貓1狗3兔寵毛孩無極限', '保護長江4/直擊!微笑「長江精靈」回來了\u3000宜昌Q版文創新名片', '影/爸喊睡覺!巨汪慵懶式後倒\u3000相擁放閃媽成局外人', '影/上課太無聊?2貓學麻將睡著\u3000被當「牌桌」擺滿身', '尊重主子意願!貓簽署「鈴鐺拆除同意書」\u3000白底黑字+紅色喵掌印', '鴨鴨「鼻孔插2搓白毛」隨呼吸進進出出\u3000網狂重播:好魔性', '貓主子籠內遇到流浪三花貓「開槓狂喵」\u3000爸:在說什麼?', '「不要啃腳腳!」臘腸犬被主人唸秒變小媳婦\u3000網友一句話突破盲腸', '鬣狗遭圍攻竟「自我掏肛」想嚇退敵人!\u3000一旁狩獵獅群全看傻', '嫌梳毛麻煩!他幫貴賓狗「直髮」\u3000慘變河童「平底鍋頭」超悲劇', '替人擋煞嚇哭!鴨被裝箱眼角泛淚', '阿姨以為雞腿給狗\u3000否認後超爆笑', '爸顧鼠寶「顧到一起睡翻」網笑噴', '亂抓手惹柴哥生氣\u3000弟親親求和好', '監視器通知小孩有動靜\u3000畫面超暖', '借宿遇親人浪貓胸口壓整晚守護', '忘記自己長大\u30007KG貓肉壓扁小白', '領養貓遭勸退\u30001年後變化爸哭了', '阿嬤煮飯壓力大\u3000後面竟大排長龍', '流浪高貴妃衝進車收編\u3000今變楊貴妃', '幼獅鑽牛肛門卡住\u3000母獅一旁看戲', '到公園散步\u3000汪帶同款小黑臉回來', '邊牧忽被親愣住\u3000三倍奉還狂啄媽', '梅花鹿貼炭爐\u3000下巴長出豆芽菜', '汪眼睛打不開!衝醫院「瞬間睜大」', '阿公出門沒揪!毛孫找阿嬤理論\u3000「擺臭臉」端正在客廳靜坐抗議', '2貓見習打麻將被當牌桌\u3000睡著擺滿身:太無聊啦', '白柴見「肉肉山蛋糕」\u3000開心唱生日歌抬頭許願', '鼠寶躺爸肚上「一起睡翻」\u3000姿勢神同步笑噴網:沒偷生', '新聞雲APP週週躺著抽', '全台房巿供不應求?!何處可買房', '【週年慶】毛毛商城兩歲囉', 'ETtoday Podcast聽起來']

搜尋CSS特定的屬性

我們一樣可以利用find以及find_all這兩個函數搜尋特定條件的CSS屬性,以下範例搜尋class為summary的p標籤,並且印出標籤裡的文字。設置搜尋特定class時須注意,程式碼為class_ ="class name”,在程式碼哩,我加入limit的參數,限制最多抓取5個回傳。

summary = bs.find_all("p", class_ = "summary", limit = 5)
for i in summary:
    print(i.text)

輸出結果


							近日東北季風增強,全台天氣逐漸開始轉涼,飼主林靖芳擔心家中3隻柴犬阿肥、熊熊、皮皮會冷,竟然拿了毛毯把牠們包起來,像坨「爆餡大春捲」放在沙發上。好笑的是,毛孩完全沒有反抗,乖乖配合露出一顆頭,表情顯得有些無奈,眼前景象讓人忍不住笑說,「有一種冷,叫姐姐怕你們冷。」						

							這口水比起司還會牽絲喔!台北景美區有隻超級貪吃的4歲柴犬「滿滿」,這日飼主就在臉書上分享自家寶貝看見肉乾的照片,只見滿滿嘴巴微張,眼神痴痴的看向前方,超長的口水也從嘴角流到腳底,爆笑模樣讓飼主忍不住喊道,「妳這吃貨可以再誇張一點沒關係!」						

							最萌選手非牠莫屬!NBA季前賽太陽隊VS湖人隊於10月5日開打,沒想到在比賽暫停期間,場上突然出現一隻穿著球衣的吉娃娃,張大嘴巴叼著一顆小籃球,下秒對著特製籃筐做出「灌籃」動作。神奇的是,吉娃娃不但完全零失誤,還精準將球投進籃網,短短6秒畫面在網路上爆紅,圈粉一大票球迷。						

							飼主Renee家中有隻4歲的巴哥「抖宅」,個性體貼又黏人,有時又很固執,小時候因為和Renee相處時間不多,導致抖宅出現分離焦慮的症狀,只要沒看到Renee就開始哭,甚至連她在洗澡也不放過!						

							東森寵物雲舉辦第三屆金萌獎,今年特別邀請名人網紅一同共襄盛舉,主播劉涵竹也響應活動,參與金萌獎為浪浪募集更多糧食,分享與主子「闆闆」的故事,經過她細心照料,讓原本可能「上天堂」的闆闆恢復活力。現在只要幫心儀的毛孩投下一票,就能替浪浪募集更多糧食,還有機會贏得3萬商品券及多項好禮!			

CSS選擇器

如果想要直接搜尋CSS的屬性時可以呼叫select函數,如果想搜尋特定的class,在搜尋的class名稱前加**.,如果是搜尋特定id則加#**。
使用select函數篩選與使用find_all函數的結果會一樣。

print(bs.select(".summary", limit = 3))

輸出結果

[<p class="summary">
							近日東北季風增強,全台天氣逐漸開始轉涼,飼主林靖芳擔心家中3隻柴犬阿肥、熊熊、皮皮會冷,竟然拿了毛毯把牠們包起來,像坨「爆餡大春捲」放在沙發上。好笑的是,毛孩完全沒有反抗,乖乖配合露出一顆頭,表情顯得有些無奈,眼前景象讓人忍不住笑說,「有一種冷,叫姐姐怕你們冷。」						</p>, <p class="summary">
							這口水比起司還會牽絲喔!台北景美區有隻超級貪吃的4歲柴犬「滿滿」,這日飼主就在臉書上分享自家寶貝看見肉乾的照片,只見滿滿嘴巴微張,眼神痴痴的看向前方,超長的口水也從嘴角流到腳底,爆笑模樣讓飼主忍不住喊道,「妳這吃貨可以再誇張一點沒關係!」						</p>, <p class="summary">
							最萌選手非牠莫屬!NBA季前賽太陽隊VS湖人隊於10月5日開打,沒想到在比賽暫停期間,場上突然出現一隻穿著球衣的吉娃娃,張大嘴巴叼著一顆小籃球,下秒對著特製籃筐做出「灌籃」動作。神奇的是,吉娃娃不但完全零失誤,還精準將球投進籃網,短短6秒畫面在網路上爆紅,圈粉一大票球迷。						</p>]

可以看到結果與find_all函數抓取的資料一樣

其他函數

其他還有一些常呼叫的函數

  • find_parents: 尋找特定標籤的父節點
  • find_previous_siblings:尋找同個層級中前一個節點
  • find_next_siblingd:尋找同個層級中下一個節點

感謝您的瀏覽,程式碼已上傳Github
/images/emoticon/emoticon29.gif


上一篇
【Day 25】循環神經網路 Recurrent neural network
下一篇
【Day 27】網路爬蟲 - Selenium篇
系列文
從機器學習到深度學習 - 30天搞懂常見演算法的基礎理論30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言