使用Python爬取B站數(shù)據(jù)

簡(jiǎn)介

最近突發(fā)奇想,想獲取一下B站上的用戶數(shù)據(jù)做個(gè)分析啥的。這個(gè)東西已經(jīng)有很多人做過了,所以網(wǎng)上的成功案例也比較多甚侣。但是不少的信息已經(jīng)不適合現(xiàn)在使用了。比如一些使用api.bilibili.com的接口间学。這里記錄一下趟坑的經(jīng)歷殷费。

流程

由于我最初的目標(biāo)只是通過用戶名獲得一個(gè)用戶的個(gè)人空間地址。分析了一下url之后發(fā)現(xiàn)低葫,所有用戶都會(huì)通過一個(gè)自增的mid進(jìn)行區(qū)分详羡。

最初看的幾篇教程中,獲得用戶的數(shù)據(jù)不僅可以通過mid這個(gè)參數(shù)嘿悬,還可以通過用戶名实柠,也就是user字段來進(jìn)行查詢。即http://api.bilibili.cn/userinfo這個(gè)接口善涨。但是發(fā)現(xiàn)這個(gè)接口已經(jīng)不能用了窒盐。發(fā)送消息返回404狀態(tài)草则。

那么就只有根據(jù)瀏覽器行為分析找找接口了。檢查發(fā)現(xiàn)了一個(gè)這樣的接口https://space.bilibili.com/ajax/member/GetInfo參數(shù)是mid字段蟹漓。但是無法通過用戶名獲取mid炕横。

接下來的想法是找找還有什么地方可以獲取這個(gè)人的mid,比如試圖抓取關(guān)注的up注的關(guān)注者葡粒,發(fā)現(xiàn)只能抓取前五頁份殿。或者是使用百度之類的搜索引擎的高級(jí)搜索嗽交,看看能不能搜索到相關(guān)的信息卿嘲。

以上嘗試都失敗的情況下,嘗試獲取bilibili全部的用戶數(shù)據(jù)轮纫。因?yàn)閙id是一個(gè)從1開始自增的數(shù)據(jù)腔寡,因此可以用這種方法來遍歷這些用戶的信息焚鲜,來找到相關(guān)的數(shù)據(jù)掌唾。

bilibili有接近一億用戶。直接單線程跑數(shù)據(jù)忿磅,一秒一條的話糯彬,需要27777個(gè)小時(shí)才能抓取完。時(shí)間太久了葱她,嘗試使用各種方法來縮短這個(gè)時(shí)間撩扒。

比如改成一秒發(fā)送兩條請(qǐng)求。這個(gè)接口的限制貌似是一分鐘100條左右吨些,因此這里每0.5秒發(fā)送一個(gè)請(qǐng)求搓谆。

還可以開啟多線程,利用ip代理池來發(fā)送請(qǐng)求豪墅,這樣避免了ip被限制的問題泉手。或許可以縮短一些時(shí)間偶器。

此外還可以用其他手段縮短查找范圍斩萌。因?yàn)閙id這個(gè)字段是自增的,還可以查看注冊(cè)時(shí)間屏轰,如果能獲得賬號(hào)的注冊(cè)時(shí)間颊郎,就可以嘗試通過注冊(cè)時(shí)間二分查找這個(gè)賬號(hào)的mid。

嘗試使用參考9中的代理ip池來進(jìn)行代理操作霎苗。按照這個(gè)代理池中的說明姆吭,安裝了SSDB,然后開啟了代理池唁盏。感覺沒什么問題内狸。

在代碼中用requests的方式調(diào)用了代理池的接口瘤睹,并使用代理訪問查看本機(jī)ip的網(wǎng)址http://ip.chinaz.com/。代理的使用沒有問題答倡。

之后嘗試使用代理拉取bilibili的mid為1到10的數(shù)據(jù)轰传。表現(xiàn)良好。

嘗試接入之前使用mysql寫的數(shù)據(jù)庫模塊中瘪撇。發(fā)現(xiàn)之前寫的東西不支持多線程获茬。需要加入多線程。暫時(shí)使用單線程來拉取數(shù)據(jù)倔既,并寫入數(shù)據(jù)庫恕曲。看起來沒什么問題渤涌。

多線程試圖通過threading和multiprocessing模塊來進(jìn)行處理佩谣。還需要考慮中斷的繼續(xù)和現(xiàn)場(chǎng)的保存。

** 注意多進(jìn)程之間的數(shù)據(jù)交互還是要使用multiprocess提供的方法实蓬,否則進(jìn)程之間無法傳遞數(shù)據(jù)茸俭。 **

threading模塊對(duì)于多核的使用沒有multiprocessing好,一個(gè)是安皱。multiprocessing能開啟多個(gè)進(jìn)程调鬓。這就涉及到了進(jìn)程之間的通信問題。

開始的時(shí)候考慮實(shí)現(xiàn)一個(gè)能迭代的manager來返回下一個(gè)需要處理的mid酌伊,然后使用multiprocessing提供的pool和map方法來處理腾窝。但是這樣產(chǎn)生了消息傳遞的問題。但是因?yàn)樾枰幚韜eb請(qǐng)求的成功和失敗居砖,所以本來使用單例模式的manager在多進(jìn)程中的共享產(chǎn)生了問題虹脯。

