Python-优酷视频空间数据抓取(Dota)

最近挺闲的。看了不少Dota视频~ 我会经常关注那些知名解说或选手发出的视频(海涛,牛蛙……等)。涛哥在应该算是个公认的好解说的。看他的视频很有乐趣的……顺便吐槽下 ,个人觉得PIS的视频比较无聊,主要在于PIS的解说方式,情绪,声音等一些地方吧,也是由于是专业游戏选手,这方面并不是强项。

我并不想在gr里看到这些信息。所以每次要观看视频的时候就会进入到各个选手的主页去留意一下最新出的视频有没有自己爱看的~ 说起来这事也挺麻烦的。决定写个脚本把这些信息给抓出来,在想看的时候方便自己选择。

第一步是准备先把基本信息都给抓出来,然后预想是做些处理,例如观看过的视频以后就不在显示了,再然后可以做丰富些,多个分类等……再然后……越来越多的然后! 目前是准备放到sae上,担心的是视频的流量对于我那不到1W的豆来说,估计挺不了多久。

说再多都是预想~ 先从第一步开始吧,从涛哥入手:

涛哥的视频空间地址:http://i.youku.com/u/UMTcxMzI3OTE2/videos (个人空间下的videos频道页)

步骤很简单,主要分2步

1,抓取整个HTML页面代码

需要用到了urllib 包,分urllib 与 urllib2 两种,区别可以上自己看。总体来说urllib2比urllib要高一个层次(可以接受Request类的实例来设置URL请求的headers),HTTP访问大部分都会用urllib2。

ps:urllib 与 urllib2 是不能互相替代的,经常会同时被使用,urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。

最基本的抓取:

import urllib2
content = urllib2.urlopen('http://XXXX').read()

这样就得到了整个页面的html代码

2,解析HTML

重要的就是这一步了,如何从一推HTML代码中获取我们想要的信息。这里又提及到了HTMLParser、SGMLParser。当然还有BeautifulSoup等其他一些好用的解析工具,各种优劣比较网上自己查。

这里使用SGMLParser,好处是比较简单,比较通用。另《Dive into Python》中例子用的是SGMLParser。

贴出两段目标HTML代码:

<ul class="v">

<li class="v_link"><a title="【海涛解说】nada卡尔大战精灵淡淡水人,无法预料的结局" target="_blank" href="http://v.youku.com/v_show/id_XMzk3MTg3MTI0.html"></a></li>

<li class="v_thumb"><img replace="false" id="PlaylistID_XMzk3MTg3MTI0" name="XMzk3MTg3MTI0" src="http://g2.ykimg.com/0100641F464FB2D27D28DE028D906B51504F96-E0BF-0E0A-4968-6551061E989A" alt="【海涛解说】nada卡尔大战精灵淡淡水人,无法预料的结局" title="【海涛解说】nada卡尔大战精灵淡淡水人,无法预料的结局"/></li>

<li class="v_ishd"><span class="ico__SD" title="超清"></span> </li>

<li class="v_menu" style="display: none;" id="PlayListFlag_XMzk3MTg3MTI0"></li>

<li class="v_time"><span class="num">57:32</span><span class="bg"></span></li>

<li class="v_title"><a title="【海涛解说】nada卡尔大战精灵淡淡水人,无法预料的结局" target="video" href="http://v.youku.com/v_show/id_XMzk3MTg3MTI0.html">【海涛解说】nada卡尔大战精灵淡淡水人</a></li>

<li class="v_pub"><label>发布时间:</label><span>1天前</span></li>

<li class="v_stat"><span title="播放" class="ico__statplay"></span><span class="num">118,929</span> <span class="ico__statcomment" title="评论"></span><span class="num">7,085</span></li>

</ul>

<ul class="v">

<li class="v_link"><a title="【海涛教你打DOTA】刚背兽第一视角解说" target="_blank" href="http://v.youku.com/v_show/id_XMzk0NjM1ODUy.html"></a></li>

<li class="v_thumb"><img replace="false" id="PlaylistID_XMzk0NjM1ODUy" name="XMzk0NjM1ODUy" src="http://g3.ykimg.com/0100641F464FACA216BBC7028D906B01385155-EA47-FB8B-3D04-4E526969BEB6" alt="【海涛教你打DOTA】刚背兽第一视角解说" title="【海涛教你打DOTA】刚背兽第一视角解说"/></li>

<li class="v_ishd"><span class="ico__SD" title="超清"></span> </li>

<li class="v_menu" style="display: none;" id="PlayListFlag_XMzk0NjM1ODUy"></li>

<li class="v_time"><span class="num">56:17</span><span class="bg"></span></li>

<li class="v_title"><a title="【海涛教你打DOTA】刚背兽第一视角解说" target="video" href="http://v.youku.com/v_show/id_XMzk0NjM1ODUy.html">【海涛教你打DOTA】刚背兽第一视角解说</a></li>

<li class="v_pub"><label>发布时间:</label><span>5天前</span></li>

<li class="v_stat"><span title="播放" class="ico__statplay"></span><span class="num">452,253</span> <span class="ico__statcomment" title="评论"></span><span class="num">1,313</span></li>

</ul>

