因朋友推荐,最近又重新上手了scrapy,和上一次(一年前)用确实有不同的感受了。上次感觉scrapy中的东西完全是一个黑盒,用起来很不顺手。这次重点看了它的整个架构图,搞懂了它的数据流向。然后花了两天把它的整个文档都仔细读了一遍,现在用起来感觉十分好用。这次简单说说使用scrapy进行调试的一些小技巧。
1.使用scrapy.shell.inspect_response
。
当运行scrapy spiders
,代码走到inspect_response()
的时候,会直接起一个终端,非常方便的是,这个终端中包含了运行之前所有的变量,如response
,这对于调试来讲十分有用。
2.在终端使用scrapy shell
。
有的时候,我们并不想立即编写代码,二是希望直接使用scrapy
提供的shell来做一些开发和调试工作。下面是我想分享的几个点:
- 如何在终端自定义请求的各个参数?比如我想抓取
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
的实例有些啥属性。
- 如何通过
html
text来生成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
了。
- 如何让
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这套爬虫框架的生态非常丰富,还有很多可以挖掘的东西。学海无涯,以后再做总结和分享。
网友评论