scrapy爬虫实战——米哈游官网数据爬取

article/2025/10/4 5:32:25

项目总览

  • 前言
  • 项目建立
  • 爬虫代码编写
  • 爬虫运行
  • 导出到Excel
  • 后记

前言

scrapy是一个强大的爬虫框架,熟练地使用它几乎可以随心所欲地抓取任何网页上想要获得的数据。笔者初学爬虫,需要项目练手,适逢有不少朋友热衷于《原神》这款由米哈游开发的游戏,出于对角色数据的好奇,便选择了米哈游的官网数据作为了实战目标。

项目建立

scrapy项目的建立很简单,只需要打开cmd,cd到你要建立项目的目录下,输入一行指令:

scrapy startproject 项目名称

随后打开目录,你可以发现建立了一个文件夹(笔者这里的项目名称即juese)打开以后,有一个同名文件夹和一个scrapy.cfg。我们的第一步到这里就完成了!
在这里插入图片描述

爬虫代码编写

项目建立完了以后,就开始编写爬虫了。首先,第二个juese文件夹里有一个spiders文件夹,在这个文件夹中建立一个.py文件,我的文件就叫做spider.py
在这里插入图片描述
然后开始编写,首先要编写的是上一个目录的items.py文件,这个文件里面的内容代表了你要爬的数据名称,大致如下:

import scrapyclass JueseItem(scrapy.Item):name = scrapy.Field()hp_1 = scrapy.Field()attack_1 = scrapy.Field()defend_1 = scrapy.Field()

然后就可以开始编写刚刚建立的spider.py文件了,直接贴代码:

import scrapy
import sys
sys.path.append('D:/juese/juese')
from items import JueseItemclass JueseSpider(scrapy.Spider):name = 'juese'allowed_domains = ["mihoyo.com"]start_urls = ['https://bbs.mihoyo.com/ys/obc/content/90/detail?bbs_presentation_style=no_header&tdsourcetag=s_pctim_aiomsg']

其中,导入sys库是为了能调用上级目录的items.py
我们新建了一个爬虫类,前三个变量非常关键,代表了爬虫名字,爬虫的限定区域和起始的网页,变量名不能更改。起始的网页即米哈游的官网里原神的角色索引。那么,由这些角色索引怎样获得各个角色的信息呢?所以第一步就是要去爬下一级页面的连接,这里的方法名parse不能更改。

    def parse(self,response):item = JueseItem()hrefs = response.xpath("//*[@id='__layout']/div/div[2]/div[2]/div/div[1]/div[2]/div[2]/div/div/div[3]/div/table/tbody/tr/td/a/@href").extract()for href in hrefs:href = "https://bbs.mihoyo.com/" + hrefyield scrapy.Request(href, callback=self.new_parse, meta={'item':item})

接上一块代码,这里用到了Xpath解析。笔者这里的Xpath解析过于冗长,但实际上是比较适合初学者的写法。获取Xpath有一种非常快捷的方法:
在这里插入图片描述
按F12打开网页架构,找到需要抓取的内容,直接复制它的Xpath解析,粘贴到你的代码里即可。
然后是非常重要的一个内容!就是scrapy的Request方法,这个方法的用法就如代码所示,它相当于点进了你爬到的那些二级页面,这里创建了一个新方法new_parse用于我们在二级页面的爬虫,并且需要继承之前用到的item.完成了这一步,就可以正式进行内容的爬取了。

    def new_parse(self,response):item = response.meta['item']item['name'] = response.xpath("//*[@id='__layout']/div/div[2]/div[2]/div/div[1]/div[2]/h1/text()")[0].extract()item['hp_1'] = response.xpath("//*[@id='__layout']/div/div[2]/div[2]/div/div[1]/div[2]/div[2]/div[1]/div[5]/table/tbody/tr[2]/td[2]/div/span/text()")[0].extract()item['attack_1'] = response.xpath("//*[@id='__layout']/div/div[2]/div[2]/div/div[1]/div[2]/div[2]/div[1]/div[5]/table/tbody/tr[3]/td[2]/div/span/text()")[0].extract()item['defend_1'] = response.xpath("//*[@id='__layout']/div/div[2]/div[2]/div/div[1]/div[2]/div[2]/div[1]/div[5]/table/tbody/tr[4]/td[2]/div/span/text()")[0].extract()yield item

Xpath解析的获取和之前一样,对于文本内容需要注意的是最后必须有text(),以及用这种方法获得的数据实际是列表格式的,所以需要加一个[0]来去掉列表。至此,spider.py文件就编写完成。

