scrapy调试小技巧

因朋友推荐,最近又重新上手了scrapy,和上一次(一年前)用确实有不同的感受了。上次感觉scrapy中的东西完全是一个黑盒,用起来很不顺手。这次重点看了它的整个架构图,搞懂了它的数据流向。然后花了两天把它的整个文档都仔细读了一遍,现在用起来感觉十分好用。这次简单说说使用scrapy进行调试的一些小技巧。

1.使用scrapy.shell.inspect_response

当运行scrapy spiders,代码走到inspect_response()的时候,会直接起一个终端,非常方便的是,这个终端中包含了运行之前所有的变量,如response,这对于调试来讲十分有用。

2.在终端使用scrapy shell

有的时候,我们并不想立即编写代码,二是希望直接使用scrapy提供的shell来做一些开发和调试工作。下面是我想分享的几个点:

1) 如何在终端自定义请求的各个参数?比如我想抓取 https://rookiefly.cn这个网站,并且使用伪装的headers. 我们知道,在 scrapy 项目中,只需要在下载中间件中做一次处理就够了,那么在scrapy shell中呢?可以使用如下的方式自定义 scrapy request

from scrapy.http import Request
req = Request('https://rookiefly.cn')
req.headers.setdefault('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36')
# 或者像下面这样
req = Request('https://rookielfy.cn', headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'})

fetch(req)

其实主要方法就是根据help(Request)来看看Request初始化可以传入什么参数,根据dir(Request)来看看scrapy.http.Request的实例有些啥属性。

2) 如何通过htmltext来生成scrapy.http.Response?这一点最开始也挺令我疑惑的。因为有的时候我需要将 requests请求得到的response content 扔到 scrapy shell 中用scrapy的api去解析和调试,如果能生成Response,那么还可以通过view(response)这个功能来检查返回页面的结果。这个不能直接使用scrapy.http.Response来初始化实例,需要这样

resp = requests.get('https://rookielfy.cn')
from scrapy.http import HtmlResponse
response = HtmlResponse(url='https://rookielfy.cn',  body=resp.content)

这样就初始化了一个最简单的response了。

3) 如何让scrapy shell读入spiders的配置文件 settings.py?有这个疑问是因为有的时候,项目有众多中间件,而我想直接用scrapy shell进行调试。比如scrapy-splash,在终端有如下代码

req = SplashRequest('https://httpbin.org/user-agent',
        args={
            'wait': 2,
        },
        splash_url='http://127.0.0.1:8050',
        headers={'User-Agent': 'i am a fake user agent'}
    )
fetch(req)

如果不引用splash的中间件,那么直接在终端执行fetch(req),请求不会通过splash的,所以在启动终端的时候,载入指定的配置就很重要。那么如何做呢?其实比较简单,我们只需要在项目根目录(含有scrapy.cfg文件)下启动scrapy shell即可。


以上就是近期使用scrapy shell总结出来的小技巧。现在发现scrapy这套爬虫框架的生态非常丰富,还有很多可以挖掘的东西。学海无涯,以后再做总结和分享。