作者:黃鴻鈞 / 臺灣大學計算機及資訊網路中心程式設計組行政專員
網頁爬蟲(web crawler),是指使用程式自動撈取網頁上的資料,Python可以簡單的撰寫程式來實現這個目的。爬蟲得到的資料經過處理後,可以再利用一些方法,例如:網頁上是否出現了特定內容、網頁資訊是否更新等等,此時再透過LINE Notify發出通知訊息,隨時掌握到網頁最新動態。
Line Notify介紹
Line Notify是通訊軟體LINE裡的一個功能,使用者可自行呼叫API來傳送訊息。與網站服務連動完成後,LINE所提供的官方帳號「LINE Notify」將會傳送通知。不僅可與多個服務連動,也可透過LINE群組接收通知。
1. 註冊LINE Notify服務
進到LINE Notify的官方服務網站(https://notify-bot.line.me/zh_TW/),
點選右上角的登入,帳號註冊方式在這就不贅述,請自行準備好LINE帳號做登入。
登入後,點擊右上角使用者名稱,再點選「管理登錄服務」
來到此頁面後,點選「登錄服務」
填寫LINE Notify服務的各項資料,填寫內容僅供參考,可自行設計,僅「服務網址」及「Callback URL」兩項需填上http://127.0.0.1,這是因為等等我們的Python會在本機上執行,資料填完再點擊「同意並前往下一步」。
備註:Email要填寫能夠正常收信的,沒收到認證信不能啟用服務。
檢查填寫的資料無誤後點選「登錄」
查看剛剛填寫的Email信箱,找到一封「LINE Notify註冊用網址通知」,點選信件內文中【LINE Notify註冊用網址】下面的連結進行啟用,完成後回到剛剛的頁面點擊「前往服務一覽」。
現在我們可以看到新增了一個服務,再來點擊右上角使用者名稱,選擇「個人頁面」。
切換頁面後,點選下方的「發行權杖」。
填寫權杖名稱,這次用的是From Python,之後發訊息時會在訊息最前面自動加上【From Python】,可自行設計想要的權杖名稱。在要接收通知的聊天室點擊「透過1對1聊天接收LINE Notify的通知」,再來點擊最下方的「發行」。
這時會跳出權杖(token),把這一整串密碼複製保存起來,這邊沒存到就要從頭再來一遍了,建議不要按關閉,直到等等Python確定可執行再關閉。至此註冊LINE Notify服務大功告成,接下來要寫Python了。
2. 撰寫Python程式碼
Python的安裝這邊就不贅述,下面用Visual Studio Code來撰寫Python的程式碼,請先安裝兩個套件:requests、BeautifulSoup,requests是要拿來做網頁的request,BeautifulSoup則是網頁爬蟲的套件。
url是放要爬蟲的網頁,這裡用PTT的Movie板當示範(https://www.ptt.cc/bbs/movie/index.html),先用reuests.get()取得資料後,再用BeautifulSoup()來轉成我們看得懂的HTML,下一步需要一些HTML及CSS的基礎知識,select()擷取我們要的HTML元素內容,這邊要擷取的是<div class=title>下的<a>,最後再用回圈把撈到的文字填進msg傳回。
再來我們要用LINE Notify的API來傳送訊息,這部份需要依照API的參數填資料,程式碼比較固定,重點在於最後用requests.post()把參數傳給API(https://notify-api.line.me/api/notify)。
在主程式把註冊得到的token填上,還有想要爬蟲的網址填上,再依序呼叫上面兩個函式。
執行後可以正常收到LINE Notify就代表成功了
下面附上程式碼的文字版:
import requests
from bs4 import BeautifulSoup
def PTTcrawler(url):
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
posts = soup.select("div.title a")
msg = ""
for item in posts:
msg += item.text + "\n"
return msg
def LineNotify(token, msg):
headers = {
"Authorization": "Bearer " + token,
"Content-Type": "application/x-www-form-urlencoded"
}
params = {
"message": msg
}
r = requests.post("https://notify-api.line.me/api/notify", headers=headers, params=params)
if __name__ == "__main__":
token = "你的token" #從LINE Notify取得的權杖(token)
url = "https://www.ptt.cc/bbs/movie/index.html" #要爬蟲的網址
msg = "最新文章列表:\n" + PTTcrawler(url) #要在LINE上跳出的提示訊息
LineNotify(token, msg)
|
結語
Python網頁爬蟲的知識跟技巧很龐大,這次僅僅只是做個開頭介紹,重點在於示範如何將Python網頁爬蟲跟LINE Notify做一個連接。程式可以在改寫後做出更多不一樣的功能,像是商品搶購機器人、追蹤股價趨勢、實價登錄房價分析等等,這些都是程式設計師可以再去發想創作。