做什麼
從上週起,因為自己有需求,我把每週 Kobo 電子書 99 元特價資訊,整理到論壇中。
原本每週做一次,懶得寫爬蟲,不過下午剛好有點空檔,就決定寫隻程式,直接從網站抓資料寫成 Markdown 格式的表格,以後只要 複製/貼上 即可。
目前網址是寫在程式中,要改成下指令時給網址也可以,但主程式不變,就給大家參考了。
延伸閱讀: Rakuten kobo 每週 99 元特價書單(2023)
爬蟲原始碼
import scrapy
from urllib.parse import urlparse, urlunparse
class Ebook01Spider(scrapy.Spider):
name = 'ebook01'
allowed_domains = ['www.kobo.com']
start_urls = ['https://www.kobo.com/zh/blog/weekly-dd99-2023-w53']
def parse(self, response):
# Part I: 書名
title_list = response.xpath('//span[@class="title"]/text()').extract()
# 去除《》這兩個符號
title_list = [s.replace('《', '') for s in title_list]
title_list = [s.replace('》', '') for s in title_list]
# Part II: 作者
author_list = response.xpath('//span[@class="author"]/text()').extract()
# 將 '由 ' 改為 ''
author_list = [s.replace('由 ', '') for s in author_list]
# 將 `, ` 改為 `<br>`
author_list = [s.replace(', ', '<br>') for s in author_list]
# Part III: 出版社
# 3-1
# ['出版社:寶鼎出版', '出版社:時報出版', '出版社:', '出版社:', '出版社:', '出版社:', '出版社:']
publisher_list1 = response.xpath('//p[contains(text(), "出版社:")]/text()').extract()
# 3-2
# ['獨步文化', '八旗文化', '臉譜', '麥田', '樂金文化']
publisher_list2 = response.xpath('//p[contains(text(), "出版社:")]/a/text()').extract()
# 將 list1 中的 '出版社:',以 list2 取代
# 一、將 list1 中的 '出版社:' 字串改為 ''
publisher_list1 = [s.replace('出版社:', '') for s in publisher_list1]
# 二、處理完 list1 後,依序以 list2 的元素取代空字串
try:
for i, value in enumerate(publisher_list1):
if value == '':
publisher_list1[i] = publisher_list2.pop(0)
except IndexError:
print("list2 的元素不足以覆蓋所有的空字串")
# Part IV: 折扣碼
# ['折扣碼:kobo99Dec28', ...
coupon_list = response.xpath('//p[contains(text(), "折扣碼:")]/text()').extract()
# 將 list 中的 '折扣碼:' 以 '' 取代
coupon_list = [s.replace('折扣碼:', '') for s in coupon_list]
# Part V: 訂購書籍的 url
url_list = response.xpath('//a[@class="book-block__link"]/@href').extract()
# 將 url 中的 '?' 後的字串移除
cleaned_urls = []
for url in url_list:
parsed_url = urlparse(url)
cleaned_url = urlunparse((parsed_url.scheme, parsed_url.netloc, parsed_url.path, '', '', ''))
cleaned_urls.append(cleaned_url)
# Part VI: 加入 google calendar
# Part VII: 寫成 Markdown 文件
# 建立 Markdown 表格
markdown_table = "| 書名(含購買連結) | 作者 | 出版社 | 折扣碼 |\n| --- | --- | --- | --- |\n"
# 合併列表資訊
combined_data = zip(title_list, cleaned_urls, author_list, publisher_list1, coupon_list)
# 將資訊加入 Markdown 表格
for data in combined_data:
title, url, author, publisher, coupon = data
markdown_table += f"| **[{title}]({url})** | {author} | {publisher} | {coupon} |\n"
# 將 Markdown 表格寫入 txt 檔案
with open('kobo99.txt', 'w', encoding='utf-8') as file:
file.write(markdown_table)
成品
書名(含購買連結) | 作者 | 出版社 | 折扣碼 |
---|---|---|---|
移動革命 | 約翰.羅桑(John Rossant) 史蒂芬.貝克(Stephen Baker) |
寶鼎出版 | kobo99Dec28 |
OTPR敏捷工作法:拿回績效主導權,讓工作做得更快、更好、更有價值 | 游舒帆 | 時報出版 | kobo99Dec29 |
人蟻之家 | 望月諒子(Mochizuki Ryoko) | 獨步文化 | kobo99Dec30 |
數字公民:如何打造你的識數世界觀,輕鬆成為現代公民! | 安德魯.C.A.艾略特 | 八旗文化 | kobo99Dec31 |
你會問問題嗎?問對問題比回答問題更重要!從正確發問、找出答案到形成策略,百位成功企業家教你如何精準提問,帶出學習型高成長團隊(十五週年暢銷經典˙最新增訂版) | 麥克‧馬奎德(Michael J. Marquardt) | 臉譜 | kobo99Jan01 |
大腦修復術:一本書教你如何應對憂鬱、焦慮、強迫症、拖延、社交恐懼、注意力不集中等精神困擾,幫助你平衡生活壓力、提升工作表現 | 姚乃琳 | 麥田 | kobo99Jan02 |
最強工作習慣 | 吉田幸弘 | 樂金文化 | kobo99Jan03 |
TODO
我還想寫個 加入 google 行事曆 的功能。不過準備出門了,下次有空再說。