[爬虫] B站番剧信息爬取

本文介绍了一种使用Python和Scrapy框架抓取Bilibili网站番剧信息的方法,包括番剧基本信息、参数信息及时间信息。通过分析页面结构,获取动态渲染数据,实现了番剧评论数、评分及类型的爬取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

申明:本文对爬取的数据仅做学习使用,不涉及任何商业活动,侵删

简述

本次爬取目标是:

  1. 番剧的基本信息(名字, 类型, 集数, 连载or完结, 链接等)
  2. 番剧的参数信息(播放量, 点赞, 投币, 追番人数等)
  3. 时间信息(开播时间, 完结时间)
前提条件
  1. 编程语言: Python 3
  2. 爬虫框架: Scrapy 1.6.0
  3. 编译器: Pycharm
  4. 平台: Windows

Scrapy安装参考文档:windows / linux

一丶页面分析

番剧索引页展示的番剧信息属于动态渲染, 因此要通过获取页面响应来得到我们想要的数据, 按F12到Network中找我们需要的响应数据:
在这里插入图片描述在这里插入图片描述
来分析一下Request URL, 先无事其他的参数, 来看我们最需要的一部分: page=1&...&pagesize=20

  • page:表示当前页码
  • pagesize:表示页面展示的番剧数

可以尝试访问Request URL, 来确认可以拿到我们需要的数据:
在这里插入图片描述
这一个请求并不能满足需求, 跟进番剧页链接, 并继续找响应数据:
在这里插入图片描述
在这里插入图片描述
几乎所有的数据都被我们得到了, 但唯独缺一个番剧类型
跟进番剧简介网址:https://www.bilibili.com/bangumi/media/md102392, 这是一个静态页面, 可以直接从响应中获取到我们需要的信息:
在这里插入图片描述
完成可数据源的分析, 接下来开始写代码

二丶创建爬虫
  1. 打开cmd控制台,然后cd+路径,移动到到期望的目录中,使用命令创建项目 scrapy startproject bilibili_spider,bilibili_spider为项目名称,创建完成后会自动生成下列文件:
    • bilibili_spider
      • __init__.py
      • scrapy.cfg #项目部署的配置文件
      • bilibili_spider #项目目录, 包含了项目运行相关的文件
        • __init__.py
        • items.py #项目的目标文件
        • middlewares.py #项目的中间件文件
        • pipelines.py #项目的管道文件
        • settings.py #项目的设置文件
        • spiders #项目的爬虫目录
          • __init__.py
  2. 创建爬虫文件,到bilibili_spider\bilibili_spider\spiders目录下,运行命令:scrapy genspider bilibili bilibili.com,bilibili是爬虫文件的名称,后面是目标网站的域名, 由于本次爬取涉及的站点较多, 这里可以将www省略掉, 以避免出错
items.py

进入items.py文件中设置爬取的目标,基于python之禅简单生于复杂, 我将上述最后两次请求合并到一个, 即从番剧详情页获取评论数和评分

import scrapy

class BilibiliSpiderItem(scrapy.Item):
    # 索引页的ajax 可以获得以下信息:
    season_id = scrapy.Field()      # 番剧编号
    media_id = scrapy.Field()       # 媒体编号
    title = scrapy.Field()          # 标题
    index_show = scrapy.Field()     # 集数
    is_finish = scrapy.Field()      # 是否完结
    video_link = scrapy.Field()     # 链接
    cover = scrapy.Field()          # 封面图
    pub_real_time = scrapy.Field()  # 真实发布日期
    renewal_time = scrapy.Field()   # 最近更新日期

    # 番剧信息的ajax请求:
    favorites = scrapy.Field()      # 追番
    coins = scrapy.Field()          # 硬币
    views = scrapy.Field()          # 播放量
    danmakus = scrapy.Field()       # 弹幕

    # 番剧详情页的ajax请求:
    cm_count = scrapy.Field()       # 评论数
    score = scrapy.Field()          # 评分
    media_tags = scrapy.Field()     # 类型标签
爬虫文件
# -*- coding: utf-8 -*-
import json
from datetime import datetime
import scrapy
from scrapy.spiders import CrawlSpider
from bilibili_video.items import BilibiliSpiderItem


