在實務上開發Scrapy網頁爬蟲時,難免過程中會發生錯誤或產生問題,這時候該如何有效的偵錯找到原因,進而提升開發效率及品質,就是一個非常重要的議題。
而Scrapy網頁爬蟲框架提供了許多非常實用的方法,來幫助開發人員有效的偵錯,本文就來和大家分享3個筆者最常使用的偵錯方法,包含:
- Scrapy Shell(互動介面)
- Scrapy Logging(日誌)
- Scrapy Parse Commands(指令)
一、Scrapy Shell(互動介面)
Scrapy Shell是一個互動式的終端(Terminal)介面,讓開發人員可以不需要等到整個Scrapy專案完成就能夠進行測試,主要是用來測試Scrapy框架使用css()或xpath()方法(Method)爬取資料的結果。
舉例來說,用Visual Studio Code開啟Scrapy專案,在終端介面(Terminal)的地方,利用以下的指令開啟Scrapy Shell:
$ scrapy shell https://www.inside.com.tw/tag/AI
截取部分執行結果如下圖:
>>>view(response) True
這時候,Scrapy Shell就會自動開啟瀏覽器,讓開發人員確認回應的網頁是否正確。
除此之外,假設要爬取其中的新聞標題,就可以在Scrapy Shell的互動式介面中,透過指令的方式,使用css()或xpath()方法(Method)來測試是否能夠爬取成功,如下範例:
>>> response.css("h3.post_title a.js-auto_break_title::text").get() 'Appier 將於東京交易所掛牌,市值估突破 10 億美元' >>> >>> >>> response.xpath("//h3[@class='post_title']/a[@class='js-auto_break_title']/text()").get() 'Appier 將於東京交易所掛牌,市值估突破 10 億美元'
有了Scrapy Shell互動式介面,甚至在開發前,就能夠方便測試爬取語法的結果是否為想要的,進而減少在開發過程中發生錯誤的機率。而Scrapy框架詳細的css()及xpath()方法(Method)教學可以參考以下兩篇文章:
二、Scrapy Logging(日誌)
Scrapy網頁爬蟲另一個最常用來偵錯的方法就是Logging(日誌),尤其有在定期排程執行Scrapy網頁爬蟲的情況下特別實用,透過Scrapy Logging(日誌)就能夠很容易追蹤網頁爬蟲的執行事件及歷程。
依據重要的程度分為五種日誌類型,由高到低為:
- critical
- error
- warning
- info
- debug
由於Scrapy框架的網頁爬蟲類別(spiders)本身就已經有logger物件,所以無需引用就可以在網頁爬蟲中使用,如下範例第18行:
import scrapy class HotNewsSpider(scrapy.Spider): name = 'hot_news' allowed_domains = ['www.inside.com.tw'] start_urls = ['https://www.inside.com.tw/'] def parse(self, response): # 熱門文章標題 hot_news_title = response.xpath( "//h1[@class='title']/text()").get() if hot_news_title: return hot_news_title else: self.logger.error("沒有爬取到熱門文章標題")
接下來,開啟Scrapy專案的settings.py檔案,加入「LOG_FILE(日誌檔名)」及「LOG_LEVEL(日誌層級)」設定,如下範例:
LOG_FILE = "inside_log.txt" LOG_LEVEL = "ERROR" #特別注意這邊一定要大寫
其中「LOG_LEVEL(日誌層級)」可以自訂在哪一個日誌類型以上需要被記錄到日誌檔中,預設為DEBUG,而以範例來說則是發生ERROR類型以上的事件才會被寫入到日誌檔中,也就是只有ERROR及CRITICAL日誌類型。
而除了Scrapy網頁爬蟲(spiders)以外,如果想要使用Logging(日誌),就需要引用logging模組(Module),以ITEM PIPELINE資料模型管道(pipelines.py)為例,如下第3、18行:
from itemadapter import ItemAdapter from scrapy.exporters import CsvItemExporter import logging class CsvPipeline: def __init__(self): self.file = open('posts.csv', 'wb') self.exporter = CsvItemExporter(self.file, encoding='big5') self.exporter.start_exporting() def process_item(self, item, spider): if item: self.exporter.export_item(item) return item else: logging.error("無資料匯出!") def close_spider(self, spider): self.exporter.finish_exporting() self.file.close()
三、Scrapy Parse Command(指令)
在整個Scrapy網頁爬蟲專案中,可想而知會包含許多的方法(Method),這時候如果想要針對不同方法(Method)來進行偵錯的話,就可以使用Scrapy框架的parse指令查看方法(Method)的執行結果。
而parse指令提供了許多的參數供開發人員使用,其中比較常用的參數如下:
- --spider=spider_name(指定要偵錯的網頁爬蟲名稱)
- -c(解析response的方法名稱)
- -d(偵錯的方法層數)
- -v(顯示每一層方法的執行結果或狀態)
以上一篇[Scrapy教學10]不可不知的Scrapy框架爬取下一層網頁資料實作文章的Scrapy網頁爬蟲(hot_news.py)為例,目前的實作內容為:
import scrapy class HotNewsSpider(scrapy.Spider): name = 'hot_news' allowed_domains = ['www.inside.com.tw'] start_urls = ['https://www.inside.com.tw/'] def parse(self, response): post_urls = response.xpath( "//a[@class='hero_menu_link']/@href").getall() for post_url in post_urls: yield scrapy.Request(post_url, self.parse_content) def parse_content(self, response): # 熱門文章標題 hot_news_title = response.xpath( "//h1[@class='post_header_title js-auto_break_title']/text()").get() # 熱門文章摘要 hot_news_intro = response.xpath( "//div[@class='post_introduction']/text()").get() HotNewsItem = { "hot_news_title": hot_news_title, "hot_news_intro": hot_news_intro } return HotNewsItem
如果想要利用Scrapy框架的parse指令來針對parse()方法(Method)來進行偵錯的話,可以利用以下的指令:
$ scrapy parse --spider=hot_news -c parse https://www.inside.com.tw/
執行結果
其中scrapy parse為關鍵字,接著,--spider之後加上所要偵錯的網頁爬蟲名稱,-c之後加上解析回應(response)的方法(Method)名稱,最後加上該網頁爬蟲爬取的網址(starts_url),就能看到parse()方法(Method)的執行結果。
從parse()方法(Method)中可以看到,它還有呼叫了另一個parse_content()方法(Method),如果也想要更進一步知道這個方法的執行結果,就可以利用scrapy parse指令的-d參數,來設定偵錯的層數,並且再使用-v參數,顯示每一層方法(Method)的執行結果,如下指令:
$ scrapy parse --spider=hot_news -c parse -d 2 -v https://www.inside.com.tw/
執行結果
上圖即為parse()和parse_content()兩層方法(Method)的執行結果。
四、小結
本文分享了3個在開發Scrapy網頁爬蟲時,非常好用的偵錯方法,這邊來幫大家總結一下這3個方法的使用時機:
- Scrapy Shell:針對想要爬取的網頁資料進行測試。
- Scrapy Logging:在開發過程中用來顯示想要的訊息,以及追蹤定期執行的Scrapy網頁爬蟲事件。
- Scrapy Parse Command:Scrapy網頁爬蟲方法(Method)的偵錯。
希望本文所分享的3個偵錯方法,能夠幫助大家在開發的過程中更加順利,進而提升開發效率,大家如果有其它的偵錯技巧或有使用過以上的哪一個偵錯方法,都歡迎在底下留言和我分享唷。
如果您喜歡我的文章,請幫我按五下Like(使用Google或Facebook帳號免費註冊),支持我創作教學文章,回饋由LikeCoin基金會出資,完全不會花到錢,感謝大家。
- [Scrapy教學1]快速入門Scrapy框架的5個執行模組及架構
- [Scrapy教學2]實用的Scrapy框架安裝指南,開始你的第一個專案
- [Scrapy教學3]如何有效利用Scrapy框架建立網頁爬蟲看這篇就懂
- [Scrapy教學4]掌握Scrapy框架重要的CSS定位元素方法
- [Scrapy教學5]掌握Scrapy框架重要的XPath定位元素方法
- [Scrapy教學6]解析如何在Scrapy框架存入資料到MySQL教學
- [Scrapy教學7]教你Scrapy框架匯出CSV檔案方法提升資料處理效率
- [Scrapy教學8]詳解Scrapy框架爬取分頁資料的實用技巧
- [Scrapy教學9]一定要懂的Scrapy框架結合Gmail寄送爬取資料附件秘訣
- [Scrapy教學10]不可不知的Scrapy框架爬取下一層網頁資料實作




留言
張貼留言