fbpx

前言

哈囉,大家好,我是Teresa~爬蟲小專題的進度是上一集成功將Facebook的貼文載入,這集主軸就在蒐集貼文中有關於成效的資訊了。

其實在Google上搜尋相同的爬蟲目標,在各個網站中有很多程式碼可以參考,但Teresa真的是各種嘗試,卡了很多bug,挫折重重😰,還好後來隊友有幫助我修改程式碼,但還是希望總有一天能自己成功完成一個小專題。

上集回顧……

爬蟲目標

抓取Facebook的貼文,展開貼文中所有留言與分享、表情符號數量,了解貼文的成效

達成方法

一、策略拆解

假設我想要手動取得這些資訊的話,會做出的行為有:

  1. 打開 Chrome 瀏覽器
  2. 開啟 Facebook 頁面並登入
  3. 點擊想分析的 Facebook 社團或粉絲專頁
  4. 將該社團或粉絲專頁的貼文載入
  5. 將貼文的留言展開
  6. 蒐集貼文的資訊(按讚數、分享次數以及留言數)
  7. 統整資訊

如何開啟Chrome瀏覽器、登入Facebook頁面、將貼文載入等前四步驟請參見Python初學者筆記EP. 5_爬蟲應用(上)

本集開始!

二、將步驟化為程式碼

Step5:抓取社團中的每篇貼文

soup = Soup(driver.page_source, "lxml")

frames = soup.find_all(class_='du4w35lb k4urcfbm l9j0dhe7 sjgh65i0')

lxml是什麼?

  1. 解析HTML需要透過HTML解析器,它可以為工程師提供一個介面,來存取或修改「HTML」程式碼,如:DOM;或是清理有語法錯誤的HTML,改善縮排樣式等,如:HTML Tidy。
  2. 在Python語言中,Beautiful Soup便可以用來解析HTML與XML文件。

對應的解析器有:

    • Python標準庫中內建的解析器(html. parser)
    • lxml是另一種主要的解析器
    • html5lib

選擇lxml的原因是它的效率較高,Python標準庫內建的解析方法不夠穩定且速度不夠快。

語法說明:

driver.page_source:可以用來取得網頁的原始碼。在此選擇用 lxml解析器來解析。

.find_all:可以找出所有特定的HTML的標籤節點。這裡設定的節點是以class為對象,只要符合這個規則就會被存進名為frames的變數中。

如何知道Facebook貼文的class是什麼?

此方法和EP.5的步驟2找登入欄位的ID方式相同:

  1. 在頁面中按F12或是點擊右鍵後點選「檢查」
  2. 點擊最左邊的icon
  3. 將著將游標移至貼文,等到貼文全部被反藍之後,即可點擊
  4. 便可以在右半邊的畫面中看到 class name的字串是什麼了
  5. 如果不確定是否抓對,也可以反向操作,將鼠標在右半邊畫面上移動,會看到左半邊相對應的元素是什麼

Step6-1:抓取貼文中的按讚數

like = [ ]

for i in frames: 

    thumb = i.find('span',class_="gpro0wi8 pcp91wgn")

    if(thumb == None): 

        like.append('0')

    else:

        like.append(thumb.text)

語法說明:

  1. 先建立一個空的list(列表),將其命名為like,用來存放貼文中按讚的數量。
  2. 接著用 for迴圈跑存放在 frames 中的所有貼文。
  3. .find()可以依照你所指定的格式去取得資料,這裡用的是HTML的span標籤中的class。
  4. 找到貼文中所指定的資料後,存進thumb的變數中
  5. 用條件語句設定,如果thumb的變數是「空」的話,就在like的list中添加(.append)新的資料’0’,如果不是空的話,則用.text獲取裡面的文本,並在 like 的 list 中添加所取得的文本。

取得文本的另一個方式為.string,差別請見此網站

Step6-2:抓取貼文中的留言數

comment_nums = [ ]

for i in frames: 

read = i.find('span',class_="oi732d6d ik7dh3pa d2edcug0 hpfvmrgz qv66sw1b c1et5uql a8c37x1j muag1w35 enqfppq2 jq4qci2q a3bd9o3v knj5qynh m9osqain")

if(read == None): 

comment_nums.append('0則')

else:

comment_nums.append(read.text)

