用Scrapy shell调试xpath

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

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

  1. 在命令行键入

    1
    scrapy shell

    进入scrapy shell终端,如果你安装了IPython,它会以IPython启动。
    此时会打出一些Scrapy的启动信息和使用方法。

  2. 使用fetch()获取网页

    1
    2
    3
     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) <GET https://www.baidu.com> (referer: None)

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

  3. 使用xpath匹配网页元素

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

    1
    2
    In [2]: response.xpath('//*[@id="lg"]').extract()
    Out[2]: ['<div id="lg"> <img hidefocus="true" src="//www.baidu.com/img/bd_logo1.png" width="270" height="129"> </div>']

scrapy 1.2版本以前,fetch()回的response和selector是分开的,写法如下:

1
sel.xpath('//*[@id="lg"]')
  1. 也可以分层调试

    1
    2
    3
    4
     In [3]: a = response.xpath('//*[@id="lg"]')

    In [4]: a.xpath('./img').extract()
    Out[4]: ['<img hidefocus="true" src="//www.baidu.com/img/bd_logo1.png" width="270" height="129">']
  2. view()

    在scrapy shell中键入

    1
    view(response)

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

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

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

有钱的捧个钱场~