Web Crawler 爬蟲

Web Crawler 網路爬蟲 以Python實作

陳信宏 Derek Chen 2020/12/11 17:06:54
5083

一、網路爬蟲概論

簡單來說,網路爬蟲是一種對網站自動擷取資訊的一項技術,透過程式模擬使用者行為去取得網頁的內容。

 

二、流程

1.設定目標:即想要取得的資訊,如股票價格等。

2.觀察網頁:觀察網頁內容,如資料在HTML元素的位置等。

3.解析內容:透過程式取得網頁,並取出所需的資訊。

(取得資料後要存在檔案或是資料庫就是看自己的需求如何再另行設計了。)

 

三、實作

本次實作使用python,但其實不管哪種語言,流程都是差不多的。

1.爬蟲是用程式模擬使用者瀏覽網頁,所以要使用 Python 的 requests 模組來模擬,

再來要設定撈取的網址,本次實作Goodinfo!台灣股市資訊網當作範例。

#使用requests模組模擬試用者瀏覽網站
import requests

# 設定想要爬資料的網址
url = 'https://goodinfo.tw/StockInfo/ShowSaleMonChart.asp?STOCK_ID=2330'

# 加入header模擬為一般使用者
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}

2.觀察網頁,觀察自己需要的資訊在整個html語法的位置。

這裡要搭配使用 Python 的 Beautiful Soup 模組並搭配 CSS 選擇器來取出我們所爬取的網頁內容。

CSS 選擇器的部分,可以使用Chrome 瀏覽器的複製選擇器功能(點選到元素後按右鍵),取得元素位置的selector。

複製出來的結果如下:

#row0 > td:nth-child(1) > nobr

將結果放到程式內,確認撈取的資訊是否正確。

此時可以發現這個網頁是以row+數字來做每一行的id值的賦予。

這個發現代表我們可以使用迴圈來取得多筆資料。

 

3.將想要撈取的資料整理後用程式輸出。

例如:想取得一整年每個月的最高價跟最低價。

先重複第二步取得資料的選擇器,將所需的資料都撈出來

加入迴圈取得整年的資料,

 

 

附上完整程式碼:

import requests
from bs4 import BeautifulSoup

url = 'https://goodinfo.tw/StockInfo/ShowSaleMonChart.asp?STOCK_ID=2330'

headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0;Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/65.0.3325.181 Safari/537.36'}

resp = requests.get(url, headers=headers)

# 設定編碼為 utf-8 避免中文亂碼問題
resp.encoding = 'utf-8'

# 轉成 BeautifulSoup 物件
soup = BeautifulSoup(resp.text, "html.parser")

# 加入迴圈取得多筆資料
for index in range(0, 12):
  data_month = soup.select(f'#row{index} > td:nth-child(1) > nobr')[0].text
  price_high = soup.select(f'#row{index} > td:nth-child(4) > nobr')[0].text
  price_low = soup.select(f'#row{index} > td:nth-child(5) > nobr')[0].text
  # 將取到的資料印出來
  print(data_month + '\t最高' + price_high + '\t最低價:' + price_low)

 

四、後記(個人心得):

個人覺得爬蟲是個有趣的東西,

尤其是再觀察網頁結構時,可以發現其實類似的資訊都放在相似的地方,

只要稍微花點心思去歸納整理就可以得出其中規律。

一但規律找到了,就可以在另外設計頻率跟條件去取的同網站的其他資料。

但是要注意的是,不是每個網站都喜歡被人家爬資料,

所以運用時需要多多注意唷。

感謝科技及開發者帶給我們更多更方便的生活。

 

陳信宏 Derek Chen
2D06C0634B5DF0450A508E1AE9D37B2E
2021/02/18 11:52:43

您好請問下面這段的[0]代表甚麼意思

 data_month = soup.select(f'#row{index} > td:nth-child(1) > nobr')[0].text