寫代碼的最常做的事情就是debug和test,那麼如何在Scrapy中檢查爬蟲能否正常運作,保證在大規模作業時不會遇到奇奇怪怪的問題呢?這裡主要根據執行個體說些debug的方法。
Debug三部曲
Parse
parse
指令主要用于從method級别去檢查爬蟲不同部分的行為。它有以下幾個可選項:
- --spider=SPIDER,指定爬蟲
- --a NAME=VALUE,設定爬蟲變量
- --callback/-c 指定爬取響應的爬蟲方法
- --pipelines: 通過pipelines處理爬取的item
- --rules,使用CrawlSpider的時候用于定義規則
- --noitems,不要顯示爬取後的items
- --nolinks,,不要顯示提取的連結(links)
- --nocolor, 不要顔色
- --depth/-d,對于每個連結的爬取深度,類似于盜夢空間的夢中夢,預設是1,就是爬取這個連結中網頁後就停止
-
--verbose/-v,相當于顯示每一層的夢境内容
舉個栗子,下面是我用來爬取豆瓣哲學分類下所有圖書資訊的代碼,
# -*- coding: utf-8 -*-
from scrapy.spiders import CrawlSpider, Rule
from scrapy.http import Request
from ..items import DoubanItem
from scrapy.linkextractors import LinkExtractor
class DoubanSpider(CrawlSpider):
name = "douban"
allowed_domains = ["douban.com"]
start_urls = (
'https://book.douban.com/tag/哲學',
)
rules = (
Rule(LinkExtractor(allow='/tag/哲學',restrict_xpaths=('//*[@id="subject_list"]/div[2]/span/a')),
callback='link_parse',follow=True),
)
def link_parse(self, response):
links = response.css('div.info > h2 > a::attr(href)').extract()
for link in links:
yield Request(link,callback=self.parse_content)
def parse_content(self, response):
item = DoubanItem()
item['title'] = response.xpath('//*[@id="wrapper"]/h1/span/text()').extract()
item['author'] = response.css('div#info > span >a::text').extract_first()
# item['pub_date'] = response.xpath('//*[@id="info"]/text()[4]').extract()
# item['price'] =response.xpath('//*[@id="info"]/text()[6]').extract()
item['desc'] = response.xpath('//*[@id="link-report"]/div[1]/div/p').extract_first() or \
response.xpath('//*[@id="link-report"]/span[1]/div/p').extract_first()
item['score'] = response.xpath('//*[@id="interest_sectl"]/div/div[2]/strong/text()').extract_first()
return item
我想測試一下方法
parse_content
擷取
link_parse
爬取到每本書的連結後能不能到繼續爬取連結裡面的圖書資訊,在指令中輸入
scrapy parse --spider=douban -c parse_content -v https://book.douban.com/subject/1291204/
指令說明:指定使用爬蟲douban的parse_content方法去爬取連結,并且顯示每一層的内容,結果如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuYDNyAjN3IWN5IWN3czNwMjZjZ2NzcjYjVzM3gDN5UDOfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
是以他可以驗證你定義爬蟲的方法能否正常使用哦。
Scrapy Shell
parse
隻能顯示爬取的結果,但是爬蟲爬取的細節就是一個黑箱子,你無法看見。這裡我們就可以使用前面常用shell,不過功能更具體一點。
你可以使用
scrapy shell --spider=douban https://book.douban.com/tag/哲學
,然後在之後的指令行中使用xpath和css選擇器提取item,使用
view(reponse)
就能以你定義的爬蟲的視角看網頁。
Logging
這個很像我們剛開始最愛用的
print
,在快要出錯的地方放在一行
print
看看案發現場。這裡我們快要使用它自帶的記錄函數logging,也是在容易出錯的地方加一行這個,如下圖
logging
test之Spiders Contracts
我在爬取某圖檔網站的時候,打算先爬取個50個頁面測試一個爬蟲的穩定性,你可以選擇瞪着顯示器,一個一個數,看結果不斷的閃過然後覺得差不多了退出。随意推薦使用Scrapy中的一個用來進行單元測試的特性--Contract,顧名思義這是一個合同工,合同到期就停止工作。直接上代碼說他的使用方法:
contract
隻要在你需要測試的單元用
""" code """
,在code中添加紅框裡的内容,'#'這個字段及其後面内容不需要添加,我這裡用于說明功能而已。使用
scrapy check <spider>
既可以進行單元測試,如果你需要測試更多内容,請翻閱
這裡運作結果如下,看來我要去處理一下錯誤了。
check結果
以上就是scrapy常用的debug和test技巧,能夠幫助你驗證爬蟲寫的一個功能能否正常運作,出錯的時候去檢查網頁,記錄錯誤資訊。當然no news is good news,還是祝大家能夠順利的寫好代碼。
你也可以在我的
個人部落格上看到這篇文章,雖然沒有什麼差别。