上面2段html是我们想要的信息,可以看出每个视频都是用 ul 来表示的。信息都在 li 标签下。

这就很明了了,把我们需要的信息从li标签里抽出来即可, 既然是视频,那么URL、名称、发布时间必然是最重要的。

因为默认是按照时间的倒序来排的,这样连发布时间都可以省去,留下最关心的名称及URL。可以看到这两个信息都可以在

<li class="v_title"><a title="xxx" target="video" href="xxx">xxxx</a></li>

这么一个class 为v_title的

  • 标签里。 href指向的就是我们需要的URL,内是我们需要的名称。
  • 1.进到class=’v_title’的li标签

    2.找到标签的href地址放入urls列表中

    3.提取的text数据放入title列表中

    4.按<名称 URL>循环打印。

    简洁明了,直接上代码吧:

    #HTML解析类GetVideos
    import urllib2
    from sgmllib import SGMLParser
    
    class GetVideos(SGMLParser):
        def __init__(self):
            SGMLParser.__init__(self)
            self.titles = []
            self.hrefs = []
            self.flag = False    ##<li>标记
            self.data = False    ##<a>标记
    
        def start_li(self,attrs):
            for k,v in attrs:
                if k == 'class' and v == 'v_title':   ##进到<li class="v_title">
                    self.flag = True
                    return
    
        def end_li(self):
            self.flag = False
    
        def start_a(self,attrs):
            if self.flag == False:
                return
            self.data = True
            for k,v in attrs:    ##进入<a>,并把href标签数据保存
                if k  == 'href' and v:
                    self.hrefs.append(v)
    
        def end_a(self):
            if self.data:
                self.data = False
    
        def handle_data(self,text):
            if self.data:
                self.titles.append(text)
    
        def printInfo(self):    ##打印所获得的数据
            for title,item in map(None,self.titles,self.hrefs):
                print title.decode('gbk','ignore').encode('utf8'),item    ##将GBK转UTF8,遇特殊字符则ignore
    测试代码:
    
    ##格式化url
    url = "%s"%("http://i.youku.com/u/UMTcxMzI3OTE2/videos")
    
    content = urllib2.urlopen(url).read()
    
    videos = GetVideos()
    
    videos.feed(content)
    
    videos.printInfo()
    

    执行结果:

    【海涛解说】nada卡尔大战精灵淡淡水人 http://v.youku.com/v_show/id_XMzk3MTg3MTI0.html
    【海涛教你打DOTA】刚背兽第一视角解说 http://v.youku.com/v_show/id_XMzk0NjM1ODUy.html
    【海涛解说】凤舞婷婷暴力冰女大战超级 http://v.youku.com/v_show/id_XMzkxMTI0NTEy.html
    【海涛解说】吾有上将nada,善使暴走影 http://v.youku.com/v_show/id_XMzg2NTAxNTky.html
    【海涛解说】DK VS IG,NGF出线名额争 http://v.youku.com/v_show/id_XMzg0MDYxOTI4.html
    海涛2012.4.13中科大演讲 http://v.youku.com/v_show/id_XMzgxNDQ3Mzg0.html
    海涛4v5 超神食尸鬼第一视角解说 http://v.youku.com/v_show/id_XMzc5MzkwOTU2.html
    【海涛解说】430推荐:幻刺跳大,疯狂 http://v.youku.com/v_show/id_XMzc2OTU3MTIw.html
    【海涛解说】质量局海涛圣剑骷髅王大战 http://v.youku.com/v_show/id_XMzczMTA0NTA4.html
    【海涛教你打DOTA】冰女第一视角解说 http://v.youku.com/v_show/id_XMzcwMDAyMzg4.html
    海涛风行第一视角,与lgd姚德华同台飙 http://v.youku.com/v_show/id_XMzY4MjU1NjU2.html
    海涛第一视角之发条大牛两连发 http://v.youku.com/v_show/id_XMzY0OTkxNzcy.html
    【海涛教你打DOTA】卡尔第一视角解说 http://v.youku.com/v_show/id_XMzYxNjU2OTU2.html
    海涛香蕉neo天梯高分局八十分钟大翻盘 http://v.youku.com/v_show/id_XMzU4Mjk3NTI4.html
    海涛首次尝试DOTA2解说,暴走翻盘不是 http://v.youku.com/v_show/id_XMzU0MzQzMzE2.html
    海涛暗影恶魔第一视角,单杀无敌,团战 http://v.youku.com/v_show/id_XMzUzMjY5MzIw.html
    【海涛解说】队友全退,辉耀被A,船长 http://v.youku.com/v_show/id_XMzUyMjMyNjI4.html
    海涛凯文携手第一视角大战职业战队DT.L http://v.youku.com/v_show/id_XMzUwMTExNzQ0.html
    【海涛解说】双圣剑炸弹人的showtime http://v.youku.com/v_show/id_XMzQ4MjE5OTA4.html
    【海涛教你打DOTA】先知第一视角解说 http://v.youku.com/v_show/id_XMzQ2NDc4NzQ4.html
    

    取出的是第一页的20个视频名称及地址~ 当然第二页 三页 ……等相同原理。

    第一步到这里就差不多了,数据可以再处理的漂亮点~~~~