Scrapy 爬取 Bangumi 网站的分页与详情页数据
使用 Scrapy 爬取 Bangumi 网站的分页与详情页数据
项目简介
在本项目中,我们使用 Scrapy 框架实现了对 Bangumi 网站的分页与详情页数据的爬取。项目包括以下功能:
- 分页解析:爬取排名页面的动漫信息。
- 详情页解析:获取动漫的详细描述。
- 图片下载与处理:从资源网站下载图片,进行重命名后存储。
注意: 在之前, 已经讲过很多怎么去找请求, 怎么去爬取请求相关的内容, 一些基本的操作, 从这篇文章开始, 就不再赘述了。
功能实现
1. 分页与详情页爬虫
我们定义了一个名为 BangumiSpider
的 Scrapy 爬虫类,具体实现如下:
class BangumiSpider(scrapy.Spider):
name = "bangumi"
start_urls = ["https://bgm.tv/anime/browser?sort=rank"]
page = 2
count = 1
def parse(self, response):
lis = response.xpath('//ul[@id="browserItemList"]/li')
for li in lis:
title = li.xpath('.//a[@class="l"]/text()').get()
info = li.xpath('.//p[@class="info tip"]/text()').get().replace(' ', '').replace('\n', '')
fade = li.xpath('.//small[@class="fade"]/text()').get()
detail_url = 'https://bgm.tv' + li.xpath('.//a[@class="l"]/@href').get()
# 存储数据到 Item 对象
item = Scrapy19Item()
item['title'] = title
item['info'] = info
item['fade'] = fade
# 发起详情页请求
yield scrapy.Request(url=detail_url, callback=self.parse_detail, meta={'item': item})
# 自动处理分页
if self.page < 6:
self.page += 1
yield scrapy.Request(url=f'https://bgm.tv/anime/browser?sort=rank&page={self.page}', callback=self.parse)
def parse_detail(self, response):
content = ''.join(response.xpath('//div[@id="subject_summary"]/text()').getall())
item = response.meta['item']
item['content'] = content
yield item
2. 数据存储
爬取的数据会被保存到 Excel 文件中,具体通过以下 Scrapy19Pipeline
实现:
class Scrapy19Pipeline:
def open_spider(self, spider):
if spider.name == 'bangumi':
self.wb = openpyxl.Workbook()
self.sh = self.wb.active
self.sh.title = '番组计划1-5页数据'
self.sh.append(['名称', '介绍', '评分', '简介'])
def process_item(self, item, spider):
if spider.name == 'bangumi':
self.sh.append([item['title'], item['info'], item['fade'], item['content']])
return item
def close_spider(self, spider):
if spider.name == 'bangumi':
self.wb.save('番组计划.xlsx')
图片爬取
除了 Bangumi 数据外,我们还实现了对图片资源的爬取和保存。
爬取实现
ZzscSpider
爬虫负责图片链接和名称的获取:
class ZzscSpider(scrapy.Spider):
name = "zzsc"
start_urls = ["https://sc.chinaz.com/tupian/"]
def parse(self, response):
divs = response.xpath('//div[@class="item"]')
for div in divs:
img_url = 'https:' + div.xpath('./img/@data-original').get().replace('_s', '')
img_name = div.xpath('./img/@alt').get()
# 提交给管道
item = ZZSCItem()
item['img_name'] = img_name
item['img_url'] = img_url
yield item
图片管道
通过 ZZSCPipeline
管道完成图片下载和重命名:
class ZZSCPipeline(ImagesPipeline):
def get_media_requests(self, item, info):
yield scrapy.Request(url=item['img_url'])
def file_path(self, request, response=None, info=None, *, item=None):
return item['img_name'] + '.png'
配置中设置了图片存储路径:
IMAGES_STORE = 'imgs'
总结
通过本项目,我们实现了 Scrapy 的多个核心功能:分页与详情页爬取、多源数据整合、数据存储以及图片下载和处理。这不仅提升了对 Scrapy 框架的理解,也为未来的爬虫开发提供了模板。如果您对项目有任何问题或建议,欢迎留言讨论!
以上就是Scrapy 爬取 Bangumi 网站的分页与详情页数据的所有内容了, 如果有哪里不懂的地方,可以把问题打在评论区, 欢迎大家在评论区交流!!!
如果我有写错的地方, 望大家指正, 也可以联系我, 让我们一起努力, 继续不断的进步.
学习是个漫长的过程, 需要我们不断的去学习并掌握消化知识点, 有不懂或概念模糊不理解的情况下,一定要赶紧的解决问题, 否则问题只会越来越多, 漏洞也就越老越大.
人生路漫漫, 白鹭常相伴!!!