iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
1
Software Development

糊裡糊塗Python就上手系列 第 21

[2020鐵人賽Day21]糊裡糊塗Python就上手-蟲蟲進擊之爬蟲取得資訊(下)

今日目標

整合先前幾篇所提到的一些技巧,並運用在一起,實際製作一支星座爬蟲程式

事前準備

當然要先找好我們將要實作的資料來源,這邊我們使用 唐綺陽每日星座運勢 來做教學展示
(此文章內容非商業行為,僅供教學)

題目說明

這次需要製作可以詢問使用者想要的星座,並給予使用者輸入相對應的回應
之後到上述的網址去尋找資訊,並使用爬蟲的技術將資料抓取回來呈現給使用者觀看今日星座運勢

實際體驗

Step1. 先導入將使用到的模組「requests」、「BeautifulSoup」

import requests
from bs4 import BeautifulSoup

Step2. 接著,觀察各星座網址變化,並製作字典存放資訊

雙子座:
https://ithelp.ithome.com.tw/upload/images/20201006/200913336Yp6IHf8qd.png

巨蟹座:
https://ithelp.ithome.com.tw/upload/images/20201006/20091333R1rGP6SItP.png

可以觀察到僅在網址的最後一段,會變化為相對應將呈現的星座名稱
為了等會方便製作使用者輸入的選項與防呆邏輯,讓我們來做個字典放這些資訊

# 星座轉換字典
zodiacSigns_convent = {
    '1':'Aries',
    '2':'Taurus',
    '3':'Gemini',
    '4':'Cancer',
    '5':'Leo',
    '6':'Virgo',
    '7':'Libra',
    '8':'Scorpio',
    '9':'Sagittarius',
    '10':'Capricorn',
    '11':'Aquarius',
    '12':'Pisces'
}

Step3. 事先製作好將詢問之問題(),並撰寫防呆邏輯,讓使用者僅能填寫數字且數值介於1~12

這邊會是採用 while 迴圈(前面提回圈時並未提到),可以到以下網址大致了解一下用法:
w3schools.com Python While Loops

並且在驗證的地方使用了 isdigit() 來驗證是否僅有數字
str.isdigit():如果字串裡只包含數字則回傳True,否則回傳False

其餘的地方是先前 [2021鐵人賽Day08]糊裡糊塗Python就上手-判斷是非!?(if的應用)

而迴圈中的 break 跟 pass,再次介紹一下:
break:強制跳出整個迴圈
continue:強制跳出本次迴圈,繼續進入下一階段迴圈
pass:不做任何事情,程式持續進行

# 題問說明
question_description = "[1]牡羊座 [2]金牛座 [3]雙子座 [4]巨蟹座 [5]獅子座 [6]處女座 [7]天秤座 [8]天蠍座 [9]射手座 [10]摩羯座 [11]水瓶座 [12]雙魚座,請選擇星座(僅能填數字):"

# 限制填寫內容為數字
while True:
    ans_data = input(question_description)
    # ans_data為數字且數值介於1~12
    if ans_data.isdigit() == True and int(ans_data) > 0 and int(ans_data) < 13:
        break
    else:
        pass

Step4. 接著將使用者輸入的數值透過字典來轉換,並且組合需要的 URL 後使用 requests.get() 向網頁發送請求

# 網址內容為唐綺陽每日星座運勢
url = 'https://www.daily-zodiac.com/mobile/zodiac/' + zodiacSigns_convent[ans_data]
response = requests.get(url)

# 設定讀取編碼(預設 UTF-8)
response.encoding = 'UTF-8'

Step5. 檢查 HTTP 狀態回應碼是否為 200

若是的話,透過 BeautifulSoup 將取得的網頁原始碼分析為結構樹,並取出將呈現的資訊為各別變數

