此为历史版本和 IPFS 入口查阅区,回到作品页
Python 的輕鬆閲讀
IPFS 指纹 这是什么

作品指纹

Python + Line Bot SDK — 爬蟲以及推送訊息

Python 的輕鬆閲讀
·
·

說明

這裏用 BeautifulSoup 來爬一個網站

將取得的金額,儲存起來,當作下一次比對的條件

只要遇到金額有所不同,就用 LINE 發出訊息出來

準備東西

要準備的東西:

  • BeautifulSoup4requestsline-bot-sdkpymysql

還有 heroku 服務就可以了

安裝套件

pip install BeautifulSoup4
pip install pymysql
pip install line-bot-sdk

開發開始

import requests
import pymysql.cursors
import logging
from bs4 import BeautifulSoup

from linebot import LineBotApi
from linebot.models import TextSendMessage

因為這只有傳送文字,所以只用到 linebot 裏面的 TextSendMessage

直接將 LineBotApi 加上 Acesss Token 就可以讓它為你工作

line_bot_api = LineBotApi([LINE 的開發 Access Token])

資料庫

這裏直接用 pymysql 連接資料庫 給他一個 connectDB 連結,後面會用到

def connectDb(dbName):
    try:
        mysqldb = pymysql.connect(
                host="HOST",
                user="USER",
                passwd="PASSWORD",
                database=dbName,
                charset='utf8mb4'
        )
        return mysqldb
    except Exception as e:
        logging.error('Fail to connection mysql {}'.format(str(e)))
    return None

開始爬蟲,針對網站的分析

第一階段,屬於左邊的項目,主要有 div,class 對於 column-yellow,總共有 8 個 div

然後有屬於 font 的 class 是 biger 才是真正的價錢


所以寫出以下的 code

user_id = "[LINE User ID]"

def cralwer():
    response = requests.get("https://www.gck99.com.tw")
    soup = BeautifulSoup(response.text, "html.parser")
    rows = soup.findAll('div', {'class': 'column-yellow'})
    
    db_index = 0
    price_gold_text = ['黃金條塊', '飾金回收不扣耗損回收價', '白金回收即時價格', '999白銀加價回收', '22k', '18k', '14k', '10k']
    # 依序:黃金條塊、飾金回收不扣耗損回收價、白金回收即時價格、999白銀加價回收
    for row in rows:
        if row.find('font', {'class': 'biger'}) is not None:
            db_index += 1
            update = 0
            price = row.find('font', {'class': 'biger'}).text
            # print(db_index, price)

            # 資料庫的 price
            conn = connectDb('資料庫')
            cursor = conn.cursor()
            sql = f"SELECT * FROM `prices` where id = {db_index}"
            cursor.execute(sql)
            result = cursor.fetchone()
            print(result[1], price)
            if int(result[1]) != int(price):
                update = 1
                msg = "\n" +price_gold_text[db_index-1] + ':' + str(result[1]) + ' => ' + str(price)
                lineNotifyMessage(user_id, msg)
            conn.close()

            if update == 1:
                conn = connectDb('資料庫')
                cursor = conn.cursor()
                sql = f"UPDATE `prices` SET `price` = {price} where id = {db_index}"
                print(sql)
                cursor.execute(sql)
                conn.commit()
                conn.close()

第二階段,屬於左邊的項目,主要有 div,class 對於 column-blue,總共有 8 個 div

然後有屬於 font 的 class 是 biger 才是真正的價錢


    rows = soup.findAll('div', {'class': 'column-blue'})

    # 依序:22k、18k、14k、10k
    for row in rows:
        if row.find('font', {'class': 'biger'}) is not None:
            db_index += 1
            update = 0
            # print(db_index, row.find('font', {'class': 'biger'}).text)
            price = row.find('font', {'class': 'biger'}).text
            # 資料庫的 price
            conn = connectDb('資料庫')
            cursor = conn.cursor()
            sql = f"SELECT * FROM `prices` where id = {db_index}"
            cursor.execute(sql)
            result = cursor.fetchone()
            print(result[1], price)
            if int(result[1]) != int(price):
                update = 1
                msg = "\n" + price_gold_text[db_index-1] + ':' + str(result[1]) + ' => ' + str(price)
                print(msg)
                lineNotifyMessage(user_id, msg)
            conn.close()

        if update == 1:
            conn = connectDb('資料庫')
            cursor = conn.cursor()
            sql = f"UPDATE `prices` SET `price` = {price} where id = {db_index}"
            cursor.execute(sql)
            conn.commit()
            conn.close()

上面針對網頁,爬取金額,而且會給資料庫比對 如果資料庫的金額跟網頁爬取的價錢不符,就發送訊息給 LINE Bot 就結束

LINE Bot 發送訊息

這裏發送訊息的功能

def lineNotifyMessage(user_id, msg):
    line_bot_api.push_message(user_id, TextSendMessage(text=msg))

已經完成了 LINE Bot 給完成了

加入 keroku 的 scheduler

進入 Resources 加入 Heroku Scheduler 改成每 10 分鐘跑一次

python manage.py


CC BY-NC-ND 2.0 授权