爬虫运行

可以用cmd运行,这里介绍一种用pycharm来代替cmd的方法:

from scrapy import cmdlinecmdline.execute("scrapy crawl juese".split())

在spider.py的同级目录下建立一个名为begin.py的文件添加上述代码并运行,这相当于你打开cmd,在当前目录下执行scrapy crawl juese的指令。但用pycharm来代替方便了不少。

在这里插入图片描述
可以看到,数据获取完整,爬虫执行成功。

导出到Excel

将数据导出到Excel往往是必不可少的工作,方法有很多,笔者采用的是一种较为直观简单的方法。不过不管是什么方法,有一步是必须做的,那就是打开第一个juese文件中的settings.py,将ROBOTSTXT_OBEY = True的True改成False,并添加一段代码(也可以通过删去一些注释符实现):

ITEM_PIPELINES = {'juese.pipelines.JuesePipeline': 300,
}

保存退出,然后打开pipelines.py文件,开始编写导出的代码:

class JuesePipeline(object):def __init__(self):result = open('juese.xls', 'w', encoding='gbk')result.write('角色\t等级\t生命值\t攻击力\t防御力\t额外属性\n')def process_item(self, item, spider):result = open('juese.xls','a',encoding='gbk')l = []l.append([item['name'],1,item['hp_1'],item['attack_1'],item['defend_1'],0])l.append([item['name'],20,item['hp_20'],item['attack_20'],item['defend_20'],0])l.append([item['name'],40,item['hp_40'],item['attack_40'],item['defend_40'],item['bonus_40']])l.append([item['name'], 50, item['hp_50'], item['attack_50'], item['defend_50'], item['bonus_50']])l.append([item['name'], 60, item['hp_60'], item['attack_60'], item['defend_60'], item['bonus_50']])l.append([item['name'], 70, item['hp_70'], item['attack_70'], item['defend_70'], item['bonus_70']])l.append([item['name'], 80, item['hp_80'], item['attack_80'], item['defend_80'], item['bonus_80']])l.append([item['name'], 90, item['hp_90'], item['attack_90'], item['defend_90'], item['bonus_90']])for i in range(8):for j in range(6):result.write(str(l[i][j]))result.write('\t')result.write('\n')return item

由于笔者实际爬取的是1-90级的某角色属性,所以同一个角色也需要大量分行。至于写入Excel文件,就是for循环然后一格一格地写,写满一行换行,应该算是比较朴实的办法了。
在这里插入图片描述
可以看到角色们一个不落地被我们扒到了Excel里,至此我们的爬虫项目就全部完成了!

后记

这是笔者的第一个scrapy爬虫项目和第一篇csdn,很多用语不够专业,实在是学的不够精所致。不过,读到大二以来,这也算是不小的进步了,希望能帮一些同样的爬虫初学者们少走一点弯路。如有谬误恳请指出,感激不尽!!


http://chatgpt.dhexx.cn/article/gA1uDCV6.shtml

相关文章

一个神器,大幅提升爬虫爬取效率!

这是「进击的Coder」的第 575 篇技术分享 作者:崔庆才 在做爬虫的时候,我们往往可能这些情况: 网站比较复杂,会碰到很多重复请求。有时候爬虫意外中断了,但我们没有保存爬取状态,再次运行就需要重新爬取。 …

python爬虫基本功(一)--初识python爬虫与爬虫学习路径

大家好,这里是Kaiser。👏👏今天想给大家介绍下python爬虫的知识,我将与大家一起去揭开python爬虫的神秘面纱,字不多敲,让我们进入今天的主题:初识python爬虫。 文章目录 1️⃣什么是爬虫2️⃣爬…

神箭手 爬虫操作(1)

今天有一个任务,是要将微博用户的昵称从数据库导入到神箭手中。 以前一直是手动操作,现在有一个需求是要直接导入到设置中。 数据库使用的是mysql,数据库连接使用的是JDBCtemplate,使用spring构建,还要用到神箭手的S…

如何在神箭手云爬虫上写爬虫

摘要 上一篇博客跟大家详细介绍了如何写出《黄焖鸡米饭是怎么火起来的》这样的数据分析类的文章,相信很多人都对数据来源也就是如何爬取到黄焖鸡米饭商家信息很感兴趣。那么今天我就跟大家具体讲一讲怎么使用神箭手云爬虫写爬虫,以上篇博客的…

