用Scrapy shell調試xpath

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

  1. 在命令行鍵入

    scrapy shell
    • 1

    進入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)
    • 1
    • 2
    • 3

    此時網頁已被保存在response對象裏,當然也可以付給一個變量,既然是用於調試XPath,感覺沒必要保存。

  3. 使用xpath匹配網頁元素

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

    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>']
    • 1
    • 2

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

    sel.xpath('//*[@id="lg"]')
    • 1
  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">']
    • 1
    • 2
    • 3
    • 4
  5. view()

    在scrapy shell中鍵入

    view(response)
    • 1

    這條命令會調用本地瀏覽器顯示你剛剛請求的網頁,值得注意的是:

    在本機的瀏覽器打開給定的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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

衆(gang)所(bai)周(du)知(de),500是服務器內部錯誤的狀態碼,但是直覺告訴我應該是scrapy shell的User-Agent是“Scrapy+版本號”,所以才被服務器拒絕的。

用以下命令配置User-Agent並啓動scrapy shell

scrapy shell -s USER_AGENT='Mozilla/5.0'
  • 1

然後在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)
  • 1
  • 2
  • 3
  • 4

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

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

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

版權聲明:獨立博客http://www.kongtianyi.cn,歡迎轉載,轉載請註明出處。
發佈了160 篇原創文章 · 獲贊 35 · 訪問量 60萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章