哔哩哔哩爬取

Python爬虫B站首页推荐视频的视频信息,弹幕以及该视频的up主信息html

BiliBili视频信息以及弹幕爬取

主要分为四个部分:
1.获取视频的基本信息
2.获取该视频的up主信息
3.获取弹幕信息
4.写入文件
web

1.获取视频的基本信息

打开B站首页的源代码,找到相关内容。这里我获取的是圈红的那个部分的视频这里B站的首页,获取标明部分视频的超连接部分,获取视频的名字以及id号chrome

找视频的标题和超连接的内容,超连接里面的末尾数字就是视频的id号分析json

1. 上代码 ,找到目标视频的id号和名字,list1是id号,list2是视频的名字。视频的名字我以前试图在视频的详情页面找,可是老是会出错,因此我就把它放在前面来找`api

def IDList():
    url="https://www.bilibili.com/"
    r = requests.get(url,timeout=30)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    html=r.text
    soup = BeautifulSoup(html,'html.parser')
    datas=soup.find_all("div",{"class":"groom-module home-card"})
    List1=list()
    List2=list()
    for data in datas:
        Url=data.find("a").get("href")
        title=data.find("a").get("title")
        m=re.findall("\d*",Url)
        List1.append(m[-3])
        List2.append(title)
    return List1,List2``

3. 再经过视频的id号找视频;因为视频的详情信息以动态数据的方式加载,因此你再网络下面会找到这样的文件,里面就是视频的详细信息在这里插入图片描述4.能够看一下它的url由https://api.bilibili.com/x/web-interface/archive/stat?aid={}’.format(id)组成,id号就是以前list里面的id号在这里插入图片描述
5.看一下代码处理:网络

def getVideoArchiveInfo(id,info):
    url = 'https://api.bilibili.com/x/web-interface/archive/stat?aid={}'.format(id)
    url2= 'http://www.bilibili.com/video/av{}/'.format(id)
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
    try:
        r = requests.get(url,timeout=30,headers = headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        t = json.loads(r.text)
        info['watchNumber'] = t['data']['view']#播放量
        info['barrageNumber'] = t['data']['danmaku']#弹幕数
        info['rank']= t['data']['his_rank']
        info['coinNum'] = t['data']['coin']#硬币数
        info['collectNum'] = t['data']['favorite']#收藏数
        info['replyNum'] = t['data']['reply']#评论数
        return info
    except:
        return None

`2.获取该视频的up主信息

1. 为了可以得到视频的up主的详细信息,就必须得到up主的id号。再视频详情页面的源代码里就有up主id。app

