saltorsugar 2021-11-30 09:56 采纳率: 66.7%
浏览 44
已结题

关于b站视频排行榜各视频数据的正则表达式

想做个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,纯粹是依葫芦画瓢的。

  • 写回答

2条回答 默认 最新

  • Syb呀呀 2021-11-30 12:00
    关注

    可以直接用正则,不需要去解析
    正则代码如下

    import re
    import requests
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
    
    url='https://www.bilibili.com/v/popular/rank/all'
    res=requests.get(url,headers=headers)
    # print(res.text)
    
    title=re.findall('class="title">(.*?)</a> <!----> <div class="detail"',res.text)
    href=re.findall('<div class="info"><a href="//(.*?)" target="_blank"',res.text)
    all_sorce=re.findall('</span></a></div> <div class="pts"><div>(.*?)</div>',res.text)
    
    for i in range(len(title)):
         print('标题为:',title[i])
         print('链接为:',href[i])
         print('综合得分为:',all_sorce[i])
         print('----------分割线----------')
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月8日
  • 已采纳回答 11月30日
  • 创建了问题 11月30日

悬赏问题

  • ¥15 h3.6m 人类行为预测论文复现
  • ¥50 wordpress项目注册报失败刷新后其实是成功状态,请求排查原因
  • ¥20 linxu服务器僵尸进程不释放,代码如何修改?
  • ¥15 pycharm激活不成功
  • ¥40 如果update 一个列名为参数的value
  • ¥15 基于51单片机的水位检测系统设计中LCD1602一直不显示
  • ¥15 OCS2安装出现问题,请大家给点意见
  • ¥15 ros小车启动launch文件报错
  • ¥15 vs2015到期想登陆但是登陆不上
  • ¥15 IPQ5018制作烧录固件,boot运行失败(操作系统-linux)(相关搜索:操作系统)(相关搜索:操作系统)