前言
哈囉,大家好,我是Teresa~爬蟲小專題的進度是上一集成功將Facebook的貼文載入,這集主軸就在蒐集貼文中有關於成效的資訊了。
其實在Google上搜尋相同的爬蟲目標,在各個網站中有很多程式碼可以參考,但Teresa真的是各種嘗試,卡了很多bug,挫折重重😰,還好後來隊友有幫助我修改程式碼,但還是希望總有一天能自己成功完成一個小專題。
上集回顧……
爬蟲目標
抓取Facebook的貼文,展開貼文中所有留言與分享、表情符號數量,了解貼文的成效
達成方法
一、策略拆解
假設我想要手動取得這些資訊的話,會做出的行為有:
- 打開 Chrome 瀏覽器
- 開啟 Facebook 頁面並登入
- 點擊想分析的 Facebook 社團或粉絲專頁
- 將該社團或粉絲專頁的貼文載入
- 將貼文的留言展開
- 蒐集貼文的資訊(按讚數、分享次數以及留言數)
- 統整資訊
如何開啟Chrome瀏覽器、登入Facebook頁面、將貼文載入等前四步驟請參見Python初學者筆記EP. 5_爬蟲應用(上)
本集開始!
二、將步驟化為程式碼
Step5:抓取社團中的每篇貼文
soup = Soup(driver.page_source, "lxml") frames = soup.find_all(class_='du4w35lb k4urcfbm l9j0dhe7 sjgh65i0')
lxml是什麼?
- 解析HTML需要透過HTML解析器,它可以為工程師提供一個介面,來存取或修改「HTML」程式碼,如:DOM;或是清理有語法錯誤的HTML,改善縮排樣式等,如:HTML Tidy。
- 在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方式相同:
- 在頁面中按F12或是點擊右鍵後點選「檢查」
- 點擊最左邊的icon
- 將著將游標移至貼文,等到貼文全部被反藍之後,即可點擊
- 便可以在右半邊的畫面中看到 class name的字串是什麼了
- 如果不確定是否抓對,也可以反向操作,將鼠標在右半邊畫面上移動,會看到左半邊相對應的元素是什麼
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)
語法說明:
- 先建立一個空的list(列表),將其命名為like,用來存放貼文中按讚的數量。
- 接著用 for迴圈跑存放在 frames 中的所有貼文。
- .find()可以依照你所指定的格式去取得資料,這裡用的是HTML的span標籤中的class。
- 找到貼文中所指定的資料後,存進thumb的變數中
- 用條件語句設定,如果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列印出來。
後記
透過寫小專案的練習,真的很深刻的體會自己的不足,這集的程式碼能夠產出真的參考了很多前輩們寫的教學,但遇到的狀況真的很多很複雜,明明教學中的程式碼可以順利執行,自己用的時候就會遇到很多報錯,只好拿著程式碼到處請教,詢問隊友為什麼這個網站的程式碼要這樣寫,中途真的是蠻崩潰的,可想而知一個小功能要用程式碼從無到有,真的需要下很多功夫,這次就當成學習前輩的思路,也督促自己要多加練習。
Python初學總整理 全系列:
Python初學總整理 第3講:Python資料型態和運算子
Python初學總整理 第4講:Python條件、迴圈與函數
Python初學總整理 第6講:爬蟲應用(下) (本篇)
Python初學總整理 第7講:爬蟲實例解析 – 以爬取臉書社團為案例,使用 Selenium 來進行網頁模擬爬蟲
文章看完還是不知道該從哪裡下手?
就從線上課程開始吧!不讓你獨自摸索好幾個月,用8小時帶你走完基礎與精華,培養你基礎的Python概念,讓自學下一步不是煩惱!
全新Python 課程上架,8小時基礎實戰!,限時優惠只要NT 600 (HDK 120 起)!
不讓妳浪費一整天,只要你8小時,就能讓你學會基礎!
如果你的入門還在單打獨鬥,歡迎來到快樂學程式找到志同道合的夥伴,你的自學之路不孤單。
參考資料
- 好奇自己FB的互動性指標嗎?!用Selenium爬蟲-搞定貼文按讚數、留言數、分享數-系列2(附Python程式碼)
- https://blog.csdn.net/wangbowj123/article/details/78061618
- https://www.runoob.com/python/att-list-append.html
- https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
- https://www.wibibi.com/info.php?tid=113
- https://medium.com/datainpoint/python-essentials-parsing-html-5620b4c06e50
- https://zh.wikipedia.org/wiki/HTML%E8%A7%A3%E6%9E%90%E5%99%A8%E5%AF%B9%E6%AF%94
- 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