Scrapy : Telnet Console,Debugging Spiders

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控制台拥有一些默认的变量为了方便而定义的。

ShortcutDescription
crawlerthe Scrapy Crawler (scrapy.crawler.Crawler object)
engineCrawler.engine attribute
spider活跃的爬虫
slot引擎插槽
extensions扩展管理器 (Crawler.extensions attribute)
stats统计收集器 (Crawler.stats attribute)
settingsthe Scrapy settings object (Crawler.settings attribute)
est打印引擎统状态的报告
prefs内存调试 (see Debugging memory leaks)
pa 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.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值