iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0
Software Development

跟著 OXXO 一起學 Python系列 第 60

( Day 29.1 ) Python 爬取統一發票號碼,自動對獎

  • 分享至 

  • xImage
  •  

這篇文章會使用 Python 的 Requests 和 Beautiful Soup 函式庫,實作一個爬取當期統一發票號碼,並進行自動對獎網路爬蟲。

原文參考:爬取統一發票號碼,自動對獎

本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )

使用 Requests 抓取網頁內容

使用 Requests 函式庫的 get 的方法,抓取財政部稅務入口網裡統一發票網頁的內容,因為該網頁編碼為 utf-8,所以要加上 web.encoding='utf-8' 避免中文字出現亂碼。

參考:Requests 函式庫財政部稅務入口網

import requests
url = 'https://invoice.etax.nat.gov.tw/index.html'
web = requests.get(url)    # 取得網頁內容
web.encoding='utf-8'       # 因為該網頁編碼為 utf-8,加上 .encoding 避免亂碼
print(web.text)

執行程式後,就可以看到抓取到的網頁內容。

Python 教學 - 爬取統一發票號碼,自動對獎 - 使用 Requests 抓取網頁內容

使用 Beautiful Soup 取出中獎號碼

使用 Beautiful Soup 函式庫的 select 的方法,從抓到的網頁內容裡,找到 class 為「container-fluid」的 div,將其內容輸出後就是中獎號碼,但需要注意的是,如果直接將內容輸出放入串列,會自動加上換行符號 ( 因為原始資料裡有換行 ),此時可以透過串列 slice() 方法的操作,取出最後八碼即可。

參考:Beautiful Soup 函式庫讀取串列項目 slice()

import requests
url = 'https://invoice.etax.nat.gov.tw/index.html'
web = requests.get(url)    # 取得網頁內容
web.encoding='utf-8'       # 因為該網頁編碼為 utf-8,加上 .encoding 避免亂碼

from bs4 import BeautifulSoup
soup = BeautifulSoup(web.text, "html.parser")                    # 轉換成標籤樹
td = soup.select('.container-fluid')[0].select('.etw-tbiggest')  # 取出中獎號碼的位置
ns = td[0].getText()  # 特別獎
n1 = td[1].getText()  # 特獎
# 頭獎,因為存入串列會出現 /n 換行符,使用 [-8:] 取出最後八碼
n2 = [td[2].getText()[-8:], td[3].getText()[-8:], td[4].getText()[-8:]]
print(ns)
print(n1)
print(n2)

Python 教學 - 爬取統一發票號碼,自動對獎 - 使用 Beautiful Soup 取出中獎號碼

輸入號碼後自動對獎

參考「統一發票對獎」文章範例,使用 while 迴圈和 for 迴圈,就能做到不斷輸入號碼並自動對獎的功能。

參考:while 迴圈for 迴圈

import requests
url = 'https://invoice.etax.nat.gov.tw/index.html'
web = requests.get(url)    # 取得網頁內容
web.encoding='utf-8'       # 因為該網頁編碼為 utf-8,加上 .encoding 避免亂碼

from bs4 import BeautifulSoup
soup = BeautifulSoup(web.text, "html.parser")                    # 轉換成標籤樹
td = soup.select('.container-fluid')[0].select('.etw-tbiggest')  # 取出中獎號碼的位置
ns = td[0].getText()  # 特別獎
n1 = td[1].getText()  # 特獎
# 頭獎,因為存入串列會出現 /n 換行符,使用 [-8:] 取出最後八碼
n2 = [td[2].getText()[-8:], td[3].getText()[-8:], td[4].getText()[-8:]] 

while True:
    try:
        # 對獎程式
        num = input('輸入你的發票號碼:')
        if num == ns: print('對中 1000 萬元!')
        if num == n1: print('對中 200 萬元!')
        for i in n2:
            if num == i:
                print('對中 20 萬元!')
                break
            if num[-7:] == i[-7:]:
                print('對中 4 萬元!')
                break
            if num[-6:] == i[-6:]:
                print('對中 1 萬元!')
                break
            if num[-5:] == i[-5:]:
                print('對中 4000 元!')
                break
            if num[-4:] == i[-4:]:
                print('對中 1000 元!')
                break
            if num[-3:] == i[-3:]:
                print('對中 200 元!')
                break
    except: break

Python 教學 - 爬取統一發票號碼,自動對獎

更多教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 28.2 ) Python 同時下載多張寶可夢圖片
下一篇
( Day 29.2 ) Python 爬取臺灣銀行牌告匯率
系列文
跟著 OXXO 一起學 Python101
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言