跟著IG潮流來爬蟲 — 如何獲取貼文圖片&影片連結 — 系列4(附Python程式碼)

使用Selenium獲取Instagram圖片及影片網址(可下載檔案)

行銷資料科學
14 min readOct 29, 2020

歡迎回到 Selenium 動態網頁爬蟲系列文章第四篇~

本篇文章會從頭解釋,如何檢視網頁及找到所需的資訊,若已了解相關概念,可以直接往下滑到最後觀看實作程式碼~

動態網頁爬蟲一切的開始都是從網頁檢視器,觀察觀察再觀察!

你是不是曾滑著Instagram,看著琳琅滿目的漂亮照片,想存成桌布自己欣賞呢?無論是新聞、好山好水、美女帥哥、偶像的照片或影片,本篇文章將會手把手教你怎麼找到它們的原始檔案並且下載下來,你將不再需要妥協於手機截圖的爛畫質啦!

(資料來源:https://www.instagram.com/p/CE_bR-osw4M/)

本文以bbcnews的此篇文章為例,貼文中包含了許多動物的圖片:

(資料來源:https://www.instagram.com/p/CE_bR-osw4M/)

我們來看看如此可愛生動的照片們究竟隱藏在哪裡吧!

  1. 檢視網頁及找到需要的網頁資訊

第一步,同樣是打開網頁檢視器(Windows系統:請按f12、macOS系統:請按option+command+c)。打開後可以看到以下視窗(圖一)。

圖一、網頁檢視器示意圖。

接著點選視窗左上角的小鼠標(圖二)。這時當我們任意的在網頁上滑動,旁邊的藍色網底區塊應該也會跟著移動。

圖二、點擊彈出視窗左上角的小鼠標。

當我們將鼠標移到圖片上並點擊,旁邊的網頁檢視器會將對應到的網頁元素碼區域標示出來,如圖三

圖三、網頁元素碼示意圖。

咦!?怎麼什麼東西都沒有啊?

不用擔心,這是很正常的,因為我們可能不是直接點到網頁上的圖片,而是點到一些功能介面、網頁板塊之類的網頁元素,這時只要展開附近的階層,通常就能找到需要的內容囉!(需要的資訊通常會在上下層級內)。

因此我們將上一層展開,馬上發現到了圖片連結!太好了!如圖四所示。

圖四、圖片連結示意圖。

在換到下一張圖片之前,別忘了先簡單記憶一下classname(在這裡是KL4Bh)!有了classname我們才能透過Selenium抓到他們!

接著繼續嘗試下一張圖片,使用同樣的方法也可以順利找到圖片的連結,而且classname也是一樣的呢!如圖五所示。

圖五、找到圖片連結。

不過等等,連結怎麼會有這麼多?!

圖六、圖五的網頁原始碼內容。

別緊張,我們來仔細觀察一下,有沒有看到特別的地方呢?

原來srcset裡的這些連結,是為了因應Instagram不同大小的介面,而儲存了大小不同的圖片檔案,

這時當然就可以依據自己的需求下載不同大小的圖片檔案啦!

不過通常大家都想要最高畫質的圖片檔案,答案就在靠近的底下的src裡面!

趕快檢查一下連結能不能使用吧!開啟連結之後,會出現只有一張圖片的畫面,而這張圖片應該就會是我們剛剛點擊的圖片內容啦!(可愛的魚~),如圖七所示。

圖七、獲取連結的圖片內容。(資料來源:https://www.instagram.com/p/CE_bR-osw4M/)

進入連結的網頁後,這裡的圖片就可以另存下載了!

影片(或IGTV)也是使用同樣的方式,即可以找到影片的首頁縮圖及影片檔案,大家可以自己嘗試看看。

以下進入相關程式碼的說明。

2. 撰寫程式

開始之前,我們先打開Python3編輯器和chromedriver

以下是我們本次需要的套件,先import進來。

下方就是爬出單一圖片及影片所有需要的程式碼啦!

接下來,我會將程式碼分為三部分來解釋各行程式碼的用處及原理。

1. 前往特定貼文頁面

url = 'https://www.instagram.com/p/CE_bR-osw4M/'
browser.get(url)

url就是你需要爬取資料的網頁連結,使用browser.get(url)可以使webdriver前往對應的網頁,之後爬取資料。

如果是從前面文章讀過來的朋友應該知道 browser是什麼跟怎麼開了,還不知道的請見:動態網頁爬蟲第一道鎖 — Selenium教學:如何使用Webdriver、send_keys(附Python 程式碼)

2. 抓取目前網頁原始碼

執行完上方的程式碼後,webdriver的chrome介面應該已前往對應貼文了,此時需要抓取網頁原始碼並解密。

這時就需要Beautiful Soup的強大功能啦~簡簡單單的一行就出來了,真的是非常方便!

soup = Soup(browser.page_source,”lxml”) # 抓取網頁原始碼

3. 獲得需要的內容:圖片或影片連結

這邊要特別注意一下,只要是頁面上看到的圖片,包括下方推薦貼文的首頁圖片,其classname都為KL4Bh。所以我們使用find_all找出所有classname為KL4Bh的網頁元素之後,選擇第一項(index為0)才會是我們想要的圖片。

soup.find_all(class_="KL4Bh")[0].img.get('src')

可以得到如下的連結:

https://instagram.ftpe7-4.fna.fbcdn.net/v/t51.2885-15/e35/s1080x1080/119056944_181768493447082_3650746414924624580_n.jpg?_nc_ht=instagram.ftpe7-4.fna.fbcdn.net&_nc_cat=1&_nc_ohc=AaphAE21jHQAX87LZv1&oh=925fa168ff1272c8725f9408bac60eba&oe=5F8A9047

因為之前的貼文只有圖片,所以另外找了另一則有影片的貼文示範。

# 獲取影片連結
url = 'https://www.instagram.com/p/CFHwyL6s9Gn/'
browser.get(url)
soup = Soup(browser.page_source,"lxml")
soup.find_all(class_="_5wCQW")[0].video.get('src')

前三行都是一樣的概念,只需要更改classname跟標籤部份而已(.img變成.video,這種用法是find的另一種簡易寫法)

可以得到如下的連結:

https://instagram.ftpe7-4.fna.fbcdn.net/v/t50.2886-16/119635584_1014523599020413_8744563761498280395_n.mp4?_nc_ht=instagram.ftpe7-4.fna.fbcdn.net&_nc_cat=101&_nc_ohc=T1HjFPXt2EgAX_dRCPg&oe=5F61BB3B&oh=6790e102d94a5d1037826730a1bff8c3

基本的爬蟲原理就到這裡了,大家可以自由去摸索,Selenium及Beautiful Soup爬蟲的概念都大同小異,加油!

以下將會介紹如何獲取單篇貼文的所有圖片或影片連結,會運用大量try&except還有更多複雜的方法,請小心食用。

實際上Selenium的強大之處就是模擬人在動態網頁上的行為,可以輸入資料、點擊等等。因此我們可以寫一個小型迴圈不斷獲取圖片及影片連結,自動點擊下一頁按鈕,直到沒有下一張圖片或影片為止。

而且Instagram貼文圖片常常不只一張,手動點擊下一頁再使用Selenium及Beautiful Soup爬取未免也太陽春了一點。

但是要順利完成這樣厲害的功能可不是一件容易的事。以下是我在撰寫Instagram爬蟲程式時遇到的三大麻煩:

  1. 動態加載:Instagram是動態網頁,所以會有預載好的資料也有先前看過的資料,而先前載過的資料會隨著下一頁按鈕的點擊漸漸消失,所以需要一邊比較資料一邊爬取。
  2. 網頁架構不同:單張圖片或影片,跟多張圖片或影片的classname及網頁架構不相同。
  3. 網速影響很大:同樣的程式碼有時候出的來,有時候出不來…

解決完上述的問題之後,有了以下的程式碼。

除了主要爬蟲程式碼以外,還添加了一些幫助偵錯(count、print)、WebDriverWait、time.sleep等待網頁加載等等的細節。但是網速還是影響很大(time.sleep到底要多久),盡量要在網速穩定的情況下爬蟲才不會做白工啊~

程式碼看得霧煞煞嗎?沒關係這裡有流程圖:

程式碼流程圖

對程式碼大概有個理解之後,大家心中一定有許多疑惑,接下來將會一一解答。

Q1. 如何使用Selenium登入Instagram?

請見:跟著IG潮流來爬蟲-用Selenium帶您自動登入 IG -系列1(附Python程式碼)

Q2. 如何使用Selenium自動點擊下一頁按鈕?

運用先前相同的概念,我們很快可以找到下一頁按鈕的classname為「_6CZji」。

而使用 WebDriverWait()可以等待網頁加載,避免網速太慢抓不到的問題。

# 等待按鈕出現
WebDriverWait(browser, 15).until(EC.presence_of_element_located((By.CLASS_NAME, ‘_6CZji’)))
# 找到下一頁按鈕
button = browser.find_elements_by_class_name(‘_6CZji’)[0]
# 點擊下一頁按鈕
button.click()

Q3. 如何判斷貼文為單張圖片或影片?

方法可以有很多種,可以尋找網頁中是否有下一頁的按鈕,並使用find函式去找他的classname。

又或是如同下面的程式碼一樣,透過觀察網頁,我們可以發現多張圖片跟影片的貼文會多一層classname為Ckrof的框架,裡面會包含我們所需要的訊息。

# 如果找到這層框架則為多張圖片的貼文
if (soup.find(class_="Ckrof") != None):

除了上述兩種方法之外,大家也可以去自由嘗試其他的方法!

Q4. 同樣的程式碼,我的電腦怎麼抓不到檔案?

那可能是Instagram又改版了(檢查一下classname)、Webdriver需要更新、網路不穩定等等情形。觀察一下log的錯誤訊息也許可以找到一些提示!

爬蟲程式碼是需要定期偵錯的,今天可以爬成功,明天就不一定了(真痛苦…),大家多多加油!

以上就是本文關於爬取Instagram圖片及影片網址的內容了。

本文完整程式碼在此

如果你喜歡我的文章,請給我一點掌聲。

更多Selenium相關文章連結:

  1. FB 爬蟲可以更簡單-用Selenium自動登入FB-系列1(附Python程式碼)
  2. 好奇自己FB的互動性指標嗎?!用Selenium爬蟲-搞定貼文按讚數、留言數、分享數-系列2(附Python程式碼)
  3. 用Selenium爬蟲-抓取FB文章內容、時間-系列3(附Python程式碼)
  4. 跟著IG潮流來爬蟲-用Selenium帶您自動登入 IG -系列1(附Python程式碼)
  5. 跟著IG潮流來爬蟲 — 如何爬取IG貼文短連結 — 系列2(附Python程式碼)
  6. 跟著IG潮流來爬蟲 — 如何爬取IG貼文讚數&留言數 — 系列3(附Python程式碼)

作者:戴若竹(臺灣行銷研究特邀作者)、鍾皓軒(臺灣行銷研究有限公司創辦人)

歡迎加入我們的Telegram獲取即時訊息!https://t.me/marketingdatascience
歡迎加入我們的Line@獲取即時訊息!https://line.me/R/ti/p/%40cde8265r

您可能有興趣:

📢TMR全新線上直播課程

【直播Workshop-線上實戰講堂】
《用AI進行顧客資料分析與銷售判斷》

🔹直播日期:11/07(六)
🔹直播時間:14:00–17:00
🔹課程詳情:https://bit.ly/2RHOwT6

【課程簡介】
📌Python技法結合商業思維,一步步建立數值化思考能力
📌機器學習分析顧客行為,找出最佳獲利模式
📌輿情數據結合STP策略,洞察潛在藍海市場
📌專業講師實案講解,帶您快速落地應用

💥早鳥價 :$550(7折)
💥兩人以上同行:$500(64折)
(原價:$780)
🏃‍♂前往報名:https://bit.ly/2RHOwT6

— — — — — — — — — — — — — —

👨‍🎓TMR為您量身打造「全方位數據課程」

熱門Python程式語言結合全新商業思維,快來終生學習不間斷!

【TMR】 X 【 好學校】
👨‍💼Python商業全系列數位課程👨‍💼

#行銷人必學實用Python課程

《 Python 0到1 基礎商業數據分析實戰 》
💥 價格 :3188
👉 從0開始:手把手從頭學習,適合完全沒學過的學員
👉 商業應用全台最多:傳授市面上少見的Python實務應用
👉 網路輿情爬蟲演練:網路輿情商務爬蟲技法
👉 競品分析:競爭價值定位圖找出藍海策略
👉 貨架陳列視覺化:解析行銷策略及廣告預算配置方法
🛒 前往購買:https://hahow.in/cr/python0-1

《 顧客分類大師:Python x RFM 會員經營新觀點 》
💥 價格 :2388

🎯 Python X RFM最佳拍檔,輕鬆鎖定潛(錢)在顧客
不需要出門,在家也能學習專業課程,讓你擁有會員經營的新思維!

本課程以五個面向為您的企業,做更深入的健診:
👉 市場面:以最基本的顧客消費資料(頻率、購買次數),將現有顧客區隔分類。
👉 財務面:計算出在每個顧客身上所賺得毛利,在不同客群中的獲利。
👉 行銷面:藉由 RFM 的分析進行行銷預算重新分配。
👉 產品面:觀察在不同客群中,各個產品的銷售狀況。
👉 顧客回購面:分析顧客的購買週期後,進行精準推薦。
🛒 前往購買:https://hahow.in/cr/rfm-model

《 AI 行銷學:用 Python 機器學習創造商業新價值 》
💥 價格 :3888
👉 全台第一門Python機器學習線上課程
👉 教導你快速理解Logistic Regression, XGBoost, Random Forest商務機器學習模型。
👉 建構老闆或主管們看得懂的模型評估指標,讓精準行銷方案更容易被接受且推出
👉 如何利用機器學習找出消費者心中的重要變數及客樣貌與特徵,做到個體及總體的商品推薦?
👉 如何從數以萬計的消費資料中偵測可能的詐欺名單?
🛒 前往購買:https://hahow.in/cr/python-ml

--

--

行銷資料科學
行銷資料科學

Written by 行銷資料科學

Marketing data science. 台灣第一個行銷資料科學(MDS)知識部落,本粉絲專頁在探討行銷資料科學之基礎概念、趨勢、新工具和實作,讓粉絲們瞭解資料科學的行銷運用,並開啟厚植數據分析能力之契機。粉絲專頁:https://www.facebook.com/MarketingDataScienceTMR

Responses (1)