爬虫之牛刀小试(四):爬取B站番剧的简介

news2024/9/21 12:42:47

今天爬取的是b站。

如何爬取b站中的番剧呢?
在这里插入图片描述
首先我们来到番剧索引中,随便点开一部动漫,检查代码。

每个作品对应一个链接: https://www.bilibili.com/bangumi/play/ss…(ss后面的数字称为ss号)
在这里插入图片描述
发现关于动漫的信息在这里

‘script’, id=“NEXT_DATA
在这里插入图片描述
关键是如何获取ss号?

随便乱找一下,发现有media_id,于是点进去看一下
在这里插入图片描述
在这里插入图片描述
于是肯定了对应的api接口:api.bilibili.com /pgc/review/user?media_id=…&ts=…

这样子就解决了如何爬取每部番剧的网址了。

在这里插入图片描述
获取每部番剧的title和url就行,接着只要匹配获取简介的内容就行了。

其返回的是一个json字典。
在这里插入图片描述
我们只要选出我们感兴趣的内容,比如配音演员,硬币等内容。

最后保存在xlsx文件即可。
在这里插入图片描述
奉上代码如下所示:


import numpy as np
import pandas as pd

from bs4 import BeautifulSoup as bs
import urllib.request as ur
import urllib.parse as up
import urllib.error as ue
import http.cookiejar as hc

import re
import gzip
import json

import time
import os
import socket

os.chdir(r'...')
socket.setdefaulttimeout(30)
cookie=''
###    配置爬虫条件   ###
# 设置请求头
# api请求头

apiheaders={
    'Host': 'api.bilibili.com',
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
    'Upgrade-Insecure-Requests': '1',
    'Accept':' application/json, text/plain, */*',
    'Sec-Fetch-Dest': 'empty',
    'User-Agent': '',
    'Origin': 'https://www.bilibili.com',
    'Sec-Fetch-Site': 'same-site',
    'Sec-Fetch-User': '?1',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Dest': 'document',
    'Referer': 'https://www.bilibili.com/anime/index/',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cookie':cookie
}
# 网页请求头
wwwheaders={
    'Host': 'www.bilibili.com',
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': '',
    'Sec-Fetch-Dest': 'document',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-User': '?1',
    'Referer': 'https://www.bilibili.com/anime/index/',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cookie':cookie
}
# 图片请求头
imageheaders={
    'Host': 'i0.hdslb.com',
    'Connection': 'keep-alive',
    'User-Agent': '',
    'Sec-Fetch-Dest': 'image',
    'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8',
    'Sec-Fetch-Site': 'cross-site',
    'Sec-Fetch-Mode': 'no-cors',
    'Referer': 'https://www.bilibili.com/bangumi/media/md1178/?from=search&seid=17806546061422186816',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9'
}
# 创建cookiejar对象
cj=hc.CookieJar()
# 根据cookiejar创建handler对象
hl=ur.HTTPCookieProcessor(cj)
# 根据handler创建opener对象
opener=ur.build_opener(hl)

###  爬取ss号  ##

# 番剧区索引
def ssdownload():
    sslist=list()
    pattern=re.compile(r'https://www.bilibili.com/bangumi/play/ss\d+')
    pattern2=re.compile(r'"title":"(.*?)"')
    for i in range(1,11):
        url='https://api.bilibili.com/pgc/season/index/result?season_version=-1&area=-1&is_finish=-1&copyright=-1&season_status=-1&season_month=-1&year=-1&style_id=-1&order=5&st=1&sort=0&page='+str(i)+'&season_type=1&pagesize=20&type=1'
        print('正在获取第'+str(i)+'页番剧信息')
        print(url)
        try_time=0
        while try_time<=5:
            try:
                r=ur.Request(url=url,headers=apiheaders)
                response=opener.open(r) 
                break
            except ue.HTTPError as e:
                print('网页不存在...跳过')
                break
            except Exception as e:
                try_time+=1
                print('重新尝试',try_time)
        else:
            raise Exception('下载失败!!')
        
        
        try:
            content=str(gzip.decompress(response.read()),'utf-8')
        except Exception as e:
            break
            
        response.close()
        
        titles=re.findall(pattern2,content)
        ssurl=re.findall(pattern,content)
        
        
        for i in range(len(ssurl)):
            sslist.append({'title':titles[i],'ssurl':ssurl[i]}) 
    return sslist

###  访问ss链接 ###
def mddownload(sslist):
    datajson=[]
    for each_ssurl in sslist:
        print('正在下载第'+str(sslist.index(each_ssurl)+1)+'个番剧')
        print('第'+str(sslist.index(each_ssurl)+1)+'个番剧网址为'+each_ssurl['ssurl'])
        try_time=0
        httperror=False
        while try_time<=5:
            try:
                r=ur.Request(url=each_ssurl['ssurl'],headers=wwwheaders)
                response=opener.open(r) 
                break
            except ue.HTTPError as e:
                httperror=True
                print('网页不存在...跳过')
                break
            except Exception as e:
                try_time+=1
                print('重新尝试',try_time)
        else:
            raise Exception('下载失败!!')
        
        if httperror:
            continue
        
        content=str(gzip.decompress(response.read()),'utf-8')
        response.close()
        soup=bs(content, features="lxml")
        script_tag = soup.find('script', id="__NEXT_DATA__")
        if script_tag is not None:
            json_text = script_tag.string
            data = json.loads(json_text)
            datajson.append(data)
    return datajson

def getdata(datajson):
    data=[]
    for each_data in datajson:
        each_data=each_data['props']['pageProps']["dehydratedState"]["queries"][0]["state"]["data"]["seasonInfo"]['mediaInfo']
        data.append({'title':each_data['title'],'media_id':each_data['media_id'],'season_id':each_data['season_id'],
                     "coins":each_data["stat"]['coins'],"danmakus":each_data["stat"]['danmakus'],"favorite":each_data["stat"]['favorite'],
                     "favorites":each_data["stat"]['favorites'],"follow_text":each_data["stat"]['follow_text'],"reply":each_data["stat"]['reply'],
                     "likes":each_data["stat"]['likes'],"share":each_data["stat"]['share'],"views":each_data["stat"]['views'],
                    'evaluate':each_data['evaluate'],'styles':each_data['styles'],'actors':each_data['actors'],
                    'staff':each_data['staff'],'publish':each_data['publish'],
                    })
        print('成功写入有关'+each_data['title']+'的数据')
    return data

if __name__=='__main__':
    sslist=ssdownload()
    datajson=mddownload(sslist)
    data=getdata(datajson)
    df=pd.DataFrame(data)
    df.to_excel('bilibili.xlsx',index=False)
    print('爬取完成!')   

User-Agent和cookie用自己的,具体可以自行搜索如何操作。

代码运行效果:
在这里插入图片描述
最近新开了公众号,请大家关注一下。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1381641.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据库】sql优化有哪些?从query层面和数据库层面分析

目录 归纳sql本身的优化数据库层面的优化 归纳 这类型问题可以称为&#xff1a;Query Optimization&#xff0c;从清华AI4DB的paper list中&#xff0c;该类问题大致可以分为&#xff1a; Query RewriterCardinality EstimationCost EstimationPlan Optimization 从中文的角…

某厂校招一道关于C的笔试题

一、笔试原题 题目&#xff1a;在Linux x86 _ 54 gcc环境下&#xff0c;下面的程序会出现什么问题&#xff1f;运行结果是什么&#xff1f;为什么&#xff1f; 程序如下图&#xff1a; 通过在gcc的环境下编译运行&#xff0c;发现运行结果为不断死循环打印0-17的数字 我们…

TCP之三次握手四次挥手与UDP区别

文章目录 1 TCP三次握手四次挥手1.1 数据包说明1.1.1 TCP数据包1.1.2 UDP数据包1.1.3 TCP和UDP差异1.1.4 TCP可靠性传输机制 1.2 三次握手1.2.1 三次握手定义1.2.2 三次握手问题1.2.2.1 问题引入分析1.2.2.2 历史连接1.2.2.3 同步双方初始序列号1.2.2.4 避免资源浪费 1.3 四次挥…

Github Copilot AI保密级教程

Copilot 是一款由 OpenAI 推出的人工智能代码自动补全AI工具&#xff0c;它可以帮助程序员更快、更准确地编写代码。Copilot 的核心技术基于 GPT-3 模型&#xff0c;但是在编码方面是优于GPT-3的&#xff0c;它可以根据程序员输入的上下文和代码提示&#xff0c;自动生成符合语…

微信小程序如何自定义导航栏,怎么确定导航栏及状态栏的高度?导航栏被刘海、信号图标给覆盖了怎么办?

声明&#xff1a;本文为了演示效果&#xff0c;颜色采用的比较显眼&#xff0c;可根据实际情况修改颜色 问题描述 当我们在JSON中将navigationStyle设置成custom后&#xff0c;当前页面的顶部导航栏就需要我们制作了&#xff0c;但出现了一下几个问题&#xff1a; 导航栏的高…

51-12 多模态论文串讲—BLIP 论文精读

视觉语言预训练VLP模型最近在各种多模态下游任务上获得了巨大的成功&#xff0c;目前还有两个主要局限性: (1) 模型角度: 大多数方法要么采用encoder模型&#xff0c;要么采用encoder-decoder模型。然而&#xff0c;基于编码器的模型不太容易直接转换到文本生成任务&#xff0…

高德打车引入“红绿灯倒计时”能力,算力技术升级打车体验

打到的车还有多久能到&#xff1f;接驾车辆原地不动是什么原因&#xff1f;乘客在打车时&#xff0c;常常因为无法了解实时接驾路况&#xff0c;容易出现“等车焦虑”。 如今&#xff0c;高德打车已全面应用“红绿灯倒计时”能力&#xff0c;让乘客在等车时就能掌握接驾路况&am…

在线ai扩图是什么?有什么工具?分享3个好用的工具。

在线ai扩图是什么&#xff1f;有什么工具&#xff1f;分享3个好用的工具。 在当今数字化的时代&#xff0c;图像处理成为了我们日常生活和工作中不可或缺的一部分。有时候&#xff0c;我们需要将图像放大以获取更多的细节&#xff0c;但传统的方法往往会导致图像质量的损失。幸…

阿里云服务器ECS介绍_高性能云服务器_为了无法计算的价值

阿里云高性能云服务器60%单实例最大性能提升&#xff0c;35Gbps内网带宽&#xff0c;网络增强&通用型云服务器、本地SSD型云服务器、大数据型云服务器、GPU异构型云服务器&#xff0c;阿里云百科aliyunbaike.com分享阿里云高性能云服务器&#xff1a; 阿里云高性能云服务器…

云原生分布式多模架构:华为云多模数据库 GeminiDB 架构与应用实践

文章目录 前言一、GeminiDB 总体介绍1.1、华为云数据库全景图1.2、GeminiDB 发展历程1.3、GeminiDB 全球分布情况 二、GeminiDB 云原生架构2.1、核心设计&#xff1a;存算分离&多模扩展2.2、存算分离&多模扩展核心优势2.3、高可用&#xff1a;秒级故障接管2.4、弹性扩展…

java基于SSM框架的宿舍管理系统的设计与实现论文

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对宿舍信息管理的提升&#xff0c…

高精度恒流/恒压(CC/CV)原边反馈功率转换器

一、产品概述 PR6214是一款应用于小功率AC/DC充电器和电源适配器的高性能离线式功率开关转换器。PR6214采用PFM工作模式&#xff0c;使用原边反馈架构&#xff0c;无需次级反馈电路&#xff0c;因此省去了光耦和431&#xff0c;应用电路简单&#xff0c;降低了系统的成本和体积…

macbook安装配置maven3.6.1(包含将jdk更新至11版本)

参考博客&#xff1a; https://blog.csdn.net/qq2019010390/article/details/125472286 下载和安装 首先&#xff0c;在maven官网下载macOS系统所需的压缩包 官网的地址&#xff1a;https://maven.apache.org/download.cgi 因为要下载的版本是3.6.1&#xff0c;所以要在历史…

K8S后渗透横向节点与持久化隐蔽方式探索

前言 通常在红蓝对抗中&#xff0c;我们可能会通过各种方法如弱口令、sql注入、web应用漏洞导致的RCE等方法获得服务器的权限&#xff1b;在当前云原生迅猛发展的时代&#xff0c;这台服务器很可能是一个容器&#xff0c;在后续的后渗透由传统的提权变为容器逃逸&#xff0c;内…

山海鲸:开创城市发展管理可视化新篇章

随着城市化进程的加速&#xff0c;城市管理面临着前所未有的挑战。如何实现高效、精准的城市管理&#xff0c;提升城市居民的生活质量&#xff0c;成为城市发展亟待解决的问题。山海鲸城市发展管理可视化解决方案应运而生&#xff0c;它利用先进的技术和创新的理念&#xff0c;…

使用ffmpeg对视频进行静音检测

1 原始视频信息 通过ffmpeg -i命令查看视频基本信息 ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-version3 --enable-sta…

第11章 2 文件和io操作 +

本章总结和章节选择题 p160 很奇怪&#xff0c;只有先写了列表&#xff0c;在遍历file 才有打印 若文件原来就有内容&#xff0c;w open 完之后&#xff0c;文件内容就被清空了 open操作若不指定打开模式&#xff0c;默认打开模式是r 文本打开时&#xff0c;是按照字符串 实…

苍穹外卖学习----出错记录

1.微信开发者工具遇到的问题&#xff1a; 1.1appid消失报错&#xff1a; {errMsg: login:fail 系统错误,错误码:41002,appid missing [20240112 16:44:02][undefined]} 1.2解决方式&#xff1a; appid可在微信开发者官网 登录账号后在开发栏 找到 复制后按以下步骤粘贴即…

android自定义来电秀UI

简单来电秀功能&#xff0c;效果如图&#xff1a; 底部附上demo 一、新建一个PhoneCallService服务&#xff0c;在服务中监听来电等状态&#xff0c;且控制UI显示 public class PhoneCallService extends InCallService {private final Call.Callback callback new Call.Ca…

调试(c语言)

前言&#xff1a; 我们在写程序的时候可能多多少少都会出现一些bug&#xff0c;使我们的程序不能正常运行&#xff0c;所以为了更快更好的找到并修复bug&#xff0c;使这些问题迎刃而解&#xff0c;学习好如何调试代码是每个学习编程的人所必备的技能。 1. 什么是bug&#xf…