本文共 3777 字,大约阅读时间需要 12 分钟。
作为一名技术爱好者,我最近对王者荣耀的壁纸进行了爬取,整个过程从抓包到最终完成下载其实并不复杂,但确实需要仔细分析和优化。以下是我从抓包到最终实现爬虫下载的详细过程。
首先,我打开了王者荣耀的官方壁纸网站,使用F12键打开控制台工具,对页面进行抓包。通过这个方法,我可以看到前端发送的所有请求细节。
在抓包过程中,我发现王者荣耀的壁纸下载页面使用了JSONP格式的请求。这意味着每个请求都带有一个特定的callback参数,这在处理时需要特别注意。为了避免处理复杂的JSONP数据,我直接在代码中删除了callback参数。
通过分析请求的URL,我发现主要参数包括activityId、sVerifyCode、iListNum、totalpage以及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/