爬蟲原始碼 for 《Rakuten kobo 每週 99 元特價書單》

做什麼

從上週起,因為自己有需求,我把每週 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 行事曆 的功能。不過準備出門了,下次有空再說。

謝謝 sky 兄,我也大部分都看電子書,省空間,也不用處理二手的舊書,隨時都可看,既環保又省時。
不過要提醒 sky 兄,電子書要稍微做個備份,像我有依照書本分類創建資料夾習慣,方便在各種夾縫時間,以及依照當下心情,閱讀當下想看分類的書,但曾經有一次記憶卡壞掉,導致所有購買的書得重新下載,然後再重新分類,花了蠻多時間又重新整理一遍,後來就記得先備份,因此之後又遇到電子書閱讀器,忽然無法充電開不起來,換購新閱讀器,就不用再重新整理,直接從備份過去就好了。這是我之前的慘痛經驗,提供參考。