搜索了一下考慮使用multiprocessing提供的可供多進(jìn)程使用的變量,如Value奏候,Array等等循集。

使用的時(shí)候發(fā)現(xiàn)其實(shí)直接在主線程里對(duì)mid進(jìn)行管理即可。這樣需要獲取一個(gè)拉取的狀態(tài)鼻由。

保存現(xiàn)場(chǎng)最終選擇在一個(gè)本地的文本文件中序列化了一串字符串暇榴,記錄了多線程的處理狀態(tài)和主線程mid管理的進(jìn)度,方便下次繼續(xù)蕉世。

拉取到的數(shù)據(jù)選擇存儲(chǔ)在本地的一個(gè)數(shù)據(jù)庫文件中蔼紧。Python內(nèi)置了一個(gè)sqlite支持。使用這個(gè)創(chuàng)建一個(gè)db文件即可狠轻。

拉取數(shù)據(jù)的時(shí)候插入數(shù)據(jù)庫使用replace而不是使用insert奸例,因?yàn)閿帱c(diǎn)續(xù)傳的時(shí)候有可能會(huì)遇到id已經(jīng)之前存儲(chǔ)過了的狀況。這種狀況并不是難以忍受的問題,所以這樣的容錯(cuò)處理就可以了查吊。

最終拉取的數(shù)據(jù)還是要利用sql從數(shù)據(jù)庫文件中獲取谐区。

總結(jié)

這次實(shí)踐實(shí)際的掌握了一下前端頁面的network請(qǐng)求以及Python對(duì)于數(shù)據(jù)的處理。雖然看起來量不小逻卖,但是其實(shí)并不難也沒有設(shè)置太多的障礙宋列。可以

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末评也,一起剝皮案震驚了整個(gè)濱河市炼杖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盗迟,老刑警劉巖坤邪,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異罚缕,居然都是意外死亡艇纺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門邮弹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黔衡,“玉大人,你說我怎么就攤上這事肠鲫≡卑铮” “怎么了或粮?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵导饲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我氯材,道長(zhǎng)渣锦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任氢哮,我火速辦了婚禮袋毙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冗尤。我一直安慰自己听盖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布裂七。 她就那樣靜靜地躺著皆看,像睡著了一般。 火紅的嫁衣襯著肌膚如雪背零。 梳的紋絲不亂的頭發(fā)上腰吟,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音徙瓶,去河邊找鬼毛雇。 笑死嫉称,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的灵疮。 我是一名探鬼主播织阅,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼震捣!你這毒婦竟也來了蒲稳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤伍派,失蹤者是張志新(化名)和其女友劉穎江耀,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诉植,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祥国,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晾腔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舌稀。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖灼擂,靈堂內(nèi)的尸體忽然破棺而出壁查,到底是詐尸還是另有隱情,我是刑警寧澤剔应,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布睡腿,位于F島的核電站,受9級(jí)特大地震影響峻贮,放射性物質(zhì)發(fā)生泄漏席怪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一纤控、第九天 我趴在偏房一處隱蔽的房頂上張望挂捻。 院中可真熱鬧,春花似錦船万、人聲如沸刻撒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽声怔。三九已至,卻和暖如春碎节,著一層夾襖步出監(jiān)牢的瞬間捧搞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胎撇,地道東北人介粘。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像晚树,于是被迫代替她去往敵國(guó)和親姻采。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 必備的理論基礎(chǔ) 1.操作系統(tǒng)作用: 隱藏丑陋復(fù)雜的硬件接口爵憎,提供良好的抽象接口慨亲。 管理調(diào)度進(jìn)程,并將多個(gè)進(jìn)程對(duì)硬件...
    drfung閱讀 3,541評(píng)論 0 5
  • PYTHON爬蟲入門&視頻網(wǎng)站BILIBILI用戶爬取爬蟲詳解 前言 Python使用版本:2.7 得到數(shù)據(jù)挖掘的...
    phenanthrene閱讀 2,570評(píng)論 0 1
  • 一宝鼓、簡(jiǎn)歷準(zhǔn)備 1刑棵、個(gè)人技能 (1)自定義控件、UI設(shè)計(jì)愚铡、常用動(dòng)畫特效 自定義控件 ①為什么要自定義控件蛉签? Andr...
    lucas777閱讀 5,213評(píng)論 2 54
  • 4月17日,晴沥寥。 閱讀書目:《強(qiáng)者的邏輯》碍舍。 作者:高原,是中國(guó)圖書“潛意識(shí)”類題材最暢銷的作家邑雅。他在潛能引導(dǎo)片橡、自...
    陳陳_19b4閱讀 289評(píng)論 0 1
  • 一年始一年終捧书,今天是所有日子里過得最悠閑最放松的一天了。沒有了家務(wù)沒有了瑣事的打擾录煤,可以靜靜的思考鳄厌。。妈踊。 接觸的人...
    艾趙霞閱讀 331評(píng)論 0 0