妹系Galgame游戏资源合集-记一次资源爬取过程 - 闲聊吹水论坛 - 聊天 - Hikarinagi
11

妹系Galgame游戏资源合集-记一次资源爬取过程

起因是这样的,在一个qq群里看到了这样一个一抹多列表,我就想把对应的资源都找出来,但是如果手动一个一个地去搜的话,那可太麻烦了,于是有了接下来的操作

d2b5ca33bd20241025205311

 

角色名转游戏名

首先要做的是找到游戏角色是哪个游戏里的,我第一个想到的是调用gpt的api

d2b5ca33bd20241025205345

不过在我尝试了一下之后,就发现他在gal这方面简直就是在胡扯

于是放弃了这条路线,转而想到到了2dfan,这是一个galgame的补丁分享平台,我尝试调用它的搜索接口来搜索角色,很好这样是能查到具体游戏名字的

d2b5ca33bd20241025205446

但是每次会搜出很多结果来,而且我们只需要游戏名字,我准备通过截取
网页源码中这部分,把标题提取出来

d2b5ca33bd20241025205514

但是这样我在实际操作的时候截取没有成功,于是我观察了下网页源码,换了另一个思路

游戏标题几乎都是日文,我看了网页源码中出现的第一个日文文本恰好就是游戏标题 所以直接用正则匹配第一个日文文本 很成功的把游戏标题搞到了

d2b5ca33bd20241025205542

那么对于原文只需要根据、分割开每个角色调用这个方法就可以获得一份完整的角色和游戏名单了
当然会有几个获取失败的,人工补全后就可以了

d2b5ca33bd20241025205606

游戏名转游戏资源

得到了游戏名单,下一步就是获取游戏资源,既然需要支持日文标题搜索,那我想到了qingju青桔网这个平台,于是开始尝试

d2b5ca33bd20241025205633

直接上搜索请求发现,青桔网使用了Cloudflare盾,被拦截了

d2b5ca33bd20241025205726

既然上了盾,那就上矛
直接用cloudscraper而不是request来请求,并且套上代理
截取 <article class=“excerpt excerpt-1”.*?热门文章
匹配文章格式链接
成功获取到帖子链接

有了帖子链接就可以获得资源链接,直接正则匹配百度网盘链接就可以了

d2b5ca33bd20241025205825

那么我们把这两部分代码合并在一起,就可以实现
原来的妹控发癫文本→角色名转游戏名字→游戏名字转游戏资源

转换后的资源分享

 
妹控gal资源.txt
txt文件
40.9K

打开乱码可以尝试mt管理器打开,或者检查是否为utf-8读取

代码展示

1.游戏角色转游戏名称(需要代理)

import requests
import re

names = "和泉妃爱"
#(支持列表,以、分割)
name_list = names.split("、")

def find_japanese_text(html):
    
    match = re.search(r'[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FAF]+(?:[×*][\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FAF]+)*', html)
    return match.group(0) if match else None


for name in name_list:
    url = f"https://2dfan.com/subjects/search?keyword={name}"
    response = requests.get(url)

    if response.status_code == 200:
        
        html = response.text
        
        
        game_name = find_japanese_text(html)
        if game_name:
            print(f"{name}: {game_name}")
        else:
            print(f"{name}: 游戏名未找到")
    else:
        print(f"{name}: 请求失败,状态码 {response.status_code}")
2.游戏名称转游戏资源(需要代理)
(不稳定,有时需要执行多次)


import cloudscraper
import re

scraper = cloudscraper.create_scraper()


print("爱来自荷包蛋的新垣绫濑\n当前版本v0.3")
game_name = input("请输入游戏名称:")
print("\n")
url = f'https://spare.qingju.org/?s={game_name}'

page_number = 1
while True:
    print(f"正在查询第 {page_number} 页...")
    response = scraper.get(url)

    if response.ok:
        html_text = response.text
        pattern = r'(<article class="excerpt excerpt-1".*?热门文章)'

        match = re.search(pattern, html_text, re.DOTALL)

        if match:
            extracted_content = match.group(1)
            
            pattern = r'https://spare\.qingju\.org/\d+\.html'
            links = re.findall(pattern, extracted_content)
            
            unique_links = list(set(links))
            for link in unique_links:
                page_response = scraper.get(link)
                if page_response.ok:
                    page_html = page_response.text
                    
                    title_pattern = r'<title>(.*?)</title>'
                    title_match = re.search(title_pattern, page_html)
                    title = title_match.group(1).replace('青桔网', '解压码qingju').replace('青桔 网', '解压码qingju') if title_match else None
                    
                    baidu_link_pattern = r'https://pan\.baidu\.com/[^\s"]+'
                    baidu_links = re.findall(baidu_link_pattern, page_html)

                    if baidu_links: 
                        print("新垣绫濑帮你找到游戏啦:")
                        print(f'{title}')
                        for baidu_link in baidu_links:
                            print(baidu_link)
                        print('---')

        if '下一页' in html_text:
            page_number += 1
            url = f'https://spare.qingju.org/page/{page_number}?s={game_name}'
        else:
            print("\n没有更多页面了。")
            break
    else:
        print("请求失败,无法获取数据。")
        break

 

请登录后发表评论

    • yuki的头像 - Hikarinagi光之友yuki徽章-鹰仓杏铃 - Hikarinagi等级-LV6 - Hikarinagi超级版主1
      • ayase520的头像 - Hikarinagiayase520等级-LV1 - Hikarinagi作者1