class BilibiliSpider(CrawlSpider):
    name = 'bilibili'
    allowed_domains = ['bilibili.com']

    # 索引页的ajax
    request_url = 'https://bangumi.bilibili.com/media/web_api/search/result?page={}&season_type=1&pagesize=20'
    page = 1
    start_urls = [request_url.format(page)]

    # 番剧信息的ajax请求
    season_url = 'https://bangumi.bilibili.com/ext/web_api/season_count?season_id={}&season_type=1&ts={}'

    # 番剧详情页的ajax请求
    media_url = 'https://www.bilibili.com/bangumi/media/md{}'

    def parse(self, response):
        # if self.page == 2:  # 限制爬取页数,用于测试爬取状态
        #     return
        list_data = json.loads(response.text).get('result').get('data')
        if list_data is None:  # 如果响应中没有数据,则结束执行
            return

        for data in list_data:
            ts = datetime.timestamp(datetime.now())
            yield scrapy.Request(url=self.season_url.format(data.get('season_id'), ts),
                                 callback=self.parse_details,
                                 meta=data)
        self.page += 1  # 生成下一页的请求
        yield scrapy.Request(url=self.request_url.format(self.page),
                             callback=self.parse)

    def parse_details(self, response):
        item = BilibiliSpiderItem()

        meta_data = response.meta
        item['season_id'] = meta_data.get('season_id')
        item['media_id'] = meta_data.get('media_id')
        item['title'] = meta_data.get('title')
        item['index_show'] = meta_data.get('index_show')
        item['is_finish'] = meta_data.get('is_finish')
        item['video_link'] = meta_data.get('link')
        item['cover'] = meta_data.get('cover')
        item['pub_real_time'] = meta_data.get('order').get('pub_real_time')
        item['renewal_time'] = meta_data.get('order').get('renewal_time')

        resp_data = json.loads(response.text).get('result')
        item['favorites'] = resp_data.get('favorites')
        item['coins'] = resp_data.get('coins')
        item['views'] = resp_data.get('views')
        item['danmakus'] = resp_data.get('danmakus')
        yield scrapy.Request(url=self.media_url.format(item['media_id']),
                             callback=self.parse_media,
                             meta=item)

    def parse_media(self, response):
        item = response.meta

        resp = response.xpath('//div[@class="media-info-r"]')
        item['media_tags'] = resp.xpath('//span[@class="media-tags"]/span/text()').extract()
        item['score'] = resp.xpath('//div[@class="media-info-score-content"]/text()').extract()[0]
        item['cm_count'] = resp.xpath('//div[@class="media-info-review-times"]/text()').extract()[0]
        yield item

项目源码链接:https://github.com/zhanghao19/bilibili_spider

Python爬虫抓取B(哔哩哔哩)的所有信息通常需要通过网络请求获取B的HTML页面数据,然后解析其中包含的信息。这个过程涉及到的主要步骤有: 1. **安装必要的库**:使用如requests库发起HTTP请求,BeautifulSoup或lxml库用于HTML解析,以及可能的cookies处理(如果需要登录才能访问某些内容)。 ```python pip install requests beautifulsoup4 lxml ``` 2. **模拟登录(可选)**:如果你计划爬取需要登录权限的内容,首先需要登录并获取cookie或session信息。 3. **分析网页结构**:研究B列表页的HTML结构,找到包含信息的元素标签,如标题、链接等。 4. **编写爬虫脚本**: ```python import requests from bs4 import BeautifulSoup def get_bilibili_fanshu(): url = 'https://bangumi.bilibili.com/web_api/tv/top' # 首页API地址 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, 'lxml') # 解析并提取信息 for item in soup.find_all('li', class_='item'): title = item.find('a', class_='title')['title'] link = f'https://www.bilibili.com/bangumi/play/{item.find("a", class_="title")["data-bvid"]}' print(f"标题: {title}") print(f"链接: {link}\n") get_bilibili_fanshu() ``` 5. **注意法律限制**:在实际操作中,你需要遵守B的使用协议,并尊重版权。频繁大量抓取可能会导致封IP,因此最好设置延时或者使用代理池。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值