爬蟲如何獲得biilbili播放數?

來源:互聯網
上載者:User
  

回複內容:

用av2047063舉例,訪問下面的網址:【網址已隱去】
@妹空醬 提醒我才想起來。。。。
先去自己申請一個appkey。。。在這裡:
bilibili - 提示
然後就可以對bilibiliapi為所欲為了。。。。
B站第三方用戶端就是這麼開發出來的。。。

可以看到最後兩個參數id=av號&page=分p
play後面的18253即為播放數。

==============================
b站有公開api啊。。。。。。。那麼麻煩幹嘛。。。答主的第一次就就交在這裡了,,,
———————————————————————————————————————
前不久學習了python,正好複習一下
代碼如下:
import re,urllib
page=urllib.urlopen('http://m.acg.tv/video/av2046040.html ')
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為例:http://www.bilibili.com/video/av2046040/
    可以看到
    使用Firefox查看選中部分原始碼,如下使用Firefox查看選中部分原始碼,如下
    但是我通過python的urllib模組並沒有擷取到頁面內容:但是我通過python的urllib模組並沒有擷取到頁面內容:
    page=urllib.urlopen('http://www.bilibili.com/video/av2046040/ ')
    於是我轉換思路,貌似B站的手機版網頁可以,於是我轉換思路,貌似B站的手機版網頁可以,
    然後使用Firefox的User-Agent Overrider修改瀏覽器UA為Android FireFox/29
    既可以獲得如下介面:既可以獲得如下介面:
    擷取到頁面實際地址後,就可以再次使用Firefox查看原始碼擷取到頁面實際地址後,就可以再次使用Firefox查看原始碼
    既可以寫出Regex:既可以寫出Regex:
    re_times=r'
  • (.*)
  • '
    然後正則匹配就好了。
    # encoding=utf8# author:shell-vonimport requestsimport reaid = '3210612'api_key = "http://interface.bilibili.com/count?key=27f582250563d5d6b11d6833&aid=%s"data = requests.get(api_key % aid).contentregex = r"\('(?:.|#)([\w_]+)'\)\.html\('?(\d+)'?\)"print dict(re.findall(regex, data))
    以前寫過一個。。。。
    haogefeifei/get_bilibili_anime · GitHub 這是MATLAB的抓取,其中api可以利用Chrome的開發人員工具獲得:
    aid = 3295561;api = 'http://interface.bilibili.com/count?key=b9415053057bb00966665eaa';data = regexp(webread(api,'aid',aid),'#(\w)+\D*(\d)+','tokens');data = [data{:}]
    說下大概的思路。
    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?

    隨便在首頁找了個頁面,地址如下:
    【愛深黑切】路人女主的玩壞方法~第一彈

    import urllib2import refrom StringIO import StringIOimport gzipdef find_cid_aid(html):    target = re.compile('EmbedPlayer(?P.*?)',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'(?P.*?)',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)
    擷取cid aid請求http://interface.bilibili.com/player
    什麼東西抓抓包就知道了

    比如說一樣的懶人眼鏡,你懂的~~ 這裡的源碼直接可以直接用正則匹配到cid和aid,
    cid=1511100&aid=1044050

    然後請求
    http://interface.bilibili.com/player?id=cid:1511100&aid=1044050

    然後被包圍的就是播放數了

    4611
    你在電腦螢幕上面看到的一切都是資料來著啊。B站的網頁也只不過是一堆代碼而已。稍微擷取一下原始碼,解gzip壓縮,轉換一下編碼,Regex搜尋一下,就能出來了,很簡單的。
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.