博客
关于我
手把手教你从分析到实现,王者荣耀壁纸爬虫!表弟馋哭了!
阅读量:226 次
发布时间:2019-03-01

本文共 3777 字,大约阅读时间需要 12 分钟。

王者荣耀壁纸下载:从抓包到爬虫的全过程

作为一名技术爱好者,我最近对王者荣耀的壁纸进行了爬取,整个过程从抓包到最终完成下载其实并不复杂,但确实需要仔细分析和优化。以下是我从抓包到最终实现爬虫下载的详细过程。

一、抓包与分析

首先,我打开了王者荣耀的官方壁纸网站,使用F12键打开控制台工具,对页面进行抓包。通过这个方法,我可以看到前端发送的所有请求细节。

在抓包过程中,我发现王者荣耀的壁纸下载页面使用了JSONP格式的请求。这意味着每个请求都带有一个特定的callback参数,这在处理时需要特别注意。为了避免处理复杂的JSONP数据,我直接在代码中删除了callback参数。

通过分析请求的URL,我发现主要参数包括activityIdsVerifyCodeiListNumtotalpage以及page等。这些参数中,最关键的是page参数,它决定了当前请求的页数。

二、链接解析与格式选择

在抓包完成后,我对URL进行了详细分析。通过观察,我发现每个壁纸的URL后面带有一个_${size}的参数,这个参数决定了壁纸的分辨率。根据网站提供的选项,我选择了最常用的1920x1080分辨率进行爬取。

在代码实现中,我设置了一个选择分辨率的输入框,用户可以根据需要选择不同的分辨率。默认值设置为1920x1080,以满足大多数用户的需求。

三、爬虫实现

爬虫的主要逻辑分为几个步骤:

  • 获取总页数:首先,我向服务器发送一个请求,获取当前页面的总页数。通过解析返回的数据,我可以计算出总页数,并根据实际需要减去1(因为页码从0开始)。

  • 循环请求每页:使用一个循环,我依次请求每一页的数据。通过解析每个页面的响应内容,我提取出每个英雄的名字和对应的壁纸链接。

  • 处理文件路径:对于每个英雄,我会将名字进行处理,去除特殊字符,确保路径的正确性。然后,根据选定的分辨率,生成下载文件的路径。

  • 下载壁纸:通过替换URL中的/200/0,我可以获取到高质量的壁纸图片。将下载内容写入文件中,完成下载过程。

  • 四、代码实现

    以下是完整的Python爬虫代码:

    import osimport timeimport requestsimport jsonimport refrom urllib.parse import parseclass HonorOfKings:    def __init__(self, save_path='./heros'):        self.save_path = save_path        self.time = str(time.time()).split('.')        self.url = 'https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page={}&iOrder=0&iSortNumClose=1&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=%s' % self.time[0]        def hello(self):        print("*" * 50)        print(' ' * 18 + '王者荣耀壁纸下载')        print(' ' * 5 + '作者: Felix  Date: 2020-05-20 13:14')        print("*" * 50)        return self    def run(self):        print('↓' * 20 + ' 格式选择: ' + '↓' * 20)        print('1.缩略图 2.1024x768 3.1280x720 4.1280x1024 5.1440x900 6.1920x1080 7.1920x1200 8.1920x1440')        size = input('请输入您想下载的格式序号,默认6:')        size = size if size and int(size) in [1,2,3,4,5,6,7,8] else 6        print('---下载开始...')        page = 0        offset = 0        total_response = self.request(self.url.format(page)).text        total_res = json.loads(total_response)        total_page = int(total_res['iTotalPages']) - 1  # 页码从0开始        while True:            if offset > total_page:                break            url = self.url.format(offset)            response = self.request(url).text            result = json.loads(response)            now = 0            for item in result["List"]:                now += 1                hero_name = parse.unquote(item['sProdName']).split('-')[0]                hero_name = re.sub(r'[【】:.<>|·@#$%^&() ]', '', hero_name)                print('---正在下载第 {} 页 {} 英雄 进度{}/{}...' . format(offset, hero_name, now, len(result["List"])))                                hero_url = parse.unquote(item['sProdImgNo_{}'.format(str(size))])                save_path = self.save_path + '/' + hero_name                save_name = save_path + '/' + hero_url.split('/')[-2]                                if not os.path.exists(save_path):                    os.makedirs(save_path)                                if not os.path.exists(save_name):                    with open(save_name, 'wb') as f:                        response_content = self.request(hero_url.replace("/200", "/0")).content                        f.write(response_content)            offset += 1        print('---下载完成...')    @retry(stop_max_attempt_number=3)    def request(self, url):        response = requests.get(url, timeout=10)        assert response.status_code == 200        return responseif __name__ == "__main__":    HonorOfKings().hello().run()

    五、优化与结果

    在代码实现中,我对URL进行了详细的分析,确保了爬虫能够正确处理JSONP格式的请求。通过解析URL中的page参数,我能够正确获取每一页的数据。

    在下载过程中,我对每个英雄的名字进行了处理,去除了特殊字符,确保文件路径的正确性。同时,我通过替换URL中的/200/0,成功获取了高质量的壁纸图片。

    最终,我的爬虫工具能够按照设置的分辨率下载指定的壁纸,并将它们组织在同一个文件夹下。通过这个过程,我不仅练习了爬虫技术,还对王者荣耀的壁纸下载机制有了更深入的理解。

    转载地址:http://pmgp.baihongyu.com/

    你可能感兴趣的文章
    opencv resize
    查看>>
    opencv SVM分类Demo
    查看>>
    OpenCV VideoCapture.get()参数详解
    查看>>
    opencv videocapture读取视频cap.isOpened 输出总是false
    查看>>
    opencv waitKey() 函数理解及应用
    查看>>
    OpenCV 中的图像转换
    查看>>
    OpenCV 人脸识别 C++实例代码
    查看>>
    OpenCV 在 Linux 上的 python 与 anaconda 无法正常工作.收到未实现 cv2.imshow() 的错误
    查看>>
    Opencv 完美配置攻略 2014 (Win8.1 + Opencv 2.4.8 + VS 2013)上
    查看>>
    opencv 模板匹配, 已解决模板过大程序不工作的bug
    查看>>
    OpenCV 错误:(-215)size.width>0 &&函数imshow中的size.height>0
    查看>>
    opencv&Python——多种边缘检测
    查看>>
    opencv&python——高通滤波器和低通滤波器
    查看>>
    OpenCV+Python识别车牌和字符分割的实现
    查看>>
    OpenCV-Python接口、cv和cv2的性能比较
    查看>>
    OpenCV/Python/dlib眨眼检测
    查看>>
    opencv1-加载、修改、保存图像
    查看>>
    opencv10-形态学操作
    查看>>
    opencv11-提取水平直线和垂直直线
    查看>>
    opencv12-图像金字塔
    查看>>