語法說明:

跟Step6-1的思考邏輯相同,只是以不同的 list 儲存資料,只要改掉你所指定的標籤,就可以抓取留言數

Step6-3:抓取貼文中的分享數

share = [ ]

for i in frames: 

    read = i.find_all('span',class_="oi732d6d ik7dh3pa d2edcug0 hpfvmrgz qv66sw1b c1et5uql a8c37x1j muag1w35 enqfppq2 jq4qci2q a3bd9o3v knj5qynh m9osqain")

    if(read == None): 

        share.append('0次')

    else:

      for rd in read: 

        if(rd == None): 

          share.append('0次')

        else:

          print("read")

          print(rd)

          share.append(rd.text)

語法說明:

與Step6-1的思考邏輯相同,先建立名為 share 的空 list ,接著跑for迴圈,抓取分享的資料,如果沒有資料的話,新增0次,如果有資料的話,再跑另一個for迴圈,將read的資料讀過一次,如果取得資料後再增加它的文本。

Step7-1:將取得的按讚數做整理

for i in range(len(like)):  

    if(like[i].find('\xa0萬') != -1):

        like[i] = int(float(like[i][:like[i].find('\xa0萬')])*10000)

    else:

        like[i] = int(like[i].replace(',',' '))

print('按讚數:', like)

語法說明:

使用按讚數的 list:like的長度跑for迴圈,如果該篇貼文按讚數多的話,取得的資料可能會出現\xa0萬。

\xa0表示的是不間斷的空格,因此需要把資料做處理:將\xa0萬去掉,並將數字乘上10000,接著把有’,’的字符取代成空格。

接著再把 like的 list 列印出來。

Step7-2:將取得的留言數做整理

for i in range(len(comment_nums)):

    index = comment_nums[i].find("則留言")

    comment_nums[i] = int(comment_nums[i][:index].replace(',',''))

print('留言數:', comment_nums)

語法說明:

和Step7-1的概念相同,我們取得的留言數資料會有”則留言”還有’,’,因此需要把它們去除與取代。

接著再把 comment_nums的 list 列印出來。

Step7-3:將取得的分享數做整理

for i in range(len(share)):

    index = share[i].find('次')

    share[i] = int(share[i][:index].replace(',',''))

print('分享數:', share)

語法說明:

和Step7-1的概念相同,把分享數會顯示的’次’和’,’去掉,再把share的list列印出來。

後記

透過寫小專案的練習,真的很深刻的體會自己的不足,這集的程式碼能夠產出真的參考了很多前輩們寫的教學,但遇到的狀況真的很多很複雜,明明教學中的程式碼可以順利執行,自己用的時候就會遇到很多報錯,只好拿著程式碼到處請教,詢問隊友為什麼這個網站的程式碼要這樣寫,中途真的是蠻崩潰的,可想而知一個小功能要用程式碼從無到有,真的需要下很多功夫,這次就當成學習前輩的思路,也督促自己要多加練習。

 

如果喜歡我寫的文章可以加入程式小白的 JS Python 學習群的社團,和我還有其他學習夥伴一起討論、交流、互動哦~我們下次見囉!

另外,在這裡想和大家分享一個資訊,10/29有一場免費的線上小聚,主題是機器學習!這也是我在了解Python的應用領域中感興趣的主題之一,Teresa已經報名了也推薦給大家~

活動資訊:https://pse.is/vjqz8

參考資料

  1. 好奇自己FB的互動性指標嗎?!用Selenium爬蟲-搞定貼文按讚數、留言數、分享數-系列2(附Python程式碼)
  2. https://blog.csdn.net/wangbowj123/article/details/78061618
  3. https://www.runoob.com/python/att-list-append.html
  4. https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
  5. https://www.wibibi.com/info.php?tid=113
  6. https://medium.com/datainpoint/python-essentials-parsing-html-5620b4c06e50
  7. https://zh.wikipedia.org/wiki/HTML%E8%A7%A3%E6%9E%90%E5%99%A8%E5%AF%B9%E6%AF%94
  8. https://yanwei-liu.medium.com/python%E7%88%AC%E8%9F%B2%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98-%E4%BA%8C-selenium%E8%87%AA%E5%8B%95%E5%8C%96-ab0a27a94ff2

 

Leave a Reply