Telnet Console
scrapy 有一个内置的telnet 控制台来检查和控制scrapy运行进程。telnet 控制台就是一个规则的python shell,运行在scrapy进程里的,所有你可以做shell里面的任何事情。
telnet 控制台内置在 built-in Scrapy extension,默认是启用的,也可以禁用,更多关于这个扩展的信息参加Telnet console extension.
Warning
使用telnet 控制台通过公用网络是不安全的,作为远程登录不会提供传输层的安全。使用账号/密码认证方式也不会改变。
推荐用法是连接本地的scrapy爬虫(爬虫进程和远程登陆控制台在一个机器里)或一个安全的连接(VPN SSH通道),请避免使用不安全的连接或通过 TELNETCONSOLE_ENABLED
完全禁用。
How to access the telnet console
telnet 控制台收听定义在 TELNETCONSOLE_PORT
设置里定义的TCP端口,默认是6023,要访问控制台, 需要输入:
telnet localhost 6023
Trying localhost...
Connected to localhost.
Escape character is '^]'.
Username:
Password:
>>>
默认用户名是scrapy,密码是自动生成的。自动生成的密码可以在scrapy 日志中看见,例如下面:
2018-10-16 14:35:21 [scrapy.extensions.telnet] INFO: Telnet Password: 16f92501e8a59326
可以通过TELNETCONSOLE_USERNAME
and TELNETCONSOLE_PASSWORD
来重写账号密码。
Warning
账号和密码只能提供一个有限的包含,telnet在不使用安全传输的情况下,默认流量是不会加密的,即使设置了账号密码。
你需要在Windows和大多数Linux发行版中默认安装的telnet程序。
Available variables in the telnet console
telnet控制台就是scrapy里运行的规则python shell,所有你可以做任何shell可以做的,包括导入新模块等。
但是,telnet控制台拥有一些默认的变量为了方便而定义的。
Shortcut | Description |
---|---|
crawler | the Scrapy Crawler (scrapy.crawler.Crawler object) |
engine | Crawler.engine attribute |
spider | 活跃的爬虫 |
slot | 引擎插槽 |
extensions | 扩展管理器 (Crawler.extensions attribute) |
stats | 统计收集器 (Crawler.stats attribute) |
settings | the Scrapy settings object (Crawler.settings attribute) |
est | 打印引擎统状态的报告 |
prefs | 内存调试 (see Debugging memory leaks) |
p | a shortcut to the pprint.pprint() function |
hpy | 内存调试 (see Debugging memory leaks) |
Telnet console usage examples
这有一些可以在telent控制台完成的例子,任务
View engine status
使用scrapy引擎的est()方法快速的获得它的状态,
telnet localhost 6023
>>> est()
Execution engine status
time()-engine.start_time : 8.62972998619
engine.has_capacity() : False
len(engine.downloader.active) : 16
engine.scraper.is_idle() : False
engine.spider.name : followall
engine.spider_is_idle(engine.spider) : False
engine.slot.closing : False
len(engine.slot.inprogress) : 16
len(engine.slot.scheduler.dqs or []) : 0
len(engine.slot.scheduler.mqs) : 92
len(engine.scraper.slot.queue) : 0
len(engine.scraper.slot.active) : 0
engine.scraper.slot.active_size : 0
engine.scraper.slot.itemproc_size : 0
engine.scraper.slot.needs_backout() : False
Pause, resume and stop the Scrapy engine
暂停
telnet localhost 6023
>>> engine.pause()
>>>
恢复
telnet localhost 6023
>>> engine.unpause()
>>>
停止
telnet localhost 6023
>>> engine.stop()
Connection closed by foreign host.
Telnet Console signals
scrapy.extensions.telnet.``update_telnet_vars
(telnet_vars)
在telnet控制台开启前发送。你个跟这个信号挂钩,来增加,删除或更新在telnet控制台 命名空间可用的变量。为了这个,你需要更新talent_vars字典在你的处理器中。
Parameters
telnet_vars (dict) – telnet变量的字典。
Telnet settings
控制telnet控制台行为的设置
TELNETCONSOLE_PORT
Default: [6023, 6073]
telnet控制台使用的端口范围,如果是 None or 0,就使用动态分配的端口。
TELNETCONSOLE_HOST
Default: '127.0.0.1'
telnet控制台要侦听的接口
TELNETCONSOLE_USERNAME
Default: 'scrapy'
The username used for the telnet console
TELNETCONSOLE_PASSWORD
Default: None
telent控制台密码,默认是自动生成。
Web Service
网络服务已经移动到了一个分离的项目中。
It is hosted at:
https://github.com/scrapy-plugins/scrapy-jsonrpc
Debugging Spiders
这个文档解释了最通用的技术来调试爬虫。考虑下面那个爬虫,
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, cb_kwargs={'item': item})
def parse_details(self, response, item):
# populate more `item` fields
return item
这是一个简单的爬虫,可以解析两页的item(start_urls).items也有一个包含了其他信息的详细页面,所以我们使用request的cb_kwargs功能来传递部分填充的item。
Parse Command
检查你的爬虫的输出的最基本的方法就是使用parse命令,允许使用不同方法级别来检查对应不同部分爬虫的行为。优点是使用灵活简单,但是不允许在方法内部调试代码。
为了查看从指定网站抓取的项目
$ 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 or -v选项我们可以查看每个深度水平的状态。
$ 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 -----------------------------------------------------------------
[]
检查从一个start_url抓取的item,我们可以使用:
$ scrapy parse --spider=myspider -d 3 'http://example.com/page1'
Scrapy Shell
尽管parse命令再检查爬虫行为时很有用,但对检查回调函数内发送了什么和展示接收的响应和输出就帮助很小。我们再parse_details没有接收到item时该怎么办?
幸运的是,这种情况下shell就有用了see Invoking the shell from spiders to inspect responses。
from scrapy.shell import inspect_response
def parse_details(self, response, item=None):
if item:
# populate more `item` fields
return item
else:
inspect_response(response, self)
See also: Invoking the shell from spiders to inspect responses.
Open in browser
有时你想看看某些响应再浏览器中的样子,你可以使用open_in_brower函数,这里的例子展示了:
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_brower会打开浏览器,展示再那点scrapy接收的响应,调整了基本的标签,所有图形和格式会被正确展示。
Logging
logging是另一个有用的选项来获得爬虫运行的信息,Although not as convenient, it comes with the advantage that the logs will be available in all future runs should they be necessary again,,,
def parse_details(self, response, item=None):
if item:
# populate more `item` fields
return item
else:
self.logger.warning('No item received for %s', response.url)
For more information, check the Logging section.