# 调试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稳定性