python爬取b站用户_用Python爬取bilibili全站用户信息
教你用Python爬取嗶哩嗶哩全站用戶信息
運(yùn)行
下載
git clone https://github.com/cexll/bili_user_Spider.git
復(fù)制代碼
運(yùn)行環(huán)境
Windows/Ubuntu
Python 3.6
VSCode
依賴
requests
pymongo
mongodb
使用本腳本請(qǐng)先安裝好MongoDB,并且安裝好庫(kù)
pip install -r requirements.txt
復(fù)制代碼
運(yùn)行
運(yùn)行前請(qǐng)進(jìn)入腳本把cookie和mid改成自己的方便第一時(shí)間給數(shù)據(jù)庫(kù)增加相應(yīng)的數(shù)據(jù)
python3 spider.py
復(fù)制代碼
思路
這是用思維導(dǎo)圖畫的一個(gè)腳本的大致運(yùn)行情況
程序的大致思路是這樣,通過mid進(jìn)入用戶主目錄,然后獲取用戶個(gè)人信息并保存到數(shù)據(jù)庫(kù),然后獲取用戶的粉絲數(shù)量以及關(guān)注數(shù)量方便之后計(jì)算頁(yè)數(shù),下一步獲取所有的關(guān)注用戶mid以及粉絲用戶mid保存到數(shù)據(jù)庫(kù),然后依次提取數(shù)據(jù)庫(kù)mid進(jìn)入用戶主目錄循環(huán)至結(jié)束
運(yùn)行過程
數(shù)據(jù)來源
數(shù)據(jù)通過bilibili官方api獲取除了獲取個(gè)人信息必須要進(jìn)入用戶目錄才能成功獲取其他都可直接通過API獲取到數(shù)據(jù)
分析代碼
這里就上最主要的代碼
運(yùn)行函數(shù),首選進(jìn)入用戶主頁(yè)然后獲取個(gè)人信息到數(shù)據(jù)庫(kù)
然后獲取粉絲數(shù)量以及關(guān)注數(shù)量
通過關(guān)注數(shù)量 / 50 得到頁(yè)數(shù), 這里做了如果結(jié)果小于或等于1那么就直接當(dāng)1,不然range(1, 1)是無法運(yùn)行的
def run(mid):
"""
運(yùn)行函數(shù)
"""
# 進(jìn)入用戶主頁(yè)
get_space(mid)
# 獲取關(guān)注數(shù)量和粉絲數(shù)量
f, g = get_myinfo(mid)
# 獲取關(guān)注用戶信息
f_g_ps = 50
f_g_pn = int(g / f_g_ps)+1
if f_g_pn <= 1:
get_followers(mid, 1, f_g_ps)
else:
for g_pn in range(1, f_g_pn):
get_followings(mid, g_pn, f_g_ps)
# 獲取粉絲用戶信息
f_r_ps = 50
f_r_pn = int(f / f_r_ps)+1
print(f_r_pn)
if f_r_pn <= 1:
get_followers(mid, 1, f_r_ps)
else:
for r_pn in range(1, f_r_pn):
get_followers(mid, r_pn, f_r_ps)
# 循環(huán)
rep_run()
復(fù)制代碼
核心代碼
這里MIN必須要先初始值,就設(shè)置了一個(gè)全局變量,進(jìn)入rep_run,MIN變量加一,連接list數(shù)據(jù)庫(kù),查詢數(shù)據(jù)庫(kù)所有信息保存到result,max是從數(shù)據(jù)庫(kù)提取出來的信息最大count,接下來判斷MIN是否大于max,如果大于則說明數(shù)據(jù)庫(kù)數(shù)據(jù)已經(jīng)運(yùn)行完了,直接結(jié)束腳本,如果不大于則繼續(xù)循環(huán)
def rep_run():
"""
當(dāng)上一個(gè)mid所有事情完成后進(jìn)入此函數(shù)進(jìn)行循環(huán)爬取下一個(gè)mid
"""
global MIN
# 每次運(yùn)行此函數(shù)使MIN加一,不能大于max(數(shù)據(jù)庫(kù)count)
MIN += 1
collection = db.list
# 查詢數(shù)據(jù)庫(kù)所有數(shù)據(jù)保存到result
if collection.find({'id': MIN}):
ran = collection.find({'id': MIN})
# 查詢數(shù)據(jù)庫(kù)有多少條
count = collection.find({}).count()
for x in ran:
mid = x.get('mid')
if MIN > count:
print('程序即將停止運(yùn)行,所有信息爬取完成')
time.sleep(10)
exit()
else:
run(mid)
else:
print('數(shù)據(jù)庫(kù)沒有該數(shù)據(jù) id: {}'.format(MIN))
復(fù)制代碼
分析
2018-9-12 現(xiàn)已有10W數(shù)據(jù)進(jìn)行簡(jiǎn)單數(shù)據(jù)分析各位看官看看就好
性別分布情況
? 可以看到,還是有非常多的人不愿意透露性別的(.....)
用戶增長(zhǎng)情況
這1970年都有大哥注冊(cè)了,真是元老啊.....但是很少,大部分元老包括b站官方站長(zhǎng)等也是2009年
?
由于一些小問題小坑,已經(jīng)將數(shù)據(jù)保存部分進(jìn)行重寫,這次使用了MySQL,有興趣的可以去Github看看
總結(jié)
以上是生活随笔為你收集整理的python爬取b站用户_用Python爬取bilibili全站用户信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python find函数 和index
- 下一篇: python调用java方法_pytho