跳到主要內容

文章

目前顯示的是 六月, 2020的文章

[Python+LINE Bot教學]6步驟快速上手LINE Bot機器人

Photo by Yura Fresh on Unsplash 每當朋友或家人要聚餐時,是不是總要花很長的時間尋找評價不錯的餐廳?不但要確認營業時間、消費價格及地點,還要觀看許多的美食文章才有辦法決定,這時候如果有人能夠明確提供幾間符合條件且有人氣的餐廳作為選擇,想必會省事許多。
所以筆者開發了一個美食的LINE Bot小作品,透過對談的方式瞭解使用者所要尋找的餐廳條件後,利用Python網頁爬蟲取得目前正在營業的五間最高人氣餐廳資料,回覆給使用者作為參考。
為了要讓想學習的您能夠由淺入深,瞭解其中的實作過程,所以將會分成三篇文章來進行教學。
2020/06/30補充說明 而在進行實作前,先來看一下LINE Bot主要的執行架構,如下圖: 使用者透過LINE發送訊息時,LINE Platform將會進行接收,並且傳遞至我們所開發的LINE Bot執行邏輯運算後,透過LINE所提供的Messaging API回應訊息給LINE Platform,最後再將訊息傳遞給使用者。
其中Messaging API(Application Programming Interface),就是LINE官方定義的回應訊息標準介面,包含Text(文字)、Sticker(貼圖)、Video(影片)、Audio(聲音)及Template(樣板)訊息等,完整的說明可以參考LINE的官方文件
所以在我們的LINE Bot回應訊息時,就要依據Messaging API定義的規範,傳入相應的參數後,Messaging API就會回應使用者相對的訊息類型。簡單來說,就是LINE Platform與LINE Bot的溝通橋樑。
而本文就先以最基本的使用者發送什麼訊息,LINE Bot就回應什麼訊息為例,讓讀者體會其中的運作方式,整體架構如下圖: 在LINE Bot的部分,使用Django框架來進行建置,並且透過Messaging API回應Text(文字)訊息。在下一篇文章中,將會加入Python網頁爬蟲,取得美食網站的資訊回應給使用者。
本文的實作步驟包含: 建立Provider建立Messaging API channel設定LINE Bot憑證開發LINE Bot應用程式安裝Ngrok設定LINE Webhook URL一、建立Provider要開發LINE Bot前,首先需建立一個Provider,也就是服務提供者…

[Python爬蟲教學]Python網頁爬蟲結合LINE Notify打造自動化訊息通知服務

