zg手冊 之 scrapy 開發(7)-- 爬蟲調試

scrapy 提供的調試方法

  1. scrapy shell 調試選擇器html

  2. 命令行調試 spiderweb

  3. web 控制檯(運行時)shell

  4. telnet 控制檯(運行時查看scrapy對象,檢測檢測內存泄漏問題)dom


scrapy shell 調試選擇器

能夠在命令行直接啓動 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

寫一個抓取豆瓣音樂排行榜的 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 service 控制接口接單介紹

全部 web 接口使用 JSON-RPC 2.0 協議,能夠在監控系統中經過 API 集成 scrapy 的狀態信息。編碼

  1. 控制爬蟲進程:http://localhost:6080/crawlerurl

  2. 查看爬蟲的狀態:http://localhost:6080/statsspa

  3. 還能夠自定義查看引擎狀態等接口命令行

具體看 scrapy文檔


telnet 控制檯(運行時查看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的狀態信息,對於調試仍是比較有幫助的。


zg手冊 之 scrapy 開發(7)-- 爬蟲調試

相關文章
相關標籤/搜索