# 檢查 HTTP 回應碼是否為 200
if response.status_code == requests.codes.ok:
    sp = BeautifulSoup(response.text, 'html.parser')
    zodiacSigns_name = sp.select(".middle .name .name")[0].text # 星座名稱
    zodiacSigns_date = sp.select(".middle .name .date")[0].text # 星座日期
    today_date = sp.select(".today li")[1].text # 今日日期
    today_horoscope_weather = sp.select(".today .weather")[0].text #今日心情
    
    # 移除字串開頭的空格 str.lstrip()
    # 移除字串末尾的空格 str.rstrip()
    today_horoscope = sp.select("section article")[0].text.lstrip()

Step6. 印出想提供給使用者的資訊

    # 印出結果
    print('[%s %s 今日運勢]' %(zodiacSigns_name, zodiacSigns_date))
    print('今日日期:%s' %(today_date))
    print('今日心情:%s' %(today_horoscope_weather))
    print('今日評語:\n%s' %(today_horoscope))

Step7. 測試檢查

https://i.imgur.com/8QE7OYj.gif

完整代碼

import requests
from bs4 import BeautifulSoup

# 星座轉換字典
zodiacSigns_convent = {
    '1':'Aries',
    '2':'Taurus',
    '3':'Gemini',
    '4':'Cancer',
    '5':'Leo',
    '6':'Virgo',
    '7':'Libra',
    '8':'Scorpio',
    '9':'Sagittarius',
    '10':'Capricorn',
    '11':'Aquarius',
    '12':'Pisces'
}

# 題問說明
question_description = "[1]牡羊座 [2]金牛座 [3]雙子座 [4]巨蟹座 [5]獅子座 [6]處女座 [7]天秤座 [8]天蠍座 [9]射手座 [10]摩羯座 [11]水瓶座 [12]雙魚座,請選擇星座(僅能填數字):"

# 限制填寫內容為數字
while True:
    ans_data = input(question_description)
    # ans_data為數字且數值介於1~12
    if ans_data.isdigit() == True and int(ans_data) > 0 and int(ans_data) < 13:
        break
    else:
        pass
    
# 網址內容為唐綺陽每日星座運勢
url = 'https://www.daily-zodiac.com/mobile/zodiac/' + zodiacSigns_convent[ans_data]
response = requests.get(url)

# 設定讀取編碼(預設 UTF-8)
response.encoding = 'UTF-8'

# 檢查 HTTP 回應碼是否為 200
if response.status_code == requests.codes.ok:
    sp = BeautifulSoup(response.text, 'html.parser')
    zodiacSigns_name = sp.select(".middle .name .name")[0].text # 星座名稱
    zodiacSigns_date = sp.select(".middle .name .date")[0].text # 星座日期
    today_date = sp.select(".today li")[1].text # 今日日期
    today_horoscope_weather = sp.select(".today .weather")[0].text #今日心情
    
    # 移除字串開頭的空格 str.lstrip()
    # 移除字串末尾的空格 str.rstrip()
    today_horoscope = sp.select("section article")[0].text.lstrip()
    
#   印出結果
    print('[%s %s 今日運勢]' %(zodiacSigns_name, zodiacSigns_date))
    print('今日日期:%s' %(today_date))
    print('今日心情:%s' %(today_horoscope_weather))
    print('今日評語:\n%s' %(today_horoscope))

查詢結果呈現如下圖所示:
https://ithelp.ithome.com.tw/upload/images/20201006/20091333rPnNDPkhai.png

資料來源

唐綺陽每日星座運勢
w3schools.com Python While Loops

結論

呼~
今天的實作終於告一段落,以上是爬蟲的簡易運用,當然也可以搭配寫入 Database 或 CSV 將資料儲存下來運用


上一篇
[2020鐵人賽Day20]糊裡糊塗Python就上手-蟲蟲進擊之爬蟲取得資訊(中)
下一篇
[2020鐵人賽Day22]糊裡糊塗Python就上手-數據化圖之術(上)
系列文
糊裡糊塗Python就上手30

尚未有邦友留言

立即登入留言