跳到主要內容

發表文章

目前顯示的是 六月, 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 B

[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) ,各位可以把

[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 套件爬取第一頁的內容,如下範例 :

[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