想做个b站爬虫,在社区老哥的帮助下解决了视频链接获取的问题,但想再用正则表达式获取标题的时候,得到的却是作者空间的链接。
这个爬虫基本思路是利用bs4获取页面的html代码,然后正则表达式提取信息。
这个是b站视频的html代码
<li data-id="421946246" data-rank="1" class="rank-item"><div class="num">1</div> <div class="content"><div class="img"><a href="//www.bilibili.com/video/BV1N3411b7Bo" target="_blank"><img class="lazy-image cover" data-src="//i0.hdslb.com/bfs/archive/4b49d94599d2aff64e76e5a8e1f7bb38ff195b61.jpg@228w_140h_1c.webp" src="//i0.hdslb.com/bfs/archive/4b49d94599d2aff64e76e5a8e1f7bb38ff195b61.jpg@228w_140h_1c.webp" lazy="loaded"></a> <div class="w-later van-watchlater"><span class="wl-tips" style="display:none;"></span></div></div> <div class="info"><a href="//www.bilibili.com/video/BV1N3411b7Bo" target="_blank" class="title">离大谱!随机帮别人实现梦想,竟然跑断了腿(物理)!</a> <!----> <div class="detail"><span class="data-box"><i class="b-icon play"></i>
566.4万
</span> <span class="data-box"><i class="b-icon view"></i>
8.3万
</span> <a target="_blank" href="//space.bilibili.com/546195"><span class="data-box up-name"><i class="b-icon author"></i>
老番茄
</span></a></div> <div class="pts"><div>9317813</div>综合得分
</div></div> <div class="other-panel"><div class="other"><a target="_blank" href="//www.bilibili.com/video/BV1Bi4y1o7uj" class="other-link"><span class="title">好兄弟是什么,能吃吗?</span> <span>综合评分</span> <strong>2733969</strong></a></div> <a class="more-data" style="display:none;">
显示UP主全部上榜视频
<i></i></a></div></div></li>
这是我的python代码
import sys
import re
import urllib.request
import xlwt
from bs4 import BeautifulSoup
#正则表达式定义筛选规则
findLink=re.compile(r'<a href="//(.*?)" target="_blank">.*?</a>',re.S)#视频链接
#获取对应url网页的数据
def get_url(url):
head = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34"}#模拟计算机
request = urllib.request.Request(url,headers=head)#以headers身份访问url网页
html=''
try:
reponse = urllib.request.urlopen(request)
html = reponse.read().decode('utf-8')
except urllib.error.URLError as e:
if hasattr(e,'code'):
print(e.code)
if hasattr(e,'reason'):
print(e.reason)
return html
#调用get_url函数获取指定网页数据,以html形式存储
def get_data(baseurl):
data_list=[]
html=get_url(baseurl)#获取get_url爬到的数据
soup=BeautifulSoup(html,'html.parser')#定义使用html解读器解读数据的变量soup
for item in soup.find_all('div',class_="content"):
data=[]#存储单个视频全部信息
item=str(item)#字符串化
link=re.findall(findLink,item)[0]#视频链接
data.append(link)
authorlink=re.findall(findLink,item)[1]#作者链接(原本想获取标题)
data.append(authorlink)
data_list.append(data)#保存数据
print(data_list)
return data_list
get_data('https://www.bilibili.com/v/popular/rank/all')
以及问一下,排行榜里的其他信息有办法用正则表达式写出来吗?鄙人没学过html,纯粹是依葫芦画瓢的。