跟著IG潮流來爬蟲 — 如何爬取IG貼文短連結 — 系列2(附Python程式碼)

Andiology 鈺淇
Marketingdatascience
7 min readOct 20, 2020

歡迎來到 Selenium 動態網頁爬蟲系列文章第二篇~
本篇文章將為您詳細解說如何使用 Selenium 爬取 Instagram 貼文短連結

想知道如何用Selenium自動登入IG?點擊下方連結觀看:
跟著IG潮流來爬蟲-用Selenium帶您自動登入 IG -系列1(附Python程式碼)

為何需要爬取貼文短連結呢?

貼文連結是爬取 Instagram 貼文中最重要的一環!
短連結就像是貼文的身份證字號,可以做為貼文的依據,用來辨識每篇貼文,在後續分析時也可藉由連結回頭檢視,驗證爬取資訊的正確性。在爬取資料時,若是能將文章的短連結也同時爬下,對於後續資料分析,會非常有幫助,因為當我們想要回頭檢視更多細部的文字、網頁內容時,貼連結可以讓我快速的檢閱。

(資料畫面來源:https://www.instagram.com/p/CGTFa-EHt2q/

接下來,我們就開始教各位如何獲取這些短連結的資料吧!!

網頁檢視器概念說明

以 bbcnews 的粉絲專頁為例(https://www.instagram.com/bbcnews/),
當我們打開網頁檢視器 (Windows 系統:請按 F12;MacOS 系統:option+command+c) 時,可以在網頁右側看到以下視窗,如圖一

圖一、網頁檢視器(資料畫面來源:https://www.instagram.com/bbcnews/

接著,點選彈出視窗上方的 Elements,檢視網頁,如圖二所示。

圖二、點擊網頁元素選項(資料畫面來源:https://www.instagram.com/bbcnews/

進入到Elements的介面之後,會看到詳細的網頁程式碼,然而,我們難以在短時間內辨識出各程式碼的功用。這時我們可以點選視窗左上角的小鼠標,當我們任意的在網頁上滑動時,旁邊的灰色網底區塊應該也會跟著移動,如圖三。也就是當我們將鼠標移到網站中的任意區塊做點擊,它就會自動幫我們找到鼠標對應區塊的網頁元素!

圖三、檢測元素的鼠標(資料畫面來源:https://www.instagram.com/bbcnews/

尋找短連結所在位置

雖然平常不會注意到,但是可以發現當我們將滑鼠移至IG貼文上方時,就會在左下角或右下角的位置出現所在貼文的連結,如圖四,因此我們可以推斷貼文的連結可能是包含在貼文區塊當中。

圖四、貼文短連結顯示處(資料畫面來源:https://www.instagram.com/bbcnews/

再來,我們就可以使用剛剛提到的小鼠標功能,點擊貼文區塊,找出對應的網頁程式碼,如圖五

圖五、點擊貼文區塊元素(資料畫面來源:https://www.instagram.com/bbcnews/

此時,就會發現原來貼文的短連結包含在貼文區塊當中!
圖六當中可以看到它被存放在 href 的屬性裡面,這是要作為接下來爬取的依據。

圖六、貼文短連結網頁元素

順帶一提,從圖六當中我們可以看見貼文短連結的形式是依照 “ /p/貼文編號/ ”,因此在之後的 Instagram 爬蟲系列文章也將會是依照這樣的形式來做使用。

知道了貼文短連結的所在位置之後,我們就可以開始把他們抓下來囉!

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

想知道 Chromedriver的強大請見此
如何透過 Selenium登入 Instagram請見此

完成開啟 Chromedriver 並登入之後,就可以開始執行以下的程序了。

開始爬取貼文的短連結

首先將需要用到的套件import進來,如程式碼 1

接下來進入到IG粉專的頁面,如程式碼 2

最後執行底下的程式碼 3 就可以找到貼文的短連結啦~

以上程式碼解析

接下來為各位做以上程式碼的解析

由於 Instagram 是一個動態加載的網頁,若沒有將網頁下滑就會無法加載較底下的貼文

這時,我們可以使用「for 迴圈」來根據想要下滑的次數,將網頁下滑並加載,如下程式碼。

for i in range(n_scroll):

而下滑的方法我們使用 Javascript 中的 window.scrollTo() ,
每一次都將頁面下滑到底,如下程式碼。

scroll = 'window.scrollTo(0, document.body.scrollHeight);'    browser.execute_script(scroll)

加載完成之後,運用 page_source 將所有的網頁原始碼抓取下來,如下程式碼。

html = browser.page_source 
soup = Soup(html, ‘lxml’)

經過 beautifulsoup 整理過後,找出其中包含 href 屬性的標籤。

圖七、貼文短連結標籤位置

回到圖七網頁元素這邊來觀察,可以看到它的標籤位置存在於 article > div > div > div > div > a 底下,使用 soup.select 來取得這個標籤位置底下的元素,如下程式碼。

soup.select('article div div div div a')

最後再用一個迴圈來將所有的貼文短連結存放至自己的列表當中,如下程式碼。

# 尋找所有的貼文連結
for elem in soup.select('article div div div div a'):
if elem['href'] not in post_url:
post_url.append(elem['href'])

這時貼文短連結就成為您的囊中之物了!

以上就是爬取 Instagram 貼文短連結的完整技巧了,
本篇完整的程式碼在此分享給您,讓您也可以增強爬蟲功力~
如果喜歡我的文章,記得幫我拍個手!!

更多Selenium相關文章連結:

  1. FB 爬蟲可以更簡單-用Selenium自動登入FB-系列1(附Python程式碼)
  2. 好奇自己FB的互動性指標嗎?!用Selenium爬蟲-搞定貼文按讚數、留言數、分享數-系列2(附Python程式碼)
  3. 用Selenium爬蟲-抓取FB文章內容、時間-系列3(附Python程式碼)

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

--

--