神箭手云爬虫平台 如何在1小时内编写简单爬虫

既然你来到了这里,想必你肯定已经知道了神箭手云爬虫平台是干什么的,目的也是非常的明确。 那么接下来的过程中,我将给你演示如何在最快时间内编写一个简单的爬虫,每一个属性的讲解,将会让你一路顺风。 demo项目GitHu…

神箭手云爬虫工具

title: 神箭手云爬虫 categories: 神箭手 tags:爬虫 分为: 入口页,帮助页,内容页 入口页: scanUrl 爬虫网页的入口 帮助页:helperurl 一帮包含大量的内容页(列表),多数情况下事业…

JS求绝对值

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 需求,一个变量,需要判断它的值为负数时不能小于-20,正数也不能小于20,这个时候就需要用到求绝对值了。 Math.abs(num) > 求绝对值 使用示例&#xf…

javascript:求绝对值最小的数

问题来源:http://androidguy.blog.51cto.com/974126/1129543 有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂…

力扣 -----最小绝对值(JavaScript解法)

一、题目描述 二、示例 三、解题思路 先进行一个排序,然后使用双指针,依次进行比较,将比较的值进行存储,最小值改变的话,数组置空,最小值改变,如果和最小值相等的话直接push。我刚开始写的排序…

python3 绝对值_python3对序列求绝对值

原博文 2018-11-08 11:27 − http://www.cnblogs.com/itdyb/p/5731804.html 一开始我是这样写的,据说这样写python2是可以的: myList [-1,2,-3,4,-5,6]absList map(abs, myList) &... 0 1936 相关推荐 2019-12-23 10:33 − ## Python3使用sud…

【前端】JavaScript基础(二)

目录 一、内置对象 Math对象 Data日期 数组对象 字符串对象 字符串的不可变 根据字符返回位置 根据位置返回字符(重点) 字符串基本方法(重点) 字符串的替换与转换 二、简单类型和复杂类型 简单类型传参 复杂类型传参 一、内…

LeetCode 任意子数组和绝对值的最大值(JavaScript)

这道题目,我是通过看题解,然后通过自己思考才写出来的,第一次写博客,如果有不好之处,请谅解。 写这个题目之前,我们先了解一下前缀和,通过下面例子,或许你就明白了什么是前缀和了。…

常用JavaScript控制结构语句,绝对值,累加,阶乘,循环

计算一个数的绝对值 function abs(x) {if (x > 0) {return x;} else {return -x;} } console.log(abs(10) abs(-10)); //>true计算数组元素之和 let arr [1, 3, 5];function sum(array) {let sum 0;for (let x of array) { //循环数组把每个元素赋给xsum x;}return…

02-Node.js基础(一)

目录 一、什么是Node.js二、Node.js在软件架构中的地位三、Node.js 可以做什么(作用)浏览器端的 JavaScriptNode端的JavaScript 四、Node.js APIsWeb端APINode.js端APIWeb端JS与Node端JS对比 五、安装 Node.js第一步:在官网下载 Node.js 安装…

vue取绝对值

先放效果&#xff1a; 代码 <template><el-input v-model"num" placeholder"请输入数字" /><el-button type"primary" click"changeNum">取绝对值</el-button> </template> import { ref } from &quo…

关于JSZIP压缩图片打包下载的一些用法

功能介绍 前端在处理一些批量文件或者图片时候&#xff0c;通过使用异步上传&#xff0c;减少表单一次性提交的的数据量。并将这些图片或者文件根据用户自定义压缩、分类保存到本地。是一个用于压缩文件和解压的JavaScript库。 官网地址 https://stuk.github.io/jszip/docume…

jsZip将多个文件压缩成一个压缩包

在项目开发中&#xff0c;搭档大佬要做一个断点续传的功能&#xff0c;让我帮忙研究一下前端将多个文件压缩成一个压缩包的方法&#xff0c;所以就有了这篇文章。 我的demo是写在vue中的&#xff0c;所以首先要有一个vue环境&#xff0c;才能进行接下来的步骤。那么下面我们就…

前端vue使用jszip压缩文件

一.引入element的上传文件组件 <el-form-item label"文件"><el-uploadclass"upload-demo"dragaction"https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"multiple:before-upload"beforeUpload"><el-icon …

vue3中使用jszip压缩文件

1、安装依赖 npm install jszip npm install file-saver --save 2、使用 <template><el-card class"mb15"><template #header><span>jszip</span></template><!-- 二维码容器 --><div id"qrCodeBox">&…