linux远程调试scrapy文件,用Scrapy shell调试xpath

昨日一道友问我会不会用scrapy shell检查xpath,我表示没搞过,都是直接在代码里硬怼,尴尬。然而其实也没什么难的,在这记录一下方法。

首先还是安利一下国内翻译的scrapy文档,虽然最新的翻译版本是1.0版,scrapy已经出到1.3版,但是这份文档仍然非常好用,只是有些版本差异带来的小坑。

在命令行键入 scrapy shell

进入scrapy shell终端,如果你安装了IPython,它会以IPython启动。

此时会打出一些Scrapy的启动信息和使用方法。

使用fetch()获取网页 In [2]: fetch('https://www.baidu.com')

2017-01-17 10:32:55 [scrapy.core.engine] INFO: Spider opened

2017-01-17 10:32:55 [scrapy.core.engine] DEBUG: Crawled (200) (referer: None)

此时网页已被保存在response对象里,当然也可以付给一个变量,既然是用于调试XPath,感觉没必要保存。

使用xpath匹配网页元素

xpath的使用方式与在Scrapy项目里别无二致,要注意的是在Scrapy1.2版本之后,不再需要自己声明selector选择器,直接使用response.xpath()或response.css(),scrapy shell中也是如此。 In [2]: response.xpath('//*[@id="lg"]').extract()

Out[2]: ['

bd_logo1.png
']

scrapy 1.2版本以前,fetch()回的response和selector是分开的,写法如下: sel.xpath('//*[@id="lg"]')

也可以分层调试 In [3]: a = response.xpath('//*[@id="lg"]')

In [4]: a.xpath('./img').extract()

Out[4]: ['bd_logo1.png']

view()

在scrapy shell中键入 view(response)

这条命令会调用本地浏览器显示你刚刚请求的网页,值得注意的是:

在本机的浏览器打开给定的response。 其会在response的body中添加一个 tag ,使得外部链接(例如图片及css)能正确显示。 注意,该操作会在本地创建一个临时文件,且该文件不会被自动删除。 ——中文文档

当你感觉xpath写的没问题可是就是匹配不到的时候,不妨看一下你到底下载到了啥玩意儿:-)。

17年4月12日补:

添加UserAgent和请求头的方法

在用scrapy shell 调试知乎时出现:

fetch('http://www.zhihu.com')

2017-04-12 22:33:09 [scrapy.core.engine] INFO: Spider opened

2017-04-12 22:33:19 [scrapy.downloadermiddlewares.retry] DEBUG: Retrying (failed 1 times): 500 Internal Server Error

2017-04-12 22:33:24 [scrapy.downloadermiddlewares.retry] DEBUG: Retrying (failed 2 times): 500 Internal Server Error

2017-04-12 22:33:29 [scrapy.downloadermiddlewares.retry] DEBUG: Gave up retrying (failed 3 times): 500 Internal Server Error

2017-04-12 22:33:29 [scrapy.core.engine] DEBUG: Crawled (500) (referer: None)

众(gang)所(bai)周(du)知(de),500是服务器内部错误的状态码,但是直觉告诉我应该是scrapy shell的User-Agent是“Scrapy+版本号”,所以才被服务器拒绝的。

用以下命令配置User-Agent并启动scrapy shell:

scrapy shell -s USER_AGENT='Mozilla/5.0'

然后在fetch()知乎的首页,发现已经200了。

fetch('http://www.zhihu.com')

2017-04-12 22:41:11 [scrapy.core.engine] INFO: Spider opened

2017-04-12 22:41:11 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to from

2017-04-12 22:41:12 [scrapy.core.engine] DEBUG: Crawled (200) (referer: None)

那么如何在scrapy shell中给请求配置请求头呢?如下:

$ scrapy shell

...

>>> from scrapy import Request

>>> req = Request('yoururl.com', headers={"header1":"value1"})

>>> fetch(req)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值