首页 >后端开发 >php教程 >爬虫如何获得biilbili播放数?

爬虫如何获得biilbili播放数?

WBOY
WBOY原创
2016-06-17 08:32:021903浏览

  <i id="dianji" title="播放"></i><i id="dm_count" title="弹幕"></i><i id="stow_count" title="收藏"></i><i id="pt"><span class="v_ctimes" title="硬币数量"></span></i>

回复内容:

用av2047063举例,访问下面的网址:【网址已隐去】
@妹空酱 提醒我才想起来。。。。
先去自己申请一个appkey。。。在这里:
bilibili - 提示
然后就可以对bilibiliapi为所欲为了。。。。
B站第三方客户端就是这么开发出来的。。。
爬虫如何获得biilbili播放数?
可以看到最后两个参数id=av号&page=分p
play后面的18253即为播放数。

==============================
b站有公开api啊。。。。。。。那么麻烦干嘛。。。 答主的第一次就就交在这里了,,,
———————————————————————————————————————
前不久学习了python,正好复习一下
代码如下:
import re,urllib
page=urllib.urlopen('m.acg.tv/video/av204604')
HTML=page.read()
re_times=r'
  • (.*)
  • '
    result = re.findall(re_times,HTML)
    re_title=r'

    (.*)

    '
    title=re.findall(re_title,HTML)
    print title[0],'的播放次数为',result[0]

    下面以av2046040为例:bilibili.com/video/av20
    可以看到
    爬虫如何获得biilbili播放数?使用火狐查看选中部分源代码,如下
    爬虫如何获得biilbili播放数?但是我通过python的urllib模块并没有获取到页面内容:
    page=urllib.urlopen('http://www.bilibili.com/video/av2046040/')
    爬虫如何获得biilbili播放数?于是我转换思路,貌似B站的手机版网页可以,
    然后使用火狐的User-Agent Overrider修改浏览器UA为Android FireFox/29
    爬虫如何获得biilbili播放数?既可以获得如下界面:
    爬虫如何获得biilbili播放数?获取到页面实际地址后,就可以再次使用火狐查看源代码
    爬虫如何获得biilbili播放数?既可以写出正则表达式:
    re_times=r'
  • (.*)
  • '
    然后正则匹配就好了。
    <code class="language-python"><span class="c"># encoding=utf8</span>
    <span class="c"># author:shell-von</span>
    
    <span class="kn">import</span> <span class="nn">requests</span>
    <span class="kn">import</span> <span class="nn">re</span>
    <span class="n">aid</span> <span class="o">=</span> <span class="s">'3210612'</span>
    <span class="n">api_key</span> <span class="o">=</span> <span class="s">"http://interface.bilibili.com/count?key=27f582250563d5d6b11d6833&aid=</span><span class="si">%s</span><span class="s">"</span>
    <span class="n">data</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">api_key</span> <span class="o">%</span> <span class="n">aid</span><span class="p">)</span><span class="o">.</span><span class="n">content</span>
    <span class="n">regex</span> <span class="o">=</span> <span class="s">r"\('(?:.|#)([\w_]+)'\)\.html\('?(\d+)'?\)"</span>
    <span class="k">print</span> <span class="nb">dict</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">regex</span><span class="p">,</span> <span class="n">data</span><span class="p">))</span>
    </code>
    以前写过一个。。。。
    爬虫如何获得biilbili播放数?haogefeifei/get_bilibili_anime · GitHub 这是MATLAB的抓取,其中api可以利用Chrome的开发者工具获得:
    <code class="language-matlab"><span class="n">aid</span> <span class="p">=</span> <span class="mi">3295561</span><span class="p">;</span>
    <span class="n">api</span> <span class="p">=</span> <span class="s">'http://interface.bilibili.com/count?key=b9415053057bb00966665eaa'</span><span class="p">;</span>
    <span class="n">data</span> <span class="p">=</span> <span class="n">regexp</span><span class="p">(</span><span class="n">webread</span><span class="p">(</span><span class="n">api</span><span class="p">,</span><span class="s">'aid'</span><span class="p">,</span><span class="n">aid</span><span class="p">),</span><span class="s">'#(\w)+\D*(\d)+'</span><span class="p">,</span><span class="s">'tokens'</span><span class="p">);</span>
    <span class="n">data</span> <span class="p">=</span> <span class="p">[</span><span class="n">data</span><span class="p">{:}]</span>
    </code>
    说下大概的思路。
    0、打开特定的av页面,通过这条语句来找到CID和AID。注意:ctrl + u中能看到的源代码就是能匹配的源代码。
    1、发送请求到interface.bilibili.com/player?id=cid:(匹配的CID,要前面的冒号)&aid=(匹配的AID)
    2、从获取的xml文件中找到,就是你要的答案了。

    =====================================================

    实际上,我们ctrl + u看到的页面是网站发给我们的其中一个包而已,而最终的结果页面是网站发给我们的多个包组合的结果。
    有时候,网站会将数据封装在json或者xml中,然后通过多个请求获取数据,最后在本地用js来进行最后的构建。
    因此,页面上看到的内容是最后的结果,如果你要判断这个结果来自于源页面还是json还是xml,就需要通过开发者工具抓抓包,然后自己分析。

    总之,逻辑就是:
    0、这个数据哪来的? —— 通过抓包分析
    1、模拟获取这个数据的过程。 —— 直接访问该数据的来源url

    当然还要注意你要传的参数。这个参数从哪些地方获取也需要自己分析。

    ====================================================

    还是举个例子吧。

    注意:B站发回的数据是gzip,然而urllib2的urlopen不会自动解压,需要手动处理。
    可以参考这个回答:
    Does python urllib2 automatically uncompress gzip data fetched from webpage?

    随便在首页找了个页面,地址如下:
    【爱深黑切】路人女主的玩坏方法~第一弹

    <code class="language-text">import urllib2
    import re
    from StringIO import StringIO
    import gzip
    
    def find_cid_aid(html):
        target = re.compile('EmbedPlayer(?P<args>.*?)',re.DOTALL)
        cidaid = target.search(html)
        cidaid = html[cidaid.start('args'):cidaid.end('args')]
        cid = cidaid.find('cid=')
        aid = cidaid.find('&aid=')
        index = aid
        while cidaid[index] != '"':
            index += 1
        return (cidaid[cid + 4:aid],cidaid[aid + 5:index])
    
    def find_how_many(cid_aid):
        target = re.compile(r'<click>(?P<result>.*?)</result></click>',re.DOTALL)
        cid = cid_aid[0]
        aid = cid_aid[1]
        addr = r'http://interface.bilibili.com/player?id=cid:' + cid + '&aid=' + aid
        f = urllib2.urlopen(addr)
        res = f.read()
        target = target.search(res)
        return res[target.start('result'):target.end('result')]
    
    headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', \
               'Accept-Language':'zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3', \
               'User-Agent':'Mozilla/5.0 (Windows NT 6.1; rv:28.0) Gecko/20100101 Firefox/28.0',\
               'Host':'www.bilibili.com', \
               'Accept-Encoding':'gzip, deflate', \
               'Cache-Control':'max-age=0', \
               'Connection':'keep-alive'}
    
    request = urllib2.Request(r'http://www.bilibili.com/video/av2046145/', headers=headers)
    
    html = urllib2.urlopen(request)
    
    if html.info().get('Content-Encoding') == 'gzip':
        buf = StringIO(html.read())
        f = gzip.GzipFile(fileobj=buf)
        html = f.read()
    
    cid_aid = find_cid_aid(html)
    print find_how_many(cid_aid)
    </args></code>
    获取cid aid请求http://interface.bilibili.com/player
    什么东西抓抓包就知道了

    比如说如图一样的懒人眼镜,你懂的~~这里的源码直接可以直接用正则匹配到cid和aid,
    cid=1511100&aid=1044050

    然后请求
    interface.bilibili.com/

    然后被包围的就是播放数了

    <code class="language-text"><click>4611</click>
    </code>
    你在电脑屏幕上面看到的一切都是数据来着啊。B站的网页也只不过是一堆代码而已。稍微获取一下源代码,解gzip压缩,转换一下编码,正则表达式搜索一下,就能出来了,很简单的。
    声明:
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn