持续创造,加速生长!这是我参与「掘金日新方案 4 月更文应战」的第4天,点击检查活动概况

数据收集

确定网址

王者新赛季马上就要开端了,咱们都开端冲榜了,准备拿一个小省标,那么,本文,就来练习获取各地最低战力的爬虫收集实战。

确定好咱们的方针网址之后,咱们要找到咱们需要的数据源,通过开发者工具剖析,咱们不难发现其数据地址。

恳求URL:

https://www.sapi.run/hero/select.php

恳求方式:

  • GET

参数:

参数名 必选 类型 阐明
hero string 英豪名
type string 选aqq、awx、iqq、iwx

恳求示例

https://www.sapi.run/hero/select.php?hero=孙悟空&type=aqq

回来示例

{
  "code": 200,
  "data": {
    "uid": "167",
    "name": "孙悟空",
    "alias": "齐天大圣-孙悟空",
    "platform": "安卓-扣扣区",
    "photo": "https://game.gtimg.cn/images/yxzj/img201606/heroimg/167/167.jpg",
    "area": "武强县",
    "areaPower": "3693",
    "city": "潮州市",
    "cityPower": "5501",
    "province": "天津市",
    "provincePower": "7274",
    "guobiao": "11404",
    "stamp": "1654640093",
    "updatetime": "2022/06/08 06:14:53",
    "clientIP": "119.0.0.126"
  },
  "msg": " "
}

下面,咱们开端写代码。

获取数据

第一步,发送恳求,取得数据。

import requests
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
hero_url = 'https://pvp.qq.com/web201605/herolist.shtml'
response = requests.get(url=hero_url, headers=headers)

这段代码中,咱们运用 Python 的requests模块发送了一个 GET 恳求,恳求的 URL 为https://pvp.qq.com/web201605/herolist.shtml,而且运用了headers参数来设置恳求头信息。恳求头信息包含了user-agent字段,用于指定浏览器的 User-Agent 信息。

恳求回来的结果是一个Response目标,咱们能够运用response.text属性来获取恳求的呼应内容。在这个比如中,咱们运用了response.json()办法来将呼应内容转换为 JSON 格局,并将其存储在response.text属性中。

response.encoding='gbk'
heros = re.findall('alt=".*?">(.*?)</a>',response.text)[0:93]

这段代码中,咱们运用 Python 的re模块中的findall()函数来查找 JSONP 回调函数的参数。findall()函数能够回来一个列表,其间包含了所有匹配的子字符串。

在这个比如中,咱们运用findall()函数来查找 JSONP 回调函数的参数,并将其存储在response.text变量中。然后,咱们运用[0:93]来获取第一个匹配的子字符串,并将其存储在heros变量中。

需要注意的是,findall()函数回来的子字符串列表中或许包含多个匹配的子字符串,因而咱们需要运用[0:93]来获取第一个匹配的子字符串。

【Python实战】Python采集王者最低战力信息

解析数据

咱们发现,咱们得到了这样英豪姓名的数据,下面,咱们就能够构建url,获取战力信息。

for hero in heros:
    print(hero)
    url = f'https://www.sapi.run/hero/select.php?hero={hero}&type=qq'
    res = requests.get(url)
    data = res.json()['data']
    name = data['name']
    area = data['area']
    areaPower= data['areaPower']
    city = data['city']
    cityPower = data['cityPower']
    province= data['province']
    provincePower = data['provincePower']
    platform= data['platform']
    updatetime = data['updatetime']

这段代码中,咱们运用 Python 的requests模块发送了一个 GET 恳求,恳求的 URL 为https://www.sapi.run/hero/select.php?hero={hero}&type=qq,而且运用了json()办法将呼应内容转换为 JSON 格局,并将其存储在res.json()变量中。

恳求回来的结果是一个Response目标,咱们能够运用response.json()办法将呼应内容转换为 JSON 格局,并将其存储在res.json()变量中。

在这个比如中,咱们运用了res.json()变量来获取呼应内容,并将其存储在data变量中。然后,咱们运用name变量获取了英豪称号,运用area变量获取了区域姓名,运用areaPower变量获取了区域战力,运用city变量获取了市,运用cityPower变量获取了市战力,运用province变量获取了省份,运用provincePower变量获取了省份战力,运用platform变量获取了渠道,运用updatetime变量获取了更新时刻。

保存数据

dit = {
    '英豪称号':name,
    '服务区':platform,
    '更新时刻': updatetime,
    '铜牌区域':area,
    '铜牌分数': areaPower,
    '银牌区域':city,
    '银牌分数': cityPower,
    '金牌区域':province,
    '金牌分数':provincePower ,
}

这段代码是一个 Python 代码片段,它界说了一个字典,其间包含了一些英豪的信息,包含英豪称号、服务区、更新时刻、铜牌区域、铜牌分数、银牌区域、银牌分数、金牌区域、金牌分数等。

下面就是数据的写入了。其实,把字典数值写入到csv文件里边,特别简单,只需呀四行代码就能够完成。

f = open('最低战力.csv', mode='a', encoding='utf-8_sig', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['英豪称号', '服务区', '更新时刻', '铜牌区域', '铜牌分数',
                                           '银牌区域', '银牌分数', '金牌区域','金牌分数'])
csv_writer.writeheader()

这段代码翻开了一个名为'最低战力.csv'的文件,并将其以追加形式翻开。它还指定了文件的编码为 UTF-8 和行结束符为空字符串(newline='')。

然后,代码创建了一个csv.DictWriter目标,并将其与文件目标相关起来。fieldnames参数指定了字典中的键和值的称号。

接下来,代码调用writeheader()办法来写入表头。这个办法将字典中的键值对写入文件中,并将其作为表头。

写入字典数值。

csv_writer.writerow(dit)

这时候,咱们就会在文件夹里边找到最低战力的csv文件,咱们翻开看看作用。

【Python实战】Python采集王者最低战力信息