0x01 发送网页请求

在python项目中引入一个requests库,用来发送网页请求

1
2
3
4
import requests
import re
import os
#os是操作系统库,re是正则表达式库

复制蔚蓝档案wiki的网址,

1
url1 = "https://www.gamekee.com/ba/"

有的网站会有基础的反爬检测,通过你请求的user-agent来测试你是不是爬虫的,虽然wiki这里没有反爬检测,如果遇到这种检测的话,可以手动更换user-agent来绕过,如下图。

image-20240421103500458

1
2
3
4
5
6
7
8
import requests
url1 = "https://www.gamekee.com/ba/"
headers = {'User-Agent' :
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'}

response = requests.get(url1, headers = headers)
print(response.request)
#返回 <PreparedRequest [GET]> 表示成功请求

0x02 解析网页内容

我们的任务是

image-20240421103659412

进入如下图的所有学生的网页,然后再是下载图片,所以我们可以先根据正则把这些网页都搜索下来,最后循环依次进入。

1
2
"""解析网页"""
temp_urls = re.findall('<a href="(.*?)" title=".*?" class="item" data-v-df5d5428>.*?</a>',html)

这里有个让我很难绷的事情,就是用此法读取出来的字符串,会带有一大段的前缀,只有最后一小部分是需要的网址,我这里用日奈举例子。

1
2
temp_urls = re.findall('<a href="(.*?)" title="日奈" class="item" data-v-df5d5428>.*?</a>',html)
print(temp_urls)

image-20240421132658921

代码返回这些字符串,只有最后一段是我们所需要的,不知道是什么反爬手段,一次获取就获取一堆。

我们这里用分割法把这些字符串分割开,只取最后一块网址。

1
2
3
4
5
6
7
8
9
10
11
12
13
"""解析网页"""
temp_urls = re.findall('<a href="(.*?)" title=".*?" class="item" data-v-df5d5428>.*?</a>',html)
"""读取特定角色的网页"""
get_url_or_not = False
for url in temp_urls:
#从59934到603140
part_of_url = url.split('<a href="')[-1]
if re.search('59934',part_of_url):
get_url_or_not = True
if get_url_or_not:
urls.append( 'https://www.gamekee.com'+ part_of_url )
if re.search('603140',part_of_url):
get_url_or_not = False

如上代码,我们发现角色的网址是59934到603140,写一个if语句判断,然后用split('<a href="')分割得到网址。

0x03 获取网页内图片

image-20240421143135651

分析网页的图片源的源码,匹配前后红色部分,其余部分用.*?任意非贪婪匹配来代替,然后提取图片中蓝色部分的图片源

1
2
3
4
5
6
7
8
9
10
11
url = urls[0]
#这里的urls可以是之前获取的网址列表,这里用单个测试防止把网站爬崩
response = requests.get(url, headers = headers)
html = response.text
# print(html)
download_url = re.findall('data-real=".*?" src="(.*?)">.*?解锁等级',html)[0]
print("https:" + download_url)
file_name = '0'

#正常输出
#https://cdnimg.gamekee.com/wiki2.0/images/w_3156/h_2214/829/43637/2022/7/19/823498.png

按照这个思路把循环代码补全,记得加上time.sleep,缓冲一下速度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
"""生成打包图片的文件夹"""
dir_name = r'F:\picture_bed\My_own_pic_bed\img'
if not os.path.exists(dir_name):
os.mkdir(dir_name)

"""解析图片"""
for file_name, url in enumerate(urls):
time.sleep(0.5)
#解析出图片的源
response = requests.get(url, headers = headers)
html = response.text
#处理正则匹配的未知异常
try:
#这个匹配方法,如果有两张记忆大厅图片,会优先下载第一张,但是我们一般是要第二张,这里懒得改了
#按理来说,只要把这个索引从[0]改成[1]就可以了,试了一下不行,反正就三张特例,手动修改就好了
#这里第51张,作者因为偷懒了,导致我们匹配失败
download_url = "https:" + re.findall('data-real=".*?" src="(.*?)".*?解锁等级',html)[0]
except:
continue
#请求下载图片
response = requests.get(download_url, headers = headers)
#保存到文件夹
path = dir_name + '\\' + str(file_name) + '.png'
with open(path, 'wb') as f:
f.write(response.content)

image-20240421154958017

(这里我解锁等级呢,唯一一张匹配失败的图片)

0x04 导入到html文件生成随机图床

image-20240421155311077

这里成功把图片弄到图床文件夹后,根据这些图片的名字,用python写个脚本导出图片名字列表,然后填入到写好的html文件中,随机重定向就能生成随机图床了。

1
2
3
4
5
6
7
<!-- 用于重定向的html文件 -->
<script language="javascript" type="text/javascript">
var a = [这里放网址]
var item = a[Math.floor(Math.random() * a.length)];
var b = String(item)
window.location.href = b;
</script>

由于我不懂html语法,这个脚本是网上抄的,以后有机会再学学看,我这里就先傻瓜式帮运网址名了。

1
2
3
4
5
urls = []
for i in range(177):
urls.append("https://my-own-pic-bed.pages.dev/img/" + str(i) + ".png")
print(urls)
#打印图片网址名,然后复制到html脚本里

0x05 部署到github

image-20240421160324466

在这个文件夹里打开git bash,部署,第一次可能有点久

1
2
3
4
5
# 将更改提交
git add .
git commit -m "更新图片"
# 推送至github仓库
git push

然后直接访问下面的网址

1
my-own-pic-bed.pages.dev/rand.html

image-20240421161703870

成功了。