获取LOL所有在售皮肤的价格和发布日期

效果展示:

分析目标网站:

  1. LOL道聚城网址:https://daoju.qq.com/lol/list/17-0-0-0-0-0-0-0-0-0-0-00-0-0-1-1.shtml
  2. 在进入网站后,右键网站任意位置点击查看页面源代码,但在源代码中无法找到皮肤相关信息

  1. 返回网站,右键点检查审查元素,在弹出的控制台中点网络network,如果没有显示数据的话,刷新一下网页就有了

  1. 在网络栏下找到GoodsListApp.php?.....开头的那个名称,然后点击右侧的预览,展开数据后发现其皮肤数据都在里面

  1. 在确认数据的所在位置后,点击负载查看其发送请求时,需要携带的全部参数

获取皮肤相关信息:

  1. 创建请求头,并分析所有需要携带的参数:
    • 打开网站不同页码,对这些参数进行对比,可以发现参数:
    • page:不同页面对应的页码数,整型
    • _:一个13位的时间戳,整型
    • 而其他参数则都相同
# 请求链接
self.url = "https://apps.game.qq.com/daoju/v3/api/hx/goods/app/v71/GoodsListApp.php?"
# 请求头
self.headers = {
    "referer": "https://daoju.qq.com/",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36 Edg/101.0.1210.32"
}
# 发送请求需要携带的参数
self.params = {
    "view": "biz_cate",
    "page": int,
    "pageSize": 16,
    "orderby": "dtShowBegin",
    "ordertype": "desc",
    "cate": 17,
    "appSource": "pc",
    "plat": 1,
    "output_format": "jsonp",
    "biz": "lol",
    "_": int(time.time() * 1000)
}
  1. 找到参数的规律后,发送请求,并解析请求返回的数据,这里使用re正则表达式进行筛选
def get_data(self):
    # 初始化字典
    all_skins_data = dict()
    # 循环请求页面
    for i in range(1, 51):
        # 请求间隔
        time.sleep(1)
        # 参数页码
        self.params['page'] = i
        # 发送请求
        res = requests.get(self.url, headers=self.headers, params=self.params)
        # 提取数据
        skins_list = self.data_format(res.text)
        # 添加进字典
        all_skins_data[f"lol道具城第<{i}>页"] = skins_list
    # 保存数据
    self.save_data(all_skins_data)

def data_format(self, data):
    # 筛选当页所有皮肤名称
    skin_name_list = re.findall(r'"propName":"(.*?)"', data)
    # 筛选当页所有皮肤价格
    skin_price_list = re.findall(r'"iDqPrice":"(\d+)"', data)
    # 筛选当页所有上架日期
    skin_date_list = re.findall(r'"dtBegin":"(.*?)"', data)

    skins_list = []

    for i in range(0, len(skin_name_list)):
        item = dict()
        # 皮肤名称
        item["skin_name"] = str(skin_name_list[i]).encode('utf8').decode('unicode_escape').replace("\\", "")
        # 皮肤价格(点券)
        item["skin_price"] = skin_price_list[i]
        # 皮肤上架日期
        item["skin_date"] = skin_date_list[i]
        skins_list.append(item)
        # 展示数据
        print(item)
    return skins_list
  1. 把筛选后的数据保存到本地,这里采用json格式:
    def save_data(self, all_skins_data):
        # JSON序列化
        json_data = json.dumps(all_skins_data, indent=1, ensure_ascii=False)
        with open("lol_skins_data.json", "w", encoding="utf-8") as w:
            w.write(json_data)

完整版代码:

  • 这个是我平时做爬虫练习时,汇总的案例的其中之一,代码比较适合新手学习,该Github仓库的爬虫案例也会在以后不断更新,有兴趣学习爬虫的可以来捧捧场哦QwQ。仓库链接:https://github.com/cjladmin/spider_cases
import requests
import time
import re
import json


class LolSkins:
    def __init__(self):
        self.url = "https://apps.game.qq.com/daoju/v3/api/hx/goods/app/v71/GoodsListApp.php?"
        self.headers = {
            "referer": "https://daoju.qq.com/",
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36 Edg/101.0.1210.32"
        }
        self.params = {
            "view": "biz_cate",
            "page": int,
            "pageSize": 16,
            "orderby": "dtShowBegin",
            "ordertype": "desc",
            "cate": 17,
            "appSource": "pc",
            "plat": 1,
            "output_format": "jsonp",
            "biz": "lol",
            "_": int(time.time() * 1000)
        }

    def get_data(self):
        # 初始化字典
        all_skins_data = dict()
        # 循环请求页面
        for i in range(1, 51):
            # 请求间隔
            time.sleep(1)
            # 参数页码
            self.params['page'] = i
            # 发送请求
            res = requests.get(self.url, headers=self.headers, params=self.params)
            # 提取数据
            skins_list = self.data_format(res.text)
            # 添加进字典
            all_skins_data[f"lol道聚城第<{i}>页"] = skins_list
        # 保存数据
        self.save_data(all_skins_data)

    def data_format(self, data):
        # 皮肤名称
        skin_name_list = re.findall(r'"propName":"(.*?)"', data)
        # 皮肤价格
        skin_price_list = re.findall(r'"iDqPrice":"(\d+)"', data)
        # 上架日期
        skin_date_list = re.findall(r'"dtBegin":"(.*?)"', data)

        skins_list = []

        for i in range(0, len(skin_name_list)):
            item = dict()
            item["skin_name"] = str(skin_name_list[i]).encode('utf8').decode('unicode_escape').replace("\\", "")
            item["skin_price"] = skin_price_list[i]
            item["skin_date"] = skin_date_list[i]
            skins_list.append(item)
            # 展示数据
            print(item)

        return skins_list

    def save_data(self, all_skins_data):
        # JSON序列化
        json_data = json.dumps(all_skins_data, indent=1, ensure_ascii=False)
        with open("lol_skins_data.json", "w", encoding="utf-8") as w:
            w.write(json_data)


if __name__ == '__main__':
    lol = LolSkins()
    lol.get_data()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值