爬虫实战:爬取bilibiliTop100条热门视频信息

爬取bilibiliTop100条热门视频信息

对于信息的爬取可以分为三个步骤进行处理,分别是获取网页、获取和解析数据最后保存数据。于是我们的主函数的框架如下:

def main():
#     1. 获取网页
    baseurl = "https://www.bilibili.com/v/popular/rank/all"
#     2. 获取和解析数据
    datalist = getData(baseurl)
#     3. 保存数据
    savepath = "./B站热门视频.xls"
    saveData(datalist,savepath)

爬虫毕竟是爬虫在它进行网页的访问的时候一般不能够直接进行访问,需要进行一定的伪装,伪装的信息可以通过Fn+F12查看。

以上URL是我们目标爬取网址,访问的方式也可以看到是GET,为了进行伪装,需要得到访问网页的正式信息,我们继续查看信息,可以看到以下:

在这里插入图片描述

这里我们选取user-agent和cookies这两条信息(伪装的信息越多越好),user-agent其实是游览器的版本信息,cookies是用户的信息(非常重要,没有会被反扒)。

def askURL(url):
      head = {
        "user-agent" : "Mozilla / 5.0(Windows NT 10.0;WOW64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 88.0.4324.104 Safari / 537.36",
        "referer" : "https: // www.bilibili.com /",
        "cookie": "_uuid = DFE59F2A - D16B - 327E - D501 - 9CA14392FF8059467infoc;buvid3 = 0041FC1C - 2C18 - 4DDE - 965F - 9DEF43D88176155809infoc;rpdid = | (YYR~ | uklm0J'ul))u~JRuJ; sid=9n9kd7a4; LIVE_BUVID=AUTO2815885539756041; blackside_state=1; CURRENT_FNVAL=80; PVID=1; CURRENT_QUALITY=80; DedeUserID=434641640; DedeUserID__ckMd5=1b9357ca56a49330; SESSDATA=ab62e58a%2C1619879365%2C80832*b1; bili_jct=01ecd2f4c1f3d0e94aa31b03a7bea6ec; bp_t_offset_434641640=491560557515702800; bp_video_offset_434641640=491834756822300005; finger=1777945899"
    }
    request = urllib.request.Request(url,headers = head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.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

在获取完网页的解析后的html文件之后,然后就是对你需要的信息进行筛选,通过观察信息的结构先进行定位,定位之后在通过正则表达式再次进行信息的筛选。

可以通过以下的方式获取需要的信息的特征,比如我需要得到B站热门视频的每条视屏的信息:

在这里插入图片描述

以下就是对应的模块的代码信息:

在这里插入图片描述

找寻的方式有很多,比如你可以用li行进寻找,每一个li都对应着一个热门视频信息。但其实发现在所有内容中只有在这个模块中div对应的class是content,于是我们可以用一下的方式进行寻找:

html = askURL(baseurl)

soup = BeautifulSoup(html, "html.parser") 

soup.find_all("div",class_="content")

在确定每个视频的位置之后,就只需要在获得的代码中进一步筛选,比如需要在这个模块中找出排名、链接、名字、播放量、评论数、综合得分等等…

那就意味着,我们需要对每一个你需要得到的信息进行特征的提取,然后再是筛选出信息,这里就需要用到正则表达式:

findLink = re.compile(r'<a href="(.*?)" target="_blank">')
findName = re.compile(r'<a class="title" href=".*?" target="_blank">(.*)</a>')
findPlay = re.compile(r'<span class="data-box"><i class="b-icon play"></i>(.*?)</span>',re.S)
findView = re.compile(r'<span class="data-box"><i class="b-icon view"></i>(.*?)</span>',re.S)
findUP = re.compile(r'<span class="data-box up-name"><i class="b-icon author"></i>(.*?)</span>',re.S)
findGrades = re.compile(r'<div class="pts"><div>(.*?)</div>')

以上是通过观察源代码,发现每条信息的特征,然后用正则表达式表示这种特征,于是我们有以下获取信息的代码:

def getData(baseurl):
    datalist = []
    html = askURL(baseurl)
    # print(html)
    soup = BeautifulSoup(html, "html.parser")  # 形成树形结构对象
    for item in soup.find_all("div",class_="content"):
        # print(item)
        data = []
        item = str(item)
        # 视频链接
        link = re.findall(findLink,item)[0]
        data.append(link)
        # 视频名字
        name = re.findall(findName,item)[0]
        data.append(name)
        # 播放量
        play = re.findall(findPlay,item)[0]
        # print(play)
        data.append(play)
        # 评论数
        view = re.findall(findView,item)[0]
        # print(view)
        data.append(view)
        # UP个人空间链接
        uplink = re.findall(findLink,item)[1]
        # print(uplink)
        data.append(uplink)
        # UP主
        UP = re.findall(findUP,item)[0]
        # print(UP)
        data.append(UP)
        # 综合得分
        grades = re.findall(findGrades,item)[0]
        # print(grades)
        data.append(grades)
        datalist.append(data)

    return datalist

在获取完数据之后,就需要对数据进行保存,可以直接用表格保存,这样方便,也可以用数据库保存。

def saveData(datalist,savepath):
    book = xlwt.Workbook(encoding="utf-8")
    sheet = book.add_sheet("B站热门",cell_overwrite_ok=True)
    col = ("排名","视频链接","视频名字","播放量","评论数","UP个人空间链接","UP主","综合得分")
    for i in range(0,8):
        sheet.write(0,i,col[i])
    for i in range(0,100):
        print("第%d条"%i)
        data = datalist[i]
        sheet.write(i+1,0,i+1)
        # print(data)
        for j in range(0,7):
            sheet.write(i+1,j+1,data[j])

    book.save(savepath)  # 保存数据表

那么以上就完成了整个信息爬取的过程,以下贴上全部代码:

from bs4 import BeautifulSoup           #网页解析,获取数据
import re                               #正则表达式,进行文字匹配
import urllib.request,urllib.error      #指定URL,获取网页数据
import xlwt                             #进行excel操作

def main():
#     1. 获取网页
    baseurl = "https://www.bilibili.com/v/popular/rank/all"
#     2. 获取和解析数据
    datalist = getData(baseurl)
#     3. 保存数据
    savepath = "./B站热门视频.xls"
    saveData(datalist,savepath)

findLink = re.compile(r'<a href="(.*?)" target="_blank">')
findName = re.compile(r'<a class="title" href=".*?" target="_blank">(.*)</a>')
findPlay = re.compile(r'<span class="data-box"><i class="b-icon play"></i>(.*?)</span>',re.S)
findView = re.compile(r'<span class="data-box"><i class="b-icon view"></i>(.*?)</span>',re.S)
findUP = re.compile(r'<span class="data-box up-name"><i class="b-icon author"></i>(.*?)</span>',re.S)
findGrades = re.compile(r'<div class="pts"><div>(.*?)</div>')


def getData(baseurl):
    datalist = []
    html = askURL(baseurl)
    # print(html)
    soup = BeautifulSoup(html, "html.parser")  # 形成树形结构对象
    for item in soup.find_all("div",class_="content"):
        # print(item)
        data = []
        item = str(item)
        # 视频链接
        link = re.findall(findLink,item)[0]
        data.append(link)
        # 视频名字
        name = re.findall(findName,item)[0]
        data.append(name)
        # 播放量
        play = re.findall(findPlay,item)[0]
        # print(play)
        data.append(play)
        # 评论数
        view = re.findall(findView,item)[0]
        # print(view)
        data.append(view)
        # UP个人空间链接
        uplink = re.findall(findLink,item)[1]
        # print(uplink)
        data.append(uplink)
        # UP主
        UP = re.findall(findUP,item)[0]
        # print(UP)
        data.append(UP)
        # 综合得分
        grades = re.findall(findGrades,item)[0]
        # print(grades)
        data.append(grades)
        datalist.append(data)

    return datalist



def saveData(datalist,savepath):
    book = xlwt.Workbook(encoding="utf-8")
    sheet = book.add_sheet("B站热门",cell_overwrite_ok=True)
    col = ("排名","视频链接","视频名字","播放量","评论数","UP个人空间链接","UP主","综合得分")
    for i in range(0,8):
        sheet.write(0,i,col[i])
    for i in range(0,100):
        print("第%d条"%i)
        data = datalist[i]
        sheet.write(i+1,0,i+1)
        # print(data)
        for j in range(0,7):
            sheet.write(i+1,j+1,data[j])

    book.save(savepath)  # 保存数据表



def askURL(url):
    head = {
        "user-agent" : "Mozilla / 5.0(Windows NT 10.0;WOW64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 88.0.4324.104 Safari / 537.36",
        "referer" : "https: // www.bilibili.com /",
        "cookie": "_uuid = DFE59F2A - D16B - 327E - D501 - 9CA14392FF8059467infoc;buvid3 = 0041FC1C - 2C18 - 4DDE - 965F - 9DEF43D88176155809infoc;rpdid = | (YYR~ | uklm0J'ul))u~JRuJ; sid=9n9kd7a4; LIVE_BUVID=AUTO2815885539756041; blackside_state=1; CURRENT_FNVAL=80; PVID=1; CURRENT_QUALITY=80; DedeUserID=434641640; DedeUserID__ckMd5=1b9357ca56a49330; SESSDATA=ab62e58a%2C1619879365%2C80832*b1; bili_jct=01ecd2f4c1f3d0e94aa31b03a7bea6ec; bp_t_offset_434641640=491560557515702800; bp_video_offset_434641640=491834756822300005; finger=1777945899"
    }
    request = urllib.request.Request(url,headers = head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.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




if __name__ == "__main__":  #程序执行时
    #调用函数
    main()
    print("爬取完毕!")
  • 12
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 您好,B站热门视频信息需要模拟浏览器发送请求并解析返回的HTML页面,可以使用Python中的第三方库requests和BeautifulSoup来实现。以下是示例代码: ```python import requests from bs4 import BeautifulSoup url = 'https://www.bilibili.com/v/popular/rank/all' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') video_list = soup.select('.rank-item') for video in video_list: title = video.select('.title')[0].get('title') link = 'https:' + video.select('.title')[0].get('href') play_count = video.select('.data-box > span')[0].get_text() print(title, link, play_count) ``` 运行代码即可输出排名前100的视频的标题、链接和播放量。注意,为了避免被B站反爬虫机制封禁IP,需要设置headers中的User-Agent为一个浏览器的User-Agent。 ### 回答2: Bilibili Top100条热门视频信息可以通过编程语言和网络爬虫实现。以下是一个大致的步骤: 1. 确定的目标网页:在Bilibili网站上找到Top100热门视频的排行榜页面。 2. 分析网页结构:打开排行榜页面,并使用浏览器的开发者工具分析网页结构,包括标签、类名和选择器等关键信息。 3. 编写代码:使用合适的编程语言(如Python)和网络爬虫框架(如Requests和BeautifulSoup)编写代码,以获网页的HTML内容。 4. 解析网页内容:使用BeautifulSoup等工具解析HTML内容,提出需要的信息,如视频标题、链接、播放量、评论数等。 5. 存储数据:将提视频信息存储在数据容器中,可以选择存储在内存、文本文件、数据库等合适的数据结构中。 6. 循环:通过修改URL或翻页操作,循环获Top100热门视频信息,直到获完所有数据或达到设定的数量。 7. 分析和应用:对到的数据进行分析、挖掘和处理,根据需求进行相关的应用开发,如统计不同类型视频的数量、计算热门视频的关注度等。 值得注意的是,进行网络爬虫操作时应尊重网站的规则和遵守法律法规,不要过于频繁地请求,以免给网站带来压力和不必要的麻烦。 ### 回答3: 要Bilibili Top100条热门视频信息,可以使用Python编程语言结合爬虫框架进行实现。 首先,我们可以选择使用Selenium库模拟浏览器行为来加载Bilibili的网页。安装Selenium库后,可以使用以下代码启动一个浏览器并打开Bilibili的Top100视频排行榜页面: ```python from selenium import webdriver # 创建一个Chrome浏览器实例 driver = webdriver.Chrome() # 打开Bilibili Top100视频排行榜页面 driver.get('https://www.bilibili.com/v/popular/rank/all') ``` 接下来,可以通过查看页面源代码以及分析页面结构,找到包含热门视频信息的HTML元素,并使用XPath或CSS选择器来定位这些元素。例如,可以使用以下代码获视频标题和播放量: ```python # 使用XPath获视频标题和播放量 video_titles = driver.find_elements_by_xpath('//li[@class="rank-item"]/a[@class="title"]/text()') play_counts = driver.find_elements_by_xpath('//li[@class="rank-item"]/div[@class="detail"]/span[@class="data-box"]/span[1]/text()') # 打印视频标题和播放量 for title, count in zip(video_titles, play_counts): print(title, count) ``` 上述代码通过XPath定位到每个视频的标题和播放量元素,并将它们分别存储在`video_titles`和`play_counts`中。然后,可以使用循环逐个打印出来。 最后,记得完成后关闭浏览器实例,释放资源: ```python # 关闭浏览器实例 driver.quit() ``` 通过以上步骤,就可以Bilibili Top100条热门视频信息了。可以根据需要进一步完善代码,比如获更多信息视频链接、封面图等。另外,网页时应注意网站的反爬虫机制,避免频繁请求而被封禁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

call me Patrick

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值