开发,设计,生活

网络爬虫系统

  • 2014-04-20 14:19:52 2014-06-18 08:57:57[U] 网络爬虫系统

    scrapy 提供的调试方法

    1. scrapy shell 调试选择器
    2. 命令行调试 spider
    3. web 控制台(运行时)
    4. telnet 控制台(运行时查看scrapy对象,检测检测内存泄漏问题)


    scrapy shell 调试选择器

    可以在命令行直接启动 scrapy shell,在shell中导入scrapy内置的方法,可以对抓取的内容进行查看。

    # 启动 shell,抓取豆瓣本周音乐人最热单曲榜
    scrapy shell http://music.douban.com/chart
    
    # 使用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。

    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/crawler
    2. 查看爬虫的状态:http://localhost:6080/stats
    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
    'http://www.somenastyspider.com/product.php?pid=123'
    
    # 后面就是看代码,解决为什么上面的url对应的对象没有销毁
    

    我在项目中使用过这个技巧,查看过下载器的队列内容,engine的状态信息,对于调试还是比较有帮助的。