Bilibili-B站python爬虫

2020年2月6日

B站反爬虫力度小,无需严格的鉴权即可访问大部分的信息,爬虫实现难度一般,关键是找准url。我们以B站粉丝数最多的账号"老番茄"为例,爬取这位UP主的粉丝ID。

粉丝页面如下图,页面url=https://space.bilibili.com/546195/fans/fans,不需要登录即可查看任何用户的粉丝,但即便在登录状态下,最多也只能查看前200位粉丝(follower)或关注者(followee)。

现在定位资源,即粉丝的ID是如何从服务端传到客户端的呢?F12走起,选中Network,刷新粉丝页面,完成一次数据的传递。最有可能隐藏所需资源的选项有4个:XHR,JS,Media和Doc,逐个check。

XHR有6个资源返回,逐个check,发现只有下面这项有实际意义,这个接口返回的是视频博主的昵称、签名、性别等基本信息,并非所需资源。

JS中有数十个资源返回,以.js结尾的调用返回的是浏览器请求的JS文件,并非所需资源,跳过,逐个check直到发现followers字样的接口,如下,的确返回了粉丝ID。

确定了请求资源的方式,check这项请求的Headers。如下的Headers显示了请求的url, 请求方式,请求headers和请求参数,其中请求headers和请求参数均为简单的请求数据,不包含因反爬虫而设置的参数,故按照这项如下所示所需的请求数据项手动构造请求即可。

代码如下:

from requests import *
import json
import random
import time

headers = \
    {'Referer': 'https://space.bilibili.com/546195/fans/follow',
'Sec-Fetch-Mode': 'no-cors',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36'}

# 根据url获取content
def get_by_url(url):
    res = get(url, headers=headers).content.decode()
    return res

# 获取粉丝列表
def get_followers(mid, pn, ps):
    url_following = 'https://api.bilibili.com/x/relation/followers?vmid=' + mid + '&pn=' + pn + '&ps=' + ps + '&order=desc&jsonp=jsonp&callback=__jp23'
    res = get_by_url(url_following)
    followings = json.loads(res[7:-1])
    # key为 list, total
    followings = followings['data']
    followings_info = followings['list']
    followings_total = followings['total']
    mid_uname = []
    for x in followings_info:
        mid_uname.append({'mid': x['mid'], 'uname': x['uname']})
    return mid_uname

 B站反爬虫力度小,只要从大量返回数据中筛选出所需资源的的请求方式,剩下的工作按部就班就可以完成。这里爬取用户粉丝是一个例子,关注者、粉丝量、视频信息等均可采用类似的方式实现。

猜你喜欢

转载自blog.csdn.net/ten_sory/article/details/104199053