昨日一道友問我會不會用scrapy shell檢查xpath,我表示沒搞過,都是直接在代碼裏硬懟,尷尬。然而其實也沒什麼難的,在這記錄一下方法。css
首先仍是安利一下國內翻譯的scrapy文檔,雖然最新的翻譯版本是1.0版,scrapy已經出到1.3版,可是這份文檔仍然很是好用,只是有些版本差別帶來的小坑。html
在命令行鍵入shell
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) <GET https://www.baidu.com> (referer: None)
此時網頁已被保存在response對象裏,固然也能夠付給一個變量,既然是用於調試XPath,感受不必保存。scrapy
使用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"]')
也能夠分層調試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">']
view()
在scrapy shell中鍵入
view(response)
這條命令會調用本地瀏覽器顯示你剛剛請求的網頁,值得注意的是:
在本機的瀏覽器打開給定的response。 其會在response的body中添加一個 tag ,使得外部連接(例如圖片及css)能正確顯示。 注意,該操做會在本地建立一個臨時文件,且該文件不會被自動刪除。 ——中文文檔
當你感受xpath寫的沒問題但是就是匹配不到的時候,不妨看一下你到底下載到了啥玩意兒:-)。
17年4月12日補:
在用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