網路爬蟲是一種程式,模擬一般人瀏覽網路的行為,並藉由程式搜集我們所需要的資訊,或者進行訂票之類的行為。初學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就會像下圖收到通知,如果首頁裡沒有符合條件的標題,就不會收到訊息,
