目录
一、前言
本代码参考学习了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爬虫的成果,转载请注明出处,谢谢