展覽查詢機器人
作者:
楊平、舒婷
程式碼
資料來源: Citytalk城市通
輸入: 最新展覽
回復: 以輪播的方式顯示最新展覽的結果
技術難題
1. 展覽資料為AJAX Request,頁面載入後才載入展覽資料
2. 需用POST送出Request,直接GET會拿不到東西
3. 此網站有做CSRF防護: 每個Session對應到一組CSRF Token,需在header中提供Session ID,以及CSRF Token,讓伺服器驗證
解決方法
使用requests送出POST Request
1. 先取得Session ID,以及CSRF Token
2. 然後再用這組資料取得展覽資訊
爬蟲程式碼
import requests
from bs4 import BeautifulSoup
def get_datas():
client = requests.session()
r = client.get("https://www.citytalk.tw/cata")
phpsessid = client.cookies['PHPSESSID']
soup = BeautifulSoup(r.text, 'lxml')
csrf_token = soup.find('meta', attrs={'name':'csrf-token'})['content']
header = {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": "PHPSESSID=" + phpsessid,
"Host": "www.citytalk.tw",
"Origin": "https://www.citytalk.tw",
"Referer": "https://www.citytalk.tw/cata/",
"X-CSRF-Token": csrf_token
}
data = {
// data們
}
ex_data = requests.post("http://www.citytalk.tw/post/v3/cata/index", headers=header, data=data)
datas = ex_data.json()['data']
content = []
for i, data in enumerate(datas):
id = data['e_id']
title = data['title']
img = data['img']
text = '日期:' + data['e_start'] + '-' + data['e_end']
content.append({'title':title,
'url': 'https://www.citytalk.tw/event/' + id + '-'+ title.replace(' ', ''),
'img':'https://www.citytalk.tw' + img,
'text': text
})
return content
爬蟲程式碼
requests.session()
開啟一個session,讓session id可被保存下來
CSRF Token: 在html的meta裡面
輪播介面
for i, d in enumerate(datas):
column = CarouselColumn( # column裡面的內容
thumbnail_image_url = d['img'],
title = d['title'],
text = d['text'],
actions = [
URITemplateAction( #鏈接
label = '展覽介紹連結',
uri = d['url']
)
]
)
columns.append(column)
carousel_template_message = TemplateSendMessage(
alt_text = "展覽輪播",
template = CarouselTemplate(
columns = columns
)
)
感謝聆聽
展覽查詢機器人
By Sam Yang
展覽查詢機器人
- 423