用Scrapy shell調試xpath

昨日一道友問我會不會用scrapy shell檢查xpath,我表示沒搞過,都是直接在代碼裏硬懟,尷尬。然而其實也沒什麼難的,在這記錄一下方法。css

首先仍是安利一下國內翻譯的scrapy文檔,雖然最新的翻譯版本是1.0版,scrapy已經出到1.3版,可是這份文檔仍然很是好用,只是有些版本差別帶來的小坑。html

  1. 在命令行鍵入shell

    scrapy shell

    進入scrapy shell終端,若是你安裝了IPython,它會以IPython啓動。 
    此時會打出一些Scrapy的啓動信息和使用方法。瀏覽器

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

    此時網頁已被保存在response對象裏,固然也能夠付給一個變量,既然是用於調試XPath,感受不必保存。scrapy

  3. 使用xpath匹配網頁元素ide

    xpath的使用方式與在Scrapy項目裏別無二致,要注意的是在Scrapy1.2版本以後,再也不須要本身聲明selector選擇器,直接使用response.xpath()或response.css(),scrapy shell中也是如此。fetch

    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是分開的,寫法以下:url

    sel.xpath('//*[@id="lg"]')
  4. 也能夠分層調試spa

    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">']
  5. 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 <GET http://www.zhihu.com> (failed 1 times): 500 Internal Server Error
2017-04-12 22:33:24 [scrapy.downloadermiddlewares.retry] DEBUG: Retrying <GET http://www.zhihu.com> (failed 2 times): 500 Internal Server Error
2017-04-12 22:33:29 [scrapy.downloadermiddlewares.retry] DEBUG: Gave up retrying <GET http://www.zhihu.com> (failed 3 times): 500 Internal Server Error
2017-04-12 22:33:29 [scrapy.core.engine] DEBUG: Crawled (500) <GET http://www.zhihu.com> (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 <GET https://www.zhihu.com/> from <GET http://www.zhihu.com>
2017-04-12 22:41:12 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.zhihu.com/> (referer: None)

那麼如何在scrapy shell中給請求配置請求頭呢?以下:

$ scrapy shell
...
>>> from scrapy import Request
>>> req = Request('yoururl.com', headers={"header1":"value1"})
>>> fetch(req)

參考資料:http://stackoverflow.com/questions/37010524/set-headers-for-scrapy-shell-request

相關文章
相關標籤/搜索