哔哩哔哩爬取

Python爬虫B站首页推荐视频的视频信息,弹幕以及该视频的up主信息
BiliBili视频信息以及弹幕爬取 主要分为四个部分:
1.获取视频的基本信息
2.获取该视频的up主信息
3.获取弹幕信息
4.写入文件
1.获取视频的基本信息 打开B站首页的源代码,找到相关内容。这里我获取的是圈红的那个部分的视频哔哩哔哩爬取
文章图片

找视频的标题和超链接的内容,超链接里面的末尾数字就是视频的id号哔哩哔哩爬取
文章图片

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

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。
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主的页面有一些信息可能有,可能没有,技术不到位只能想到这个方法)
`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:
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号再到视频的详情页面获取cid
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`

把获取到的内容写进文本文件 哔哩哔哩爬取
文章图片

哔哩哔哩爬取
文章图片

    推荐阅读