首先我们导入两个包
from bs4 import BeautifulSoup
import requests
如果你没有第一行的包,那么在PyCharm编译器中的话,只要将鼠标移到那上面去就会弹出个提示框,选择前面有Install的一行蓝字,点击它就能下载回来了。
然后我们准备一个字符串,里面存着我们要借助b站引擎搜索的关键字
我这里准备了一行字符串,用它搜索只会有一个视频出现:
userSeach='【迷你摩托】张本智和(11岁)VS谭瑞午/Jens'
然后我们准备如下字符串:https://search.bilibili.com/all?keyword=
后面需要追加我们的搜索关键字
然后我们用以下代码,让b站的搜索引擎帮助我们搜索我们需要的相关视频,并返回搜索页
mainUrl='https://search.bilibili.com/all?keyword='+userSeach
mainSoup = BeautifulSoup(requests.get(mainUrl).text, "html.parser")
此时,mainSoup 中存储的就是搜索结果页面的整个页面的html代码
由于我们考虑到搜索到的视频可能很多,所以会产生分页,所以我们这里先通过网页中的一段代码来看看我们的搜索结果一共有多少页的结果。
首先点击这里
随后我们按Ctrl+F打开搜索框,输入下一页进行搜索,可以看见下图的箭头位置有个50,那预示着最大页数是50。
他周围的样式有个最特别且唯一的,那就是一个样式为page-item last的li标签
我们应用以下代码锁定他,从而获得这个对象,并将它暂时赋值给pages
(剩下内容不再阐述如何根据标签锁定数据所在地)
pages=mainSoup.find('li',class_="page-item last")
值得注意的是,如果搜索结果不存在或者只有一页,你是找不到这个
所以考虑到这种情况,我们在上面的代码的基础上,将代码写成:
pages=mainSoup.find('li',class_="page-item last")
if(pages):
pages=int(pages.text)
else:
pages=1
通过判断pages是否为空,可以分开两种情况,并处理。
第一种情况就是有多少页数给多少页数
第二种情况则是设置为只有一页
之后我们设置while来遍历所有的结果页,在此之前,我们先了解下如何换页:
当我点开了第二页,发现地址栏上多出了一小段字符串,明显的,它就是用来换页的。
那么,这个循环的基础代码就写成:
while page<=pages:
mainUrl='https://search.bilibili.com/all?keyword='+userSeach+'&page='+page.__str__()
mainSoup = BeautifulSoup(requests.get(mainUrl).text, "html.parser")
...待写...
page+=1
这里的page是当前页数,初始值为1
这样子,这个循环就能遍历所有结果页了
然后我们正式进入获取视频信息的环节
我们用一个viedoNum变量(初始值为0)来表示这是第几个被获取的视频
val临时变量来存储一个对象,避免重复查找,浪费时间
我们可以从搜索页上直接获取的信息有:
while page<=pages:
mainUrl='https://search.bilibili.com/all?keyword='+userSeach+'&page='+page.__str__()
mainSoup = BeautifulSoup(requests.get(mainUrl).text, "html.parser")
for item in mainSoup.find_all('li',class_="video-item matrix"):
viedoNum += 1
print('第'+ viedoNum.__str__() + '个视频:')
val=item.find('a',class_="img-anchor")
print('视频标题:'+ val["title"])
print('视频链接:'+'https:'+val["href"])
print('视频简介:'+item.find('div',class_="des hide").text.strip())
print('up主:'+ item.find('a',class_="up-name").text.strip())
print('视频观看量:'+ item.find('span',title='观看').text.strip())
print('弹幕量:'+ item.find('span',title='弹幕').text.strip())
print('上传时间:'+ item.find('span',title='上传时间').text.strip())
page+=1
由于视频图片是js动态获取的,所以我们没办法在搜索结果页上直接获取
所以我们得进去相关页面内才能获取视频图片
那么,结合上面的代码,继续写下去有:
subUrl=val["href"];
subSoup = BeautifulSoup(requests.get('https:'+subUrl).text.strip(), "html.parser")
print('视频图片:'+subSoup.find(itemprop="image")["content"])
于是,视频图片也到手了。
最终结果图是:
关键字是:【迷你摩托】张本智和(11岁)VS谭瑞午/Jens
关键字是:java
PS:你可能注意到了部分中文没有显示,但这只是编译器自己的显示问题,实际上,如果你复制那串疑似消失的字符串到外面再粘贴,那些字都是有且完整的。
完整代码:
from bs4 import BeautifulSoup
import requests
userSeach='【迷你摩托】张本智和(11岁)VS谭瑞午/Jens'
page=1
viedoNum=0
val=0
mainUrl='https://search.bilibili.com/all?keyword='+userSeach
mainSoup = BeautifulSoup(requests.get(mainUrl).text, "html.parser")
pages=mainSoup.find('li',class_="page-item last")
if(pages):
pages=int(pages.text)
else:
pages=1
while page<=pages:
mainUrl='https://search.bilibili.com/all?keyword='+userSeach+'&page='+page.__str__()
mainSoup = BeautifulSoup(requests.get(mainUrl).text, "html.parser")
for item in mainSoup.find_all('li',class_="video-item matrix"):
viedoNum += 1
print('第'+ viedoNum.__str__() + '个视频:')
val=item.find('a',class_="img-anchor")
print('视频标题:'+ val["title"])
print('视频链接:'+'https:'+val["href"])
print('视频简介:'+item.find('div',class_="des hide").text.strip())
print('up主:'+ item.find('a',class_="up-name").text.strip())
print('视频观看量:'+ item.find('span',title='观看').text.strip())
print('弹幕量:'+ item.find('span',title='弹幕').text.strip())
print('上传时间:'+ item.find('span',title='上传时间').text.strip())
subUrl=val["href"];
subSoup = BeautifulSoup(requests.get('https:'+subUrl).text.strip(), "html.parser")
print('视频图片:'+subSoup.find(itemprop="image")["content"])
page+=1