python2.7通過api和threading實現多進程爬取b站up主信息的小程序

1、通過chrome瀏覽器的F12進行網絡數據加載api的獲取。

2、分析加載數據的格式,並通過json模塊進行數據格式的轉換,方便我們對數據進行獲取和進一步操作。

3、在__name__ == __main__'文件中對我們我們的程序內容進行跟進,設置進程池,並進行基本設置(如:最多同時有300個進程在執行。之後我們通過進程池對象的map函數進行函數調用,用戶id信息不斷地傳入到函數中,進行數據的獲取和輸出。)

# encoding=utf-8
import requests
from multiprocessing.dummy import Pool as ThreadPool
import json

# 獲取用戶基本信息詳情
# https://api.bilibili.com/x/space/acc/info?mid=35228698&jsonp=jsonp
# 獲取關注人數,和粉絲數量信息
# http://api.bilibili.com/x/relation/stat?vmid=2342345&jsonp=jsonp


def get_user_info(id):

    userInfo = {}

    # 獲取用戶名稱、mid、性別、簽名、頭像avatar、用戶等級level、用戶創建時間、生日birthday、硬幣數coins_nums
    # 是否有粉絲徽章、是否是會員(0, 無, 2,年度大會員)、會員狀態(0,無,1 啓用)
    url = 'https://api.bilibili.com/x/space/acc/info?mid=%s&jsonp=jsonp' % str(id)
    try:
        r = requests.get(url)
    except Exception as e:
        print (e)
                
    # 獲取該用戶的name屬性值
    json_data = json.loads(r.text)

    # 獲取用戶個人信息
    userInfo['name'] = json_data['data']['name']
    userInfo['mid'] = json_data['data']['mid']
    userInfo['sex'] = json_data['data']['sex']
    userInfo['face'] = json_data['data']['face']
    userInfo['sign'] = json_data['data']['sign']
    userInfo['level'] = json_data['data']['level']
    userInfo['jointime'] = json_data['data']['jointime']
    userInfo['birthday'] = json_data['data']['birthday']
    userInfo['coins'] = json_data['data']['coins']
    userInfo['fans_badge'] = json_data['data']['fans_badge']
    userInfo['vip_type'] = json_data['data']['vip']['type']
    userInfo['vip_status'] = json_data['data']['vip']['status']

    url = 'http://api.bilibili.com/x/relation/stat?vmid=%s&jsonp=jsonp' % str(id)

    try:
        r = requests.get(url)
    except Exception as e:
        print (e)
    # 獲取用戶的粉絲和up主關注人員信息
    json_data = json.loads(r.text)

    userInfo['following'] = json_data['data']['following']
    userInfo['follower'] = json_data['data']['follower']

    print(userInfo)
    

if __name__ == '__main__':

    # for id in range(1000, 1022):
    ids = []
    for id in range(1000, 1022):
        ids.append(id)

    pool = ThreadPool(300)
    try:
        results = pool.map(get_user_info, ids)
    except Exception as e:
        print(e)

    pool.close()
    pool.join()

 爬取內容或輸出結果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章