回複內容:
用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搜尋一下,就能出來了,很簡單的。