Photo by William Hook on Unsplash 日常生活中,每個人都有關注的事情,像是演唱會門票的開賣、喜歡的商品降價或新電影上檔等,而為了要及時自動取得這些資訊,Python網頁爬蟲就被廣泛的使用,除了將爬取的資訊透過 [Python實戰應用]Python寄送Gmail電子郵件實作教學文章介紹的電子郵件進行通知外,另一個備受歡迎的接收通知管道就是LINE。
而LINE官方提供了LINE Notify的服務,只要完成和LINE網站的連動設定,就可以透過LINE Notify推播或傳送訊息至目標使用者的LINE中。
本文即以Udemy線上課程網站為例,利用Python網頁爬蟲關注想購買的線上課程,只要低於指定的價格,就透過LINE Notify服務傳送訊息給使用者。本文的重點包含: 登錄LINE Notify服務 發行LINE Notify權杖(Token) 整合Python網頁爬蟲及LINE Notify服務 一、登錄LINE Notify服務首先,前往LINE Notify官網,來進行Python網頁爬蟲與LINE Notify的連動設定,如下圖: 點選右上角的登入,輸入LINE帳號及密碼,如下圖: 成功登入後,就可以看到「管理登錄服務」頁面,如下圖: 接著,點擊「登錄服務」,輸入LINE Notify服務的基本資料,由於本文的Python爬蟲是跑在本機上,所以「服務網址」及「Callback URL」皆為http://127.0.0.1,如下範例: 填寫完成後,點擊「同意並前往下一步」,就可以看到剛剛所輸入的基本資料,確認沒問題點選「登錄」按鈕即可,如下範例: 這時後LINE Notify會發送認證郵件到登錄服務時,所填寫的電子郵件帳號中,如下圖: 完成電子郵件認證後,點擊「前往服務一覽」,可以看到LINE Notify配發了一個Client ID(帳號)給我們,如下圖: 而密碼則需點擊服務,才可以看到,如下圖:
以上就完成了LINE Notify服務的基本資料登錄了。 二、發行LINE Notify權杖(Token)有了的服務帳號及密碼後,接下來,就可以向LINE Notify取得權杖(token),各位可以把它想像是一張活動的門票,只要參加者有這張門票,就可以進入會場,並且主辦單位會為參加者提供多樣的服務。
同樣的道理,只要程式碼中帶有LINE Notify所給的權杖(t…

[Python爬蟲教學]Python網頁爬蟲動態翻頁的實作技巧

Photo by True Agency on Unsplash 在眾多的網頁中,當要載入的資料量非常龐大時,為了不影響執行效能的情況下,除了會使用滾動捲軸來動態載入更多的資料外,另一種最常見的方式就是利用分頁,來分別顯示特定筆數的資料。
如果Python網頁爬蟲遇到需滾動捲軸,才可爬取更多資料的實作方式,可以參考[Python爬蟲教學]整合Python Selenium及BeautifulSoup實現動態網頁爬蟲文章,而Python網頁爬蟲遇到分頁的網站時,該如何翻頁爬取內容,就是本文要來分享的主題。其中的重點包含: HTTP GET vs POST方法頁碼使用GET的方式頁碼使用POST的方式 一、HTTP GET vs  POST方法在說明Python網頁爬蟲讀取分頁的資料前,先來簡單瞭解一下什麼是HTTP的GET及POST方法。
HTTP的GET方法就像明信片,在上面需要撰寫目的地的地址及內容,其中的地址就像是請求的網址,而內容就像是接在網址後面的參數(querystring),只要拿到這個明信片(網址)的人,都知道要寄送到哪裡及內容是什麼。
HTTP的POST方法就像一般的信件,在信封上需撰寫目的地的地址,而信件內容會在信封中,所以拿到這封信的人只知道會寄送到哪裡,但不會知道內容是什麼,就像是知道請求的網址,但是其中送到伺服器端的資料,無法在網址知道。
瞭解了這兩個HTTP方法的基本觀念後,接下來就使用兩個網站,來分別說明頁碼使用GET及POST方式處理的網站,Python網頁爬蟲該如何翻頁爬取資料。 二、頁碼使用GET的方式大部分的網站分頁,都是使用GET方法來處理,這邊以Inside 硬塞的網路趨勢觀察網站的「AI」類別為例,可以看到網址如下: 當切換至第二頁時,網址為: 這就是典型GET方法的分頁方式,從網址就可以知道目的地網址及傳至伺服器端的頁碼參數(page),當變換page參數的值時,就可以前往對應的頁碼網頁。
接下來,在網頁上按F12鍵,進入開發者模式後,先來看一下要爬取的文章標題HTML原始碼架構,如下圖: 瞭解它的階層架構,就可以利用BeautifulSoup套件爬取第一頁的內容,如下範例: from bs4 import BeautifulSoup import requests # 連結網站 response = requests.get( "…

[Python爬蟲教學]3個建構Python動態網頁爬蟲重要的等待機制

Photo by Agefis on Unsplash 使用Python Selenium套件來開發動態網頁爬蟲時,有一個非常重要的觀念,就是「等待(Waits)」,這是什麼意思呢?簡單來說,就是Python爬蟲程式「等待(Waits)」網頁載入所要使用的元素,進而執行其它的操作。如果沒有處理好,就會時常發例外錯誤或影響執行效率。
各位一定會想說,為什麼Python爬蟲程式要「等待(Waits)」?舉例來說,在開啟一個瀏覽器並且連結到某一個網站時,可以看到瀏覽器標題旁邊會有轉圈圈的圖示,代表網頁正在載入內容元素,在這個圖示消失前,網頁不會顯示所有的內容,這時候如果Python爬蟲程式沒有進行「等待(Waits)」的動作,就執行元素定位及操作,可能就會發生因為要使用的元素還沒載入完成,而產生例外錯誤。
所以,適當的使用「等待(Waits)」機制,可以讓Python爬蟲程式更為穩定,本文將以PChome網站為例,來說明常見的3種「等待(Waits)」機制,包含: sleep(強制等待)Implicit Waits(隱含等待)Explicit Waits(明確等待) 而其中的sleep(強制等待)為Python內建的time模組所提供,Implicit Waits(隱含等待)及Explicit Waits(明確等待)則是Selenium套件提供。 一、sleep(強制等待)強制程式碼停止執行所給定的時間,不論元素是否存在或網頁提早載入完成,都需等待給定的時間,才往下執行,並且每一次需要等待時,就要設定一次,如下範例: from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager import time browser = webdriver.Chrome(ChromeDriverManager().install()) browser.get("https://shopping.pchome.com.tw/") # 前往PChome網站 time.sleep(20) # 強制等待20秒 search_input = browser.find_element_by_id("keyword") # 查詢文字框 search_…