讓聊天機器人開啟爬蟲技能!

Chatbot學習筆記-Day5

Jason Tsai
Aug 28, 2021

聊天機器人最重視的就是互動性了,如果它能直接幫忙爬蟲,那我一定會愛不釋手。

Web Crawler

要想讓我們的Line Chatbot開啟爬蟲技能,得先對網路爬蟲(Web Crawler)有一定的認識,那爬蟲究竟是什麼意思呢?

網路爬蟲是一種用來自動瀏覽網頁的網路機器人。其目的一般為編纂網路索引、網路搜尋引擎等站點。網路爬蟲可以將自己所存取的頁面儲存下,以便搜尋引擎事後生成索引供使用者搜尋(擷自維基百科)。

寫的有點複雜對吧?

簡而言之,網路爬蟲可以想成我們對一個網站發出請求(Request)後,取得相關資訊的過程。

那如果要利用Python寫出爬蟲程式,該使用哪些套件呢?

上方應該可說是與爬蟲應用最相關的兩個套件了,其中"requests"主要負責對網站發出請求、而"BeautifulSoup"則處理HTML原始碼的解析。

關於這兩個套件,大家可以點擊超連結查看官方的Documentation。

An Example

對爬蟲有基礎的理解後,就可以開始試著寫一隻爬蟲程式了,整個爬蟲的過程大概可以分成以下幾個步驟:

  1. 尋找目標網站
  2. 檢視網頁原始碼
  3. 確認要爬梳的資料標籤
  4. 撰寫爬蟲程式並進行資料清洗

1. Finding Target

假設我們今天要爬取一個產出財經新聞的網站,必需先確認我們的程式碼是否能夠順利地抓取網頁原始碼。

也就是說,網站是否接受了我們的請求(Status Code[200])。

圖一 確認回應狀態
  • Line 5 : 利用"get"對目標網站發出請求
  • Line 7-10 : 確認HTTP狀態碼,"200"表示良好

那一切順利的話,輸出應該會像下圖這樣:

圖二 output

2. HTML parser

確保Status Code正常後,就讓BeautifulSoup來發揮它強大的功用吧!我們要開始來煮一碗湯,至於配方?可以看看下面這張:

圖三 解析HTML

我們在Line 1給予"BeautifulSoup"兩個參數讓它煮湯,"re.text"是我們剛剛發出請求後所收回的東西、"lxml"則是解析器(parser)。

除了"lxml"外,還有"html.parser"這個選擇,但目標都是將我們取回的資料解析成可讀的網頁原始碼。

因此,執行完這兩行可以輕鬆得出以下output:

圖四 網頁原始碼

看著就像某種天書般不易親近呢,但如果我們在目標網站按下右鍵,

選擇"檢視網頁原始碼"就可以看到一致的內容囉。

3. Searching the tree

接著來確認一下我們要的資料到底在哪裡。

進入目標網站,假設我們要爬取的是新聞的文章標題,可以在標題的位置按下"檢查",就會知道它在HTML的位置囉。

圖五 檢查網站
圖六 檢查網站

可以發現,每一列標題都被包在名為"div"的標籤當中,而且還非常整齊,有著一致的"style"。

接著我們再往下層點開,多了解它一點吧!

圖七 確認標籤位置

哦!原來每個"div"裡還藏著"a"標籤,內容不但有標題,還附帶每篇文章的超連結(href, Hyperlink Reference),真是太好了。

看來只要知道怎麼抓出這裡的內容,就差不多完事了對嗎?

沒錯,我們來看一下該如何篩選出這些標題超連結們。

圖八 爬取資料
  • Line 3 : 利用"find_all"函式找出全部"class"等於"_1Zdp"的"a"標籤
  • Line 4-5 : 依序提出篩選後HTML的文字(.text)內容
  • Line 6 : 提出超連結並在前方加上目標網站的根網址(方便直接連結)

這樣就能提出我們要的標題與其連結囉:

圖九 output

4. Work on Chatbot

一切順利,最後只要改寫入我們的Chatbot程式就可以了,唯需注意的是,若希望使用"文字"訊息回覆使用者,"list"的寫法就不太管用。

因此,放在Line Chatbot上的程式碼要小修一下:

圖十 完整程式碼
  • Line 10 : 宣告一個存放回覆內容的字串
  • Line 15 : 用"enumerate"逐個提出爬取的內容
  • Line 16 : 避免版面太雜,限定回覆8則即時新聞即可
  • Line 19 : 每次迭代都加上本次取出的標題以及超連結

最後再設定一個啟動的關鍵字給我們Chatbot,它就可以快速爬取最即時的新聞囉,我這次是設定為"新聞"。

來測試一下:

圖十一 測試結果

成效看來還不錯,完整程式碼的部分則可以在這兒找到!

那今天就先到這邊,感謝大家的觀看。

--

--

Jason Tsai

Data Analyst in financial industry with experience as Tableau consultant and DA at Martech field.