python平台下基于request和re库实现的bilibili网站爬虫程序


一、前言

本代码参考学习了b站up主路飞学城IT的教学视频前27P
视频链接
本代码仅供学习之用,如有侵权请联系我删除文章
ps:第一次写文章,排版很烂,轻喷QAQ


二、第一个程序:爬取bilibili今日新番时间表

(一)嗅探

目的:
(1)定位新番时间表中今日的内容
(2)爬取今日新番的名称、第几话、播出时间以及播放地址
目标网页
在这里插入图片描述
F12打开网页响应的网络一栏,再刷新一下页面
在这里插入图片描述
可以看到timeline_global里面有我们需要的信息
通过研究这个表,可以知道在is_today : 1下的内容是我们所关注的,这是我们写正则表达式的重要依据

(二)代码

先导入request和re库

// 导入库
import requests
import re

再看一下请求得到的网站响应内容

domain = "https://bangumi.bilibili.com/web_api/timeline_global"
headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 Edg/89.0.774.68"
}

resp = requests.get(domain, headers=headers)  # 可以加入verify=False 去掉安全验证
page_content = resp.text
# print(resp.text) # 可以打出来看看都有什么内容,便于定位

编写正则表达式
(1)获取今日日期

obj1time = re.compile(r'.*{"date":"(?P<day>.*?)".*?"day_of_week":(?P<week>.*?),"is_today":1.*?',re.S)
time = obj1time.search(page_content)
print("日期:"+time.group("day")+","+"星期"+time.group("week"))
print("今日新番时间表:\n")

(2)爬取今日新番内容

obj2 = re.compile(r'"is_today":1.*?}]}',re.S)
today_list = obj2.findall(page_content)
# print(today_list)
today_str = "".join(today_list)

obj3 = re.compile(r'"pub_index":"(?P<index>.*?)","pub_time":"(?P<time>.*?)".*?'
                 r'"square_cover":"(?P<cover>.*?)","title":"(?P<title>.*?)","url":"(?P<url>.*?)"',re.S)
result = obj3.finditer(today_str)

for it in result:
    # day = it.group('day')
    # week = it.group('week')
    index = it.group('index')
    time = it.group('time')
    cover = it.group('cover')
    title = it.group('title')
    url = it.group('url')
    print(title,"·",index,"·","播放时间:",time,"播放地址:",url)

(3)释放访问请求

resp.close()  # 关掉resp

(三)效果

在这里插入图片描述

三、第二个程序:爬取bilibili正在直播的up主列表

(一)嗅探

目的:
爬取关注的up谁正在直播,直播间标题以及直播间地址
目标网页
在这里插入图片描述

F12打开网页响应的网络一栏,再刷新一下页面
在这里插入图片描述

可以看到w_live_users里面有我们需要的信息(size是参数,可以修改)
接下来只需要定位就行了,比较简单

(二)代码

老规矩,先导入request和re库

// 导入库
import requests
import re

再看一下请求得到的网站响应内容

domain = "https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_live_users"
headers = {
    # "cookie": "",# 这里要加自己的cookie
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 Edg/89.0.774.68"
}
param = {
    "size": "200"# 这个参数控制最多显示多少个up主
}
resp = requests.get(domain, params=param, headers=headers)  # verify=False 去掉安全验证
page_content = resp.text
# print(page_content)

编写正则表达式

obj1 = re.compile(r'"uname":"(?P<name>.*?)","face":"(?P<face>.*?)","link":"(?P<link>.*?)","title":"(?P<title>.*?)"}', re.S)
obj2 = re.compile(r'"count":(?P<num>.*?),', re.S)

result1 = obj2.search(page_content)
print("\n当前共有",str(result1.group("num")),"个up主在直播:\n")

result2 = obj1.finditer(page_content)
for it in result2:
    name = it.group('name')
    face = it.group('face')
    link = it.group('link')
    title = it.group('title')
    print("up主:","\033[1;36m%s\033[0m"%(name),"标题:","\033[1;33m%s\033[0m"%(title),"%s"%(link))

(3)释放访问请求

resp.close()  # 关掉resp

(三)效果

在这里插入图片描述

四、第三个程序:爬取up主最新更新视频动态

(一)嗅探

