scrapy shell 調試選擇器html
命令行調試 spiderweb
web 控制檯(運行時)shell
telnet 控制檯(運行時查看scrapy對象,檢測檢測內存泄漏問題)dom
能夠在命令行直接啓動 scrapy shell,在shell中導入scrapy內置的方法,能夠對抓取的內容進行查看。scrapy
# 啓動 shell,抓取豆瓣本週音樂人最熱單曲榜 scrapy shell # 使用scrapy內置的選擇器,經過 xpath 獲取榜單的音樂名稱 In [1]: musicNames=sel.xpath('//div[@class="article"]//div[@class="intro"]//a/text()').extract() # 打印歌曲名稱 In [16]: for i in musicNames: print i # 如下內容爲上面選擇器命令的輸出 Hello,I Love You 2014 歡迎你來大工廠demo 合歡 才華有限公司 另外一個本身 Dear Mama Remix 西蘭花 Now it's a brave time_New versions Mini Maton 四月輓歌 《快了個播》詞:HK&拖鞋 去遠方(demo)想當年(正式版) 愛情 請你嫁給我 星河小夜曲 Pi的奇幻之旅 demo 雜念 - Sleepy Cat(beat by Mr.積). 走在通往明天的路上 (路)
寫一個抓取豆瓣音樂排行榜的 spider。ide
from scrapy.spider import Spider from scrapy.selector import Selector from douban.items import DoubanItem class MySpider(Spider): name = 'myspider' allowed_domains = ["douban.com"] start_urls = ( 'http://music.douban.com/chart', ) def parse(self, response): sel = Selector(response) musicNames = sel.xpath('//div[@class="article"]//div[@class="intro"]//a/text()').extract() for musicName in musicNames: item = DoubanItem() item['musicName'] = musicName yield item
# 命令行指定蜘蛛抓取起始的 url,輸出抓取的解析信息 scrapy parse --spider=MySpider -d 3 http://music.douban.com/chart # 輸出的內容(中文名稱是unicode編碼) >>> STATUS DEPTH LEVEL 1 <<< # Scraped Items ------------------------------------------------- [{'musicName': u'Hello,I Love You 2014'}, {'musicName': u'\u6b22\u8fce\u4f60\u6765\u5927\u5de5\u5382demo'}, {'musicName': u'\u5408\u6b22'}, {'musicName': u'\u624d\u534e\u6709\u9650\u516c\u53f8'}, {'musicName': u'\u53e6\u4e00\u4e2a\u81ea\u5df1'}, {'musicName': u'Dear Mama Remix'}, {'musicName': u'\u897f\u5170\u82b1'}, {'musicName': u"Now it's a brave time_New versions Mini Maton"}, {'musicName': u'\u56db\u6708\u633d\u6b4c'}, {'musicName': u'\u300a\u5feb\u4e86\u4e2a\u64ad\u300b\u8bcd\uff1aHK&\u62d6\u978b'}, {'musicName': u'\u53bb\u8fdc\u65b9(demo)'}, {'musicName': u'\u60f3\u5f53\u5e74\uff08\u6b63\u5f0f\u7248\uff09'}, {'musicName': u'\u7231\u60c5'}, {'musicName': u'\u8bf7\u4f60\u5ac1\u7ed9\u6211'}, {'musicName': u'\u661f\u6cb3\u5c0f\u591c\u66f2'}, {'musicName': u'Pi\u7684\u5947\u5e7b\u4e4b\u65c5 demo'}, {'musicName': u' '}, {'musicName': u'\u6742\u5ff5 - Sleepy Cat(beat by Mr.\u79ef).'}, {'musicName': u'\u8d70\u5728\u901a\u5f80\u660e\u5929\u7684\u8def\u4e0a'}, {'musicName': u'\uff08\u8def\uff09'}] # Requests ----------------------------------------------------- []
全部 web 接口使用 JSON-RPC 2.0 協議,能夠在監控系統中經過 API 集成 scrapy 的狀態信息。編碼
控制爬蟲進程:http://localhost:6080/crawlerurl
查看爬蟲的狀態:http://localhost:6080/statsspa
還能夠自定義查看引擎狀態等接口命令行
具體看 scrapy文檔
這個最好選用 Scrapy 0.22.2 以後的版本
scrapy默認打開6023端口,telnet 鏈接這個端口,能夠查看scrapy運行狀態
telnet localhost 6023# 查看對象引用狀況 >>> prefs()Live References ExampleSpider 1 oldest: 15s ago HtmlResponse 10 oldest: 600s ago Selector 2 oldest: 0s ago FormRequest 878 oldest: 7s ago # 上面HtmlResponse已經存在10分鐘,比較可疑,查看最長時間的HtmlResponse對象 >>> from scrapy.utils.trackref import get_oldest >>> r = get_oldest('HtmlResponse') >>> r.url ' # 後面就是看代碼,解決爲何上面的url對應的對象沒有銷燬
我在項目中使用過這個技巧,查看過下載器的隊列內容,engine的狀態信息,對於調試仍是比較有幫助的。