天天看點

Scrapy基礎——Debug和testDebug三部曲test之Spiders Contracts

寫代碼的最常做的事情就是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方法去爬取連結,并且顯示每一層的内容,結果如下:

Scrapy基礎——Debug和testDebug三部曲test之Spiders Contracts

是以他可以驗證你定義爬蟲的方法能否正常使用哦。

Scrapy Shell

parse

隻能顯示爬取的結果,但是爬蟲爬取的細節就是一個黑箱子,你無法看見。這裡我們就可以使用前面常用shell,不過功能更具體一點。

你可以使用

scrapy shell --spider=douban https://book.douban.com/tag/哲學

,然後在之後的指令行中使用xpath和css選擇器提取item,使用

view(reponse)

就能以你定義的爬蟲的視角看網頁。

Logging

這個很像我們剛開始最愛用的

print

,在快要出錯的地方放在一行

print

看看案發現場。這裡我們快要使用它自帶的記錄函數logging,也是在容易出錯的地方加一行這個,如下圖

Scrapy基礎——Debug和testDebug三部曲test之Spiders Contracts

logging

test之Spiders Contracts

我在爬取某圖檔網站的時候,打算先爬取個50個頁面測試一個爬蟲的穩定性,你可以選擇瞪着顯示器,一個一個數,看結果不斷的閃過然後覺得差不多了退出。随意推薦使用Scrapy中的一個用來進行單元測試的特性--Contract,顧名思義這是一個合同工,合同到期就停止工作。直接上代碼說他的使用方法:

Scrapy基礎——Debug和testDebug三部曲test之Spiders Contracts

contract

隻要在你需要測試的單元用

""" code """

,在code中添加紅框裡的内容,'#'這個字段及其後面内容不需要添加,我這裡用于說明功能而已。使用

scrapy check <spider>

既可以進行單元測試,如果你需要測試更多内容,請翻閱

這裡

運作結果如下,看來我要去處理一下錯誤了。

Scrapy基礎——Debug和testDebug三部曲test之Spiders Contracts

check結果

以上就是scrapy常用的debug和test技巧,能夠幫助你驗證爬蟲寫的一個功能能否正常運作,出錯的時候去檢查網頁,記錄錯誤資訊。當然no news is good news,還是祝大家能夠順利的寫好代碼。

你也可以在我的

個人部落格

上看到這篇文章,雖然沒有什麼差别。