# 調試spiders
> 譯者:[OSGeo 中國](https://www.osgeo.cn/)
本文檔介紹調試spider的最常用技術。考慮下面的殘廢 Spider :
```py
import scrapy
from myproject.items import MyItem
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = (
'http://example.com/page1',
'http://example.com/page2',
)
def parse(self, response):
# <processing code not shown>
# collect `item_urls`
for item_url in item_urls:
yield scrapy.Request(item_url, self.parse_item)
def parse_item(self, response):
# <processing code not shown>
item = MyItem()
# populate `item` fields
# and extract item_details_url
yield scrapy.Request(item_details_url, self.parse_details, meta={'item': item})
def parse_details(self, response):
item = response.meta['item']
# populate more `item` fields
return item
```
基本上,這是一個簡單的spider,它解析兩頁項目(start-url)。項目還有一個包含附加信息的詳細信息頁,因此我們使用 `meta` 的功能 [`Request`](request-response.html#scrapy.http.Request "scrapy.http.Request") 傳遞部分填充的項。
## 解析命令
檢查 Spider 輸出的最基本方法是使用 [`parse`](commands.html#std:command-parse) 命令。它允許在方法級別檢查spider的不同部分的行為。它的優點是靈活和易于使用,但不允許在方法內部調試代碼。
為了查看從特定URL中獲取的項目:
```py
$ scrapy parse --spider=myspider -c parse_item -d 2 <item_url>
[ ... scrapy log lines crawling example.com spider ... ]
>>> STATUS DEPTH LEVEL 2 <<<
# Scraped Items ------------------------------------------------------------
[{'url': <item_url>}]
# Requests -----------------------------------------------------------------
[]
```
使用 `--verbose` 或 `-v` 選項我們可以看到每個深度級別的狀態:
```py
$ scrapy parse --spider=myspider -c parse_item -d 2 -v <item_url>
[ ... scrapy log lines crawling example.com spider ... ]
>>> DEPTH LEVEL: 1 <<<
# Scraped Items ------------------------------------------------------------
[]
# Requests -----------------------------------------------------------------
[<GET item_details_url>]
>>> DEPTH LEVEL: 2 <<<
# Scraped Items ------------------------------------------------------------
[{'url': <item_url>}]
# Requests -----------------------------------------------------------------
[]
```
檢查從一個開始的項目,也可以很容易地實現使用::
```py
$ scrapy parse --spider=myspider -d 3 'http://example.com/page1'
```
## Scrapy Shell
而 [`parse`](commands.html#std:command-parse) 命令對于檢查 Spider 的行為非常有用,除了顯示接收到的響應和輸出之外,檢查回調中發生的情況幾乎沒有幫助。如何調試情況 `parse_details` 有時沒有收到物品?
幸運的是, [`shell`](commands.html#std:command-shell) 在這種情況下,你的面包和黃油(見 [從spiders調用shell來檢查響應](shell.html#topics-shell-inspect-response) ):
```py
from scrapy.shell import inspect_response
def parse_details(self, response):
item = response.meta.get('item', None)
if item:
# populate more `item` fields
return item
else:
inspect_response(response, self)
```
參見: [從spiders調用shell來檢查響應](shell.html#topics-shell-inspect-response) .
## 在瀏覽器中打開
有時,您只想查看某個響應在瀏覽器中的外觀,可以使用 `open_in_browser` 功能。以下是您將如何使用它的示例:
```py
from scrapy.utils.response import open_in_browser
def parse_details(self, response):
if "item name" not in response.body:
open_in_browser(response)
```
`open_in_browser` 將打開一個瀏覽器,此時Scrapy接收到響應,調整 [base tag](https://www.w3schools.com/tags/tag_base.asp) 以便正確顯示圖像和樣式。
## Logging
日志記錄是獲取 Spider 運行信息的另一個有用選項。盡管不太方便,但它的優點是,如果需要,日志在將來的所有運行中都將可用:
```py
def parse_details(self, response):
item = response.meta.get('item', None)
if item:
# populate more `item` fields
return item
else:
self.logger.warning('No item received for %s', response.url)
```
有關詳細信息,請檢查 [Logging](logging.html#topics-logging) 部分。
- 簡介
- 第一步
- Scrapy at a glance
- 安裝指南
- Scrapy 教程
- 實例
- 基本概念
- 命令行工具
- Spider
- 選擇器
- 項目
- 項目加載器
- Scrapy shell
- 項目管道
- Feed 導出
- 請求和響應
- 鏈接提取器
- 設置
- 例外情況
- 內置服務
- Logging
- 統計數據集合
- 發送電子郵件
- 遠程登錄控制臺
- Web服務
- 解決具體問題
- 常見問題
- 調試spiders
- Spider 合約
- 常用做法
- 通用爬蟲
- 使用瀏覽器的開發人員工具進行抓取
- 調試內存泄漏
- 下載和處理文件和圖像
- 部署 Spider
- AutoThrottle 擴展
- Benchmarking
- 作業:暫停和恢復爬行
- 延伸 Scrapy
- 體系結構概述
- 下載器中間件
- Spider 中間件
- 擴展
- 核心API
- 信號
- 條目導出器
- 其余所有
- 發行說明
- 為 Scrapy 貢獻
- 版本控制和API穩定性