跟著IG潮流來爬蟲 — 如何爬取IG貼文讚數&留言數 — 系列3(附Python程式碼)

Andiology 鈺淇
Marketingdatascience
9 min readOct 27, 2020

歡迎回到 Selenium 動態網頁爬蟲系列文章,本篇文章要和大家分享如何進一步使用 Selenium 爬取 Instagram 貼文讚數&留言數~

更多IG爬蟲系列文章看這裡~
跟著IG潮流來爬蟲-用Selenium帶您自動登入 IG -系列1(附Python程式碼)跟著IG潮流來爬蟲 — 如何爬取IG貼文短連結 — 系列2(附Python程式碼)

(資料畫面來源:https://www.instagram.com/p/CE_vJOwMUZR/

為何要爬 Instagram 貼文的讚數與留言數呢?

Instagram 中有許多大大小小的粉絲專頁,在他們發佈的貼文中讚數與留言數一直是行銷人拿來衡量的指數,從中可以了解這些粉絲專頁的經營狀況以及成長趨勢。

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

網頁檢視器概念說明

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

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

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

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

之後再點選旁邊的小鼠標,這時當我們任意的在網頁上滑動,旁邊的灰色網底區塊應該也會跟著移動,如圖三

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

若將鼠標移到網站中的任意區塊做點擊,它就會自動幫我們找到鼠標對應區塊的網頁元素!

尋找

由於我們是要爬取 Instagram 的「貼文讚數」與「留言數」,若您很熟悉 Instagram 的介面,應該很輕易就能找到他們所在的位置,如圖四所示,只要將滑鼠移到貼文上方,目標很快地就出現在眼前了!

圖四、有些貼文為影片或IGTV,會出現觀看次數,但是不會影響抓取內容以及後續分析(資料畫面來源:https://www.instagram.com/bbcnews/

接下來,您就可以使用剛剛提到的小鼠標功能,將鼠標移至貼文上方點擊,就可以得到貼文區塊的元素,如圖五。

圖五、取得貼文的網頁元素(資料畫面來源:https://www.instagram.com/bbcnews/

但是這時候會發現,想要的讚數跟貼文數的網頁元素怎麼都找不到呢?
動動您手上的滑鼠,就會發現只要將滑鼠移到貼文上方就會顯現出來了!
動畫一所示。

動畫一、滑鼠移到貼文上方才能找到其元素(資料畫面來源:https://www.instagram.com/bbcnews/

但,您可能心中會有個疑問 :

可是我沒有兩隻滑鼠可以用啊!
那我們應該如何才能找到它們的元素呢?

這時候就會使用 Selenium 裡面模擬滑鼠操作的功能 — ActionChains

我們使用 ActionChains 的技巧將「模擬的」滑鼠移到貼文的位置,
就會發現一個包含class = "qn-0x"的標籤顯現出來了!

這時要小心翼翼地控制自己的滑鼠,在不能滑到 Instagram 頁面的前提下,從剛才顯示出來的標籤,將旁邊的箭頭一一往下點,就可以在如圖六紅框中找出讚數及貼文數隱藏的位置囉!

圖六、讚數及貼文數的所在位置(資料畫面來源:https://www.instagram.com/bbcnews/

找出想要的資訊之後,就可以進入程式操作的部分囉~

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

若想知道 Chromedriver 是如何運作的,請點以下連結~

  1. 動態網頁爬蟲第一道鎖 — Selenium教學:如何使用Webdriver、send_keys(附Python 程式碼)
  2. 動態網頁爬蟲第二道鎖 — Selenium教學:如何使用find_element(s)取得網頁元素(附Python 程式碼)

如何透過 Selenium登入 Instagram請見此

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

開始爬取貼文讚數及留言數

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

程式碼 1

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

程式碼 2

最後執行底下的程式碼 3 就可以找到貼文的讚數及留言數啦~

程式碼 3

以上程式碼解析

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

  1. 前往特定貼文頁面,如下程式碼。
url = 'https://www.instagram.com/bbcnews/'
browser.get(url) # 前往該網址

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

2. 將鼠標移至想要爬取的貼文上,如下程式碼。

post_url = '/p/CEriQnOMwW9/'
# 找到對應的貼文,鼠標移入
post_elem = browser.find_element_by_xpath('//a[@href="'+str(post_url)+'"]')
action = ActionChains(browser) action.move_to_element(post_elem).perform()

這裡的 post_url 就是想要爬取的貼文短連結,這個部分可以自行做更改,
(短連結形式請依照:‘ /p/貼文編號/ ’)

想要了解貼文短連結如何直接透過 Selenium 爬取的朋友們可以參考此文章
跟著IG潮流來爬蟲 — 如何爬取IG貼文短連結 — 系列2(附Python程式碼)

接下來我們找出該篇貼文的元素 (post_elem),這邊就要使用 Selenium 查找元素的方法:browser.find_element_by_xpath()

再透過 ActionChains 的鼠標控制將鼠標移動到貼文上方,讓讚數及留言數的元素能夠被抓出來。

3. 找出讚數及留言數的元素

# 找到需要的網頁元素
n_like_elem = browser.find_elements_by_class_name('-V_eO')
# 取得讚數、留言數
n_like = n_like_elem[0].text
n_comment = n_like_elem[1].text

這時我們再回到網頁元素的地方來觀察,要從哪裡來抓取讚數與貼文數的內容呢?

圖七、讚數與貼文數的網頁元素

圖七中可以發現它們的內容都一樣被包含在class = "-V_e0"的標籤底下,
那我們就可以輕鬆的一次把它們全部抓下來~

目前為止需要的東西已經到手了,但…還沒完!
如果現在 browser 的畫面中看不到欲爬取的那篇貼文,電腦也是找不到的喔~

Instagram 是一個動態加載的網頁,這就是為何我們必需使用 Selenium 來爬取的用意

那麼,我們應該怎麼解決呢?

find = False
# 不在目前的網頁元素裡,則往下滑,加載新貼文
while not find:
try:
----------------------
取得讚數及留言數的程式內容
----------------------
# 找到之後就可以回傳‘找到了’
find = True
except:
# 找不到就往下滑
scroll = 'window.scrollBy(0,250)'
browser.execute_script(scroll)
continue

這時,可以用一個 「while 迴圈」來重複嘗試抓取的動作,如果找不到貼文的所在位置的話,就將頁面往下滑。

而下滑的方法我們使用 Javascript 中的window.scrollBy()
每找一次都將頁面下滑250個像數。

直到找到了就回傳find = True,電腦就知道「哦~您找到了!」
它就會停止再繼續做下滑的動作。

--

--