上篇文章讲了如何爬取BangDream的游戏卡面,同样作为抽卡音乐游戏的lovelive也拥有者极其可爱的美少女与好看的游戏卡面,lovelive的游戏分为sif和as,其中sif将在3月底关服,取而代之的将是sif2,sif是完完全全的抽卡音乐游戏,而as与sif不同,本质可以看作是一款抽卡rpg类游戏,sif的卡面基本都为竖屏,而as的卡面都为横屏且质量更高,我们这里来爬取as的卡面,as的卡牌数据站为https://idol.st/allstars/cards/,加载慢需要翻墙

我们随便打开一张卡牌看一下URL地址

可以看到卡牌对应的编号就是数字,该网站一共收录了864张卡牌数据,我们点开的这张卡的编号为882,这说明肯定有一些编号是找不到对应的卡牌的,我们可以从1到最新的885(由于会不断更新所以需要自己手动去查看最新一张卡牌的编号)去遍历爬取,根据响应的内容就可以知道哪些编号没有对应的卡牌,不过也没有必要把这些编号找出来,没有响应的信息直接跳过就好了,我们直接来爬取内容,为了节省流量我们只爬取上面这张882的信息,在爬之前我们把卡牌里的图片打开,看一下具体图片的访问URL


可以看出,as卡牌卡面的URL很复杂,每一张都在名称后面加了一个随机的字符串,因此我们无法通过找规律来爬取
不过我们可以试着通过上面的卡牌内容来看看其中是否包含了卡面的URL,虽然卡面的URL不规律,但是卡牌的URL是规律的

通过定位可以看到右边的html元素中给出了卡面的URL,不过打开后发现这个URL中的卡面是不清晰的,且URL跟之前打开的也对不上,我们需要清晰的卡面

这样我们就可以得到清晰的卡面URL,我们对比一下清晰卡面和不清晰卡面的URL:
只看路径,可以看到清晰的卡面是被放大了两倍的,相对不清晰卡面多了一层/2x/路径,因此还是利用正则表达式把这个URL提取出来
1 2 3 4 5 6 7 8 9 10
| import requests import re headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36', } data = requests.get('https://idol.st/ajax/allstars/card/' + str(882) + '/', headers=headers); html = str(data.text) cards = re.findall('<a href="//i.idol.st/u/card/art/2x/(.*?)" target', html) for card in cards: print('https://i.idol.st/u/card/art/2x/' + card)
|
输出结果为:
1 2 3 4
| https://i.idol.st/u/card/art/2x/882UR-Nakasu-Kasumi-I-Won-t-Give-Up-until-the-Last-Second-Buds-Blossoms-and-SVY8xn.png https://i.idol.st/u/card/art/2x/882UR-Nakasu-Kasumi-I-Won-t-Give-Up-until-the-Last-Second-Buds-Blossoms-and-JGHHUP.png https://i.idol.st/u/card/art/2x/882UR-Nakasu-Kasumi-I-Won-t-Give-Up-until-the-Last-Second-Buds-Blossoms-and-SVY8xn.png https://i.idol.st/u/card/art/2x/882UR-Nakasu-Kasumi-I-Won-t-Give-Up-until-the-Last-Second-Buds-Blossoms-and-JGHHUP.png
|
这说明卡牌上有两组地方我们可以进入到觉醒前后清晰卡面,我们只保留一组即可,只保留前两项活后两项,就可以得到清晰卡面的URL了,因为每张卡牌的格局都是一样的,所以编号从1到885的所有卡牌都可以通过这种方法得到对应的清晰卡面URL,后续有新卡修改编号范围即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import requests import re headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36', } save_dir = './llas/' for i in range(1, 886): data = requests.get('https://idol.st/ajax/allstars/card/' + str(i) + '/', headers=headers) html = str(data.text) cards = re.findall('<a href="//i.idol.st/u/card/art/2x/(.*?)" target', html) if (len(cards) == 0): continue data1 = requests.get('https://i.idol.st/u/card/art/2x/' + cards[0], headers=headers) data2 = requests.get('https://i.idol.st/u/card/art/2x/' + cards[1], headers=headers) with open(save_dir + cards[0], 'wb') as f: f.write(data1.content) f.close() print(cards[0] + '保存成功') with open(save_dir + cards[1], 'wb') as f: f.write(data2.content) f.close() print(cards[1] + '保存成功')
|
下载后会发现有些卡面是没有清晰版的,如果需要就自行对代码修改即可