2025 年 7 月 23 日

python爬蟲 X line notify

網路爬蟲是一種程式,模擬一般人瀏覽網路的行為,並藉由程式搜集我們所需要的資訊,或者進行訂票之類的行為。初學python程式及爬蟲的我,想用爬蟲來協助我追蹤PTT MacShop版的文章,當我想購買的商品,出現在文章標題時,以line notify通知我,並提供連結,這目的當然是想搶商品,我並不能無時無刻盯著版面,通常看到我想買的商品時,已經被人買走,如果有爬蟲可以幫忙定時reveiw一下版面的標題,就可以增加我買到的機率了。

以python進行網路爬蟲,需要兩個套件,requests以及beautiful soup

  • requests – 用於送出請求及取得伺器所回傳的資訊資料
  • beautiful soup – 用於解析HTML、XML文件,以方便取出文件的內容

另外會用到lxml這個解析器,beautiful soup內建的是html.parser,所以需要另外內裝這個解析器

line notify是line提供的的API,用於推播訊息,由於是免費,所以有些限制(必須主動訂閱、每分鐘推播數量限制),但是一般自己使用也夠了,重點是免費。因為line notify的教學已經相當多,這邊只提供程式碼,權杖(token)的部份請自行在line notify官方網站申請。

以下是完整程式碼

#import所需套件
import requests
from bs4 import BeautifulSoup


#==========line notify function==================
def linenotify( msg ):
    url = 'https://notify-api.line.me/api/notify'
    token = 'token貼在這 單引號內'
    headers = {
        'Authorization': 'Bearer ' + token                # 設定 LINE Notify 權杖
    }
    data = { 
    'message':("{}".format( msg ))                        # 要推播出去的訊息 , "message:" ( 不可少 )
    }
    #image = open('/path', 'rb')                          # 設定圖片路徑,以二進位方式開啟圖片
    #imageFile = {'imageFile' : image}                    # 設定圖片檔名
    #data = requests.post(url, headers=headers, data=data, files=imageFile)   # 發送 LINE Notify(訊息+圖片)
    data = requests.post(url, headers=headers, data=data)                     # 發送 LINE Notify(只有訊息)
#==========================================
'''
#部份網站會檔爬蟲,有需要可將headers加入
headers = {
        "Content-Type": "application/json;charset=UTF-8",
        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)"
    }
'''
ptt_url = "https://www.ptt.cc/bbs/MacShop/index.html"             # ptt macshop版網址
r = requests.get(' ptt_url ' )                                    # requests發出get請求,將回傳原始資料存入r
sp = BeautifulSoup( r.text,  'lxml' )                             # beautifulsoup解析回傳資料,存入sp

'''
自身先對原始碼review過,得知所的資料的標籤(tag)位置,
再以 .find_all 或 .find 的方法將資料取出
使用者需要對HTML有一定的了解
''''
title = sp.find_all( 'div', class_ = 'title')               # 援尋所有div tag,class是title,
                                                              class是python保留字,所以需要加 _

links = []                                                  # 用於儲侟文章url的list
titles =[]                                                  # 用於儲存文章標題的list
for div in title:                                           # 迴圈判斷標題是否有url,及標題是否有關鍵字
    a = div.find('a', href=True)
    if a is not None:                                       # 有url,再判斷標題是否有關鍵字
       if div.text.find( 'HomePod' ) != -1 or div.text.find( 'Homepod' ) != -1 or div.text.find( 'homepod' ) != -1\
               and div.text.find('mini') != -1:
          if div.text.find('販售') != -1:                    # 再判斷標題是否為販售
            titles.append(div.text.strip())                        # 標題存入串列
            links.append(("{}{}").format( ptt_url,a['href'] ))     # url存入串列

line_msg = zip( titles, links )                                    # 將標題、url組成二維串列

sendmsg = "\n"                                                     # 生成line notify所需要的字串(訊息) sendmsg
for l in line_msg:
    sendmsg = sendmsg + l[0]+"\n"+l[1]+"\n"                        # 訊息組成"標題+換行+url+換行"


if len( sendmsg ) > 1:                                             # 判斷有訊息才推播
    linenotify( sendmsg )

以上程式執行一次,會針對網頁版MacShop版第一頁爬文一次,將符合要求的標題包含網址取出,再以line notify發出,但是如果得自己執行,不如自行開啟網頁看一遍,所以必須要讓這支程式定時執行。

因為自身有架server,24小時不關機,所以就將程式寫程式改成python script,利用linux的crontab進行排程,每30分鐘執行一次,Line就會像下圖收到通知,如果首頁裡沒有符合條件的標題,就不會收到訊息,

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *