[爬虫] B站番剧信息爬取
申明:本文对爬取的数据仅做学习使用,不涉及任何商业活动,侵删
简述
本次爬取目标是:
- 番剧的基本信息(名字, 类型, 集数, 连载or完结, 链接等)
- 番剧的参数信息(播放量, 点赞, 投币, 追番人数等)
- 时间信息(开播时间, 完结时间)
前提条件
- 编程语言: Python 3
- 爬虫框架: Scrapy 1.6.0
- 编译器: Pycharm
- 平台: Windows
Scrapy安装参考文档:windows / linux
一丶页面分析
番剧索引页展示的番剧信息属于动态渲染, 因此要通过获取页面响应来得到我们想要的数据, 按F12到Network中找我们需要的响应数据:
来分析一下Request URL, 先无事其他的参数, 来看我们最需要的一部分: page=1&...&pagesize=20
page
:表示当前页码pagesize
:表示页面展示的番剧数
可以尝试访问Request URL, 来确认可以拿到我们需要的数据:
这一个请求并不能满足需求, 跟进番剧页链接, 并继续找响应数据:
几乎所有的数据都被我们得到了, 但唯独缺一个番剧类型
跟进番剧简介网址:https://www.bilibili.com/bangumi/media/md102392, 这是一个静态页面, 可以直接从响应中获取到我们需要的信息:
完成可数据源的分析, 接下来开始写代码
二丶创建爬虫
- 打开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
- 创建爬虫文件,到bilibili_spider\bilibili_spider\spiders目录下,运行命令:
scrapy genspider bilibili bilibili.com
,bilibili是爬虫文件的名称,后面是目标网站的域名, 由于本次爬取涉及的站点较多, 这里可以将www省略掉, 以避免出错
items.py
进入items.py文件中设置爬取的目标,基于python之禅简单生于复杂
, 我将上述最后两次请求合并到一个, 即从番剧详情页获取评论数和评分
import scrapyclass 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 BilibiliSpiderItemclass BilibiliSpider(CrawlSpider):name = 'bilibili'allowed_domains = ['bilibili.com']# 索引页的ajaxrequest_url = 'https://bangumi.bilibili.com/media/web_api/search/result?page={}&season_type=1&pagesize=20'page = 1start_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: # 限制爬取页数,用于测试爬取状态# returnlist_data = json.loads(response.text).get('result').get('data')if list_data is None: # 如果响应中没有数据,则结束执行returnfor 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.metaitem['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.metaresp = 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
[爬虫] B站番剧信息爬取相关推荐
- python爬取b站追番信息_Scrapy实战B站番剧信息爬取
Part 0 安装 采用Anaconda版本的Python可以直接使用conda install -c scrapinghub scrapy进行安装,采用pip install Scrapy有的环境需 ...
- python爬b站番剧_Python爬取B站动漫番剧更新信息,附代码和讲解过程
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 目标:爬取b站番剧最近更新 输出格式:名字+播放量+简介 那么开始撸吧~ 用到的 ...
- 使用Scrapy框架,爬取b站番剧信息。
使用Scrapy框架,爬取b站番剧信息. 感觉好久没写爬虫的,今天看了在b站浏览了一会儿,发现b站有很多东西可以爬取的,比如首页的排行榜,番剧感觉很容易找到数据来源的,所以就拿主页的番剧来练练手的. ...
- 爬虫实战:bilibili番剧排名爬取并数据可视化
爬取bilibili的国创动漫的追番人数排行番剧,爬取该网页的番剧信息和各自番播放网页里的简介信息后,将数据存储到Excel和Database,最后通过网页将数据可视化. 1.爬取网页.数据解析.数据 ...
- 【2020-10-27】 scrapy爬虫之猎聘招聘信息爬取
声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! scrapy爬虫之猎聘招聘信息爬取 1.项目场景 目标网址:https://www.liepin.com/zhao ...
- HttpClient实战爬虫B站番剧
准备 我们打开一个b站首页,选择番剧索引. https://www.bilibili.com/anime/index/#season_version=-1&area=-1&is_fin ...
- 链家网页爬虫_爬虫实战1-----链家二手房信息爬取
经过一段机器学习之后,发现实在是太枯燥了,为了增添一些趣味性以及熟练爬虫,在之后会不定时的爬取一些网站 旨在熟悉网页结构--尤其是HTML的元素,ajax存储,json:熟练使用pyspider,sc ...
- 基于scrapy的B站UP主信息爬取
文章目录 思路分析 项目目录 代码 结果 思路分析 本次爬取的信息,包括UP主的mid.昵称.性别.头像的链接.个人简介.粉丝数.关注数.播放数.获赞数. 我的思路是,首先,选择一位B站比较火的UP主 ...
- 爬虫系列之链家的信息爬取及数据分析
关于链家的数据爬取和分析 已经实现 1.房屋数据爬取并下载 2.房屋按区域分析 3.房屋按经纪人分析 4.前十经纪人 5.经纪人最有可能的位置分析 6.实现以地区划分房屋 目前存在的问题: 1.多线程 ...
最新文章
- 2021年大数据ELK(四):Lucene的美文搜索案例
- html怎么查看cad文件,如何直接查看CAD格式的图纸
- ArcGIS 9.3 安装之 Server的安装
- RLC协议简单理解1-RLC报文格式
- Python基础语法难点突破
- 我们在使用计算机时,不能做什么?,11秋季学期计算机应用技术基础学习周期_01任务-在线作业[1]1...
- Zuul和Eureka的负载均衡示例
- 华为Mate 40 Pro最新渲染图曝光:后置相机模组有变化
- WebKitGTK+ 编译
- 有没有这样一种程序员写代码的利器
- VMware ESXi5.0防火墙命令
- 您有一份来自阿里云达摩院的邀请函待查收!
- 人工智能的主要优势是什么?
- java闰年_编写java程序判断闰年。
- WGCNA:(加权共表达网络分析)
- Vue3嵌入krpano
- 《万能数据库查询分析器》创作人之2014年总结
- react hooks(dva) echarts 实现中国地图省份数据分布显示
- 微信公众号怎么集赞服务器,【微信点赞】_微信怎么点赞如何集赞微信点赞活动新手必备点赞教程...
- 强强联手:诚迈科技携手研华共同发起嵌入式Linux和Android联盟