fbpx

前言

自從上集學完函數和迴圈之後,覺得光只有學習,都可以理解好像沒有什麼問題,但如果要應用的話,就會不知道從何開始,因此Teresa開始想要嘗試寫個小作品看看,因此之後 Python初學者學習筆記會朝著實作的方向前進,當成自我練習還有紀錄。

爬蟲介紹

提到 Python,最經典且絕對不能漏掉的應用莫過於爬蟲了,那什麼是爬蟲呢?

—它是一種可以「自動」抓取網頁資訊的程式

現在資訊的變動快速,當在 Google等瀏覽器上搜尋任一關鍵字,搜尋到的結果都成千上萬筆,但人一天所擁有的時間終歸只有24小時,想要處理一件事的時候,很難將前置資料調查得盡善盡美,且當相同的動作必須重複上百遍、上千遍的時候,必定會又累又無趣。這時候如果有「自動化」程式的幫助,處理事情的效率便會提高。對於爬蟲的應用可以到這個網站看看。

爬蟲目標

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

達成方法

一、步驟拆解

Teresa曾聽會寫程式的人說過:「程式只是工具,想要開始寫程式要先知道如何解決問題,如果不知道問題的解法,是沒辦法將解法化為程式的。」

如果我今天經營Facebook社團或粉絲專頁,我會想要了解每篇發出去的貼文成效如何,除了一些後台可得到的資訊外,貼文的互動率是最可以反應出成效的方式了。而在Facebook上貼文與互動率有關的指標不外乎就是:按讚數、分享次數以及留言數。後續的貼文分析,包含是不是因為主題較吸引人或是文案寫得較好等影響該篇貼文的互動率的評估指標,就不在此深究。

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

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

二、相關模組簡介

將步驟拆解出來後,就可以想辦法把步驟化為程式碼了,那在 EP. 1曾經提過Python強大的地方除了開源以外,也有很多豐富的函式庫和套件模組可以應用。

套件與模組的差異?

  • 模組 = 一個python檔案;套件 = 一個目錄,模組庫、函式庫
  • 匯入:import、取用: 「.」、重新命名:as
  • from 模組 import 函式:可避免建立新的名稱空間,並可以直接取用函式
  • PyPI (Python Package Index) =第三方套件集中地
  • pip:Python的套件管理工具,可以下載、安裝、升級、管理、移除套件
  • 內有常用套件包含:網站框架、圖片處理、科學計算等
  • 相關資源可以到https://pypi.org/https://github.com/

那在這次的爬蟲目標會用到哪些套件或模組呢?主要有:

  1. Selenium:模擬使用者的動作操縱瀏覽器。
  2. Webdriver:Selenium需要特殊的Webdriver才能和瀏覽器溝通。
  3. BeautifulSoup:解析HTML結構,用來搜尋與擷取網路上所需的資料。
  4. time:處理日期和時間。

如果想要多了解更詳細的用法和說明可以到以下網頁:

  1. Selenium
  2. BeautifulSoup1、BeautifulSoup2
  3. time

三、將步驟化為程式碼

首先,有很多功能需要先匯入相關的模組,因此我們得安裝好那些模組才可以使用

Step1 : 安裝相關套件或模組

pip install selenium

pip install beautifulsoup4

Step2 : 匯入相關套件或模組

from selenium import webdriver

from bs4 improt BeautifulSoup

import time

Step3 : 開啟Chrome瀏覽器

driver = webdriver.Chrome(“Webdriver的存放路徑")

這個步驟雖然看起來簡單,但當時我可是花了一段時間解決bug,因為如果瀏覽器的版本和Webdriver的版本不同,就不能使用。

如何確定Chrome的版本?

打開 Chrome 瀏覽器後,點擊右上角的三個點點(自訂及管理Google Chrome),會進到設定的頁面,點擊「關於 Google Chrome」即可以看到版本號(如下圖)

接著,可以到此頁面下載 ChromeDriver,下載好的執行檔可以和 .py檔放在同一個資料夾下或是放到你所知道的路徑下,並在程式碼中指定路徑,這樣就可以執行了。執行程式碼所開啟的 Chrome會在下方顯示:Chrome目前受到自動測試軟體控制(如下圖)。

Step4 : 開啟 Facebook頁面並登入

driver.get("http://www.facebook.com")	#開啟Facebook

time.sleep(3)		#延遲程式執行的時間

driver.find_element_by_id("email").send_keys("example@gmail.com")

# 將USERNAME改為你的臉書帳號

driver.find_element_by_id("pass").send_keys("psssword") 

# 將PASSWORD改為你的臉書密碼

driver.find_element_by_name("login").click()

# 讓網頁找到登入並點擊

time.sleep(3)

語法說明:

driver.get(url):可以讓瀏覽器前往所指定的網址。

time.sleep(time):可以使程式碼延後幾秒執行,讓瀏覽器載入。

driver.find_element_by_id:是Selenium中元素定位的方法之一。

如果想知道Selenium有哪些元素定位的方法,可以查看此官方文件

send_keys( ):可以幫助我們將該元素的內容替換,在這裡就是將內容替換成 Facebook的帳號密碼。

那如何知道 Facebook 登入欄位的 id 是什麼呢?

可以在 Facebook的頁面按 F12或是點擊右鍵後點選「檢查」,會看到像下圖右半邊的黑色畫面,這時點擊最左邊的icon,接著將游標移至你想取得的欄位,點擊後在黑框中會看見該欄位的元素屬性,以下圖為例,我們可以看到輸入電子郵件的欄位,它的id是”email”,以相同的方法可以看到輸入密碼的欄位,其id是”pass”。

Step5 : 點擊想分析的 Facebook社團或粉絲專頁

driver.get("想分析Facebook的社團或粉絲專頁的網址")

time.sleep(2)

此步驟與 Step4同理,不再次贅述。

Step6 : 將該社團或粉絲專頁的貼文載入

for i in range(12): 	# 讓頁面滾動x次

    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

  #讓頁面滾動到最底下

    time.sleep(2)	 # 等待2秒鐘讓頁面讀取

語法說明:

由於 Facebook的貼文一次只會載入一部份,但如果想要蒐集相關資料的話,必須先讓網頁把貼文載入,因此這裡用 for迴圈,讓程式重複執行,迴圈的概念可以看 EP. 4

driver.execute_script(“window.scrollTo(0, document.body.scrollHeight);”) 牽涉到JS的觀念,如果想了解更多可以到此網站

EP.5 先完成到步驟4,下一集會把剩下的步驟完成。如果有可以修改的程式碼,歡迎留言和我分享。另外10月底有一場舉辦的線上小聚有聊機器學習!這也是我感興趣的題目之一,Teresa已經報名了也推薦給大家~

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

後記

Teresa是第一次做專案,對於要將檔案上傳到雲端分享給隊友看的時候,沒有仔細思考,不小心把環境變數 commit上去,直接將自己的 Facebook的帳密給隊友了,還好隊友馬上就教我可以利用 dotenv 套件讀取 .env檔儲存敏感的資訊。建立的方法可以參考此網頁

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

 

Leave a Reply