目的:
(1)爬取关注的up最新更新的视频列表
(2)获取up主名字、视频标题、视频地址、投稿日期(精确到秒)
(3)同时获得当前的播放量、弹幕数、评论数、点赞数、投币数、收藏数、转发数和不喜欢数
目标网页
在这里插入图片描述

F12打开网页响应的网络一栏,再刷新一下页面
在这里插入图片描述

可以看到dynamic_new里面有我们需要的信息(?后面的是参数,可以修改)
需要的信息比较多,因此展示的时候要注意格式

(二)代码

老规矩,先导入request和re库,注意,这里需要一个额外的time库,用于将时间戳转换成现在的时间

// 导入库
import requests
import re
import time

再看一下请求得到的网站响应内容

domain = "https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new"
headers = {
    # "cookie": "",# 这里加自己的cookie
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 Edg/89.0.774.68"
}

param = {
    # "uid":"",# 填一下自己的uid,好像随便填也不影响?似乎cookie更重要
    "type_list":8,
    "from":"",
    "platform":"web",
}
resp = requests.get(domain, params=param, headers=headers)  # verify=False 去掉安全验证
page_content = resp.text
# print(page_content)

编写正则表达式

obj = re.compile(r'"uname":"(?P<name>.*?)".*?"bvid":"(?P<bvid>.*?)".*?"pubdate\\":(?P<pubdate>.*?),.*?'
                  r'"coin\\":(?P<coin>.*?),\\"danmaku\\":(?P<danmaku>.*?),\\"dislike\\":(?P<dislike>.*?),\\"favorite\\":(?P<favorite>.*?),.*?\\'
                  r'"like\\":(?P<like>.*?),.*?"reply\\":(?P<reply>.*?),\\"share\\":(?P<share>.*?),\\'
                  r'"view\\":(?P<view>.*?)},.*?"title\\":\\"(?P<title>.*?)\\".*?', re.S)
result = obj.finditer(page_content)
for it in result:
    name = it.group('name')
    date = it.group('pubdate')
    title = it.group('title')
    coin = it.group('coin')
    danmaku = it.group('danmaku')
    dislike = it.group('dislike')
    favorite = it.group('favorite')
    like = it.group('like')
    reply = it.group('reply')
    share = it.group('share')
    view = it.group('view')
    bvid = it.group('bvid')

    url = "https://www.bilibili.com/video/"+bvid

    timeStamp = float(date)
    timeArray = time.localtime(timeStamp)
    otherStyleTime = time.strftime("%Y.%m.%d %H:%M:%S", timeArray)

    print("\n",otherStyleTime,"\n","up主:","\033[1;36m%s\033[0m"%(name),"标题:","\033[1;33m%s\033[0m"%(title),url,"\n",
          "\033[1;34m播放量\033[0m:",view,"\033[1;34m弹幕数\033[0m:",danmaku,"\033[1;34m评论数\033[0m:",reply,"\n",
          "\033[1;32m点赞\033[0m:",like,"\033[1;32m投币\033[0m:",coin,
          "\033[1;32m收藏\033[0m:",favorite,"\033[1;32m转发\033[0m:",share,"\033[1;32m不喜欢\033[0m:",dislike
          )

(3)释放访问请求

resp.close()  # 关掉resp

(三)效果

在这里插入图片描述

五、总结与说明

说明1:cookie的获取

目标网址→F12→网络→选左边你关注的内容→标头→请求标头→cookie

ps:cookie存在有效期,但有的cookie有效期很长,有的就很短,我借用我两个朋友的cookie,其中一个到现在还能用,而另一个朋友的cookie在第二天就会无效,他说他也没有主动清除过cookie,就很迷= =。

说明2:时间戳转换

bilibili视频发布时间使用的是10位的时间戳,时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

总结

通过挖掘网页信息可以得到很多有意思的消息,比如投稿的具体时间,在动态主页上就只会显示“刚刚”、“XX小时前”这样的字样,我还在这里面找到了b站的隐藏广告(在网站上不显示),以及得知它最多有七个栏位…
在这里插入图片描述
以及直播间礼物大全,好多我听都没听过
在这里插入图片描述

以上是我个人学习python爬虫的成果,转载请注明出处,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值