def findUpID(id):
    headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"}
    url= 'http://www.bilibili.com/video/av{}/'.format(id)
    r = requests.get(url,headers=headers)
    r.encoding='utf-8'
    soup=soup = BeautifulSoup(r.text,'html.parser')
    string=soup.find("a",{"class":"message"})
    s=string.get("href")
    m=re.findall("\d*",s)
    UpID=m[-2]
    return UpID`

2. 因为我用BeautifulSoup获取不出来,又找不到缘由,找大佬问了一下也没有找到错误,因此只好用selenium来写,up是一个list;(这里用这么多try-except的缘由是每个up主的页面有一些信息可能有,可能没有,技术不到位只能想到这个方法)ide

`def findUser(id,up):
url =‘https://space.bilibili.com/{}’.format(id)
chrome_driver_binary = “D:\software\Google\Chrome\Application/chromedriver.exe”
browser = webdriver.Chrome(chrome_driver_binary)
browser.get(url)
time.sleep(3)
try:
userName=browser.find_element_by_xpath(’//[@id=“h-name”]’)
up.append(userName.text)
except:
pass
try:
userSign=browser.find_element_by_xpath(’//
[@id=“app”]/div[1]/div[1]/div[2]/div[2]/div/div[2]/div[2]/h4’)
up.append(userSign.text)
except:
pass
try:svg

dengji=browser.find_element_by_xpath('//*[@id="app"]/div[1]/div[1]/div[2]/div[2]/div/div[2]/div[1]/a[1]')
            up.append(dengji.get_attribute('lvl'))
        except:
            pass
        try:
            attention=browser.find_element_by_xpath('//*[@id="n-gz"]')
            up.append(attention.text)
        except:
            pass
        try:
            fans=browser.find_element_by_xpath('//*[@id="n-fs"]')
            up.append(fans.text)
        except:
            pass
        try:
            playNum=browser.find_element_by_xpath('//*[@id="n-bf"]')
            up.append(playNum.text)
        except:
            pass
        try:
            discription=browser.find_element_by_xpath('//*[@id="page-index"]/div[2]/div[2]/div/div[1]/span')
            up.append(discription.text)
        except:
            pass
        try:
            allCharge=browser.find_element_by_xpath('//*[@id="page-index"]/div[2]/div[4]/div[1]/div[2]/div[1]/span')
            up.append(allCharge.text)
        except:
            pass
        try:
            MonthCharge=browser.find_element_by_xpath('//*[@id="page-index"]/div[2]/div[4]/div[3]/span')
            up.append(MonthCharge.text)
        except:
            pass
        try:
            livefans=browser.find_element_by_xpath('//*[@id="page-index"]/div[2]/div[6]/div/div[1]/span[2]')
            up.append(livefans.text)
        except:
            pass
        try:
            registerTime=browser.find_element_by_xpath('//*[@id="page-index"]/div[2]/div[7]/div[2]/div[1]/div/div[1]/div[2]/span[2]')
            up.append(registerTime.text)
        except:
            pass
        try:
            birthday=browser.find_element_by_xpath('//*[@id="page-index"]/div[2]/div[7]/div[2]/div[1]/div/div[2]/div/span[2]')
            up.append(birthday.text)
        except:
            pass
        try:
            label=browser.find_element_by_xpath('//*[@id="page-index"]/div[2]/div[7]/div[2]/div[2]/div/div')
            up.append(label.text)
        except:
            pass
        try:
            vedioCount=browser.find_element_by_xpath('//*[@id="page-index"]/div[1]/div[2]/h3/span')
            up.append(vedioCount.text)
        except:
            pass
        browser.quit()
        return up`

3.而后是获取弹幕信息

1.你在视频的详情页面的network动态数据里会发现一个xml文件,里面就是保存的弹幕信息,而它的url很显然是由一个cid的参数所构成的,以下图http://comment.bilibili.com/67461578.xml.format(id)在这里插入图片描述
2.因此要借助首页得到的list1里面的id号,根据id号再到视频的详情页面获取cidui

def getCid(url):
    headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98"}
    r=requests.get(url,timeout=30,headers=headers)
    r.raise_for_status()
    r.encoding='utf-8'
    # print(r.text)
    try:
        cidText = re.findall(r'"cid":"[\d]*"',r.text)
        if not cidText:
            cidText = re.findall(r'cid=[\d]*', r.text)
            key = eval(cidText[0].split('=')[1])
        else:
            key = eval(cidText[0].split(':')[1])
    except IndexError:
        pass
    return key`
2.根据cid号凭借弹幕文件的url得到弹幕list3


 def listBarrage(key):
    url = 'http://comment.bilibili.com/{}.xml'.format(str(key))
    req = requests.get(url)
    req.raise_for_status()
    req.encoding='utf-8'
    # print(req.text)
    soup = BeautifulSoup(req.content,"lxml")
    list3=list()
    for comment in soup.find_all('d'):
        # print(soup.find_all('d'))
        # time=float(comment.attrs['p'].split(',')[0])
        # commentList[time]=comment.string
        list3.append(comment.string)
    return list3`

把获取到的内容写进文本文件

在这里插入图片描述